diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000..fdb0e58b6 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,63 @@ +version: 1 +labels: + - label: "size-XS" + size: + exclude-files: ["poetry.lock"] + below: 10 + - label: "size-S" + size: + exclude-files: ["poetry.lock"] + above: 9 + below: 100 + - label: "size-M" + size: + exclude-files: ["poetry.lock"] + above: 100 + below: 500 + - label: "size-L" + size: + exclude-files: ["poetry.lock"] + above: 499 + below: 1000 + - label: "size-XL" + size: + exclude-files: ["poetry.lock"] + above: 999 + - label: "airflow" + files: + - "^src/airflow/.*" + - label: "Documentation" + files: + - "^docs/.*" + - label: "Dataset" + files: + - "^src/gentropy/dataset/.*" + - label: "Method" + files: + - "^src/gentropy/method/.*" + - label: "Datasource" + files: + - "^src/gentropy/datasource/.*" + - label: "Step" + files: + - "^src/gentropy/[a-zA-Z]\\w+\\.py" + - label: "Feature" + title: "^feat.*" + - label: "Bug" + title: "^fix.*" + - label: "Refactor" + title: "^refactor.*" + - label: "Chore" + title: "^chore.*" + - label: "CI" + title: "^ci.*" + - label: "Test" + title: "^test.*" + - label: "Documentation" + title: "^docs.*" + - label: "Performance" + title: "^perf.*" + - label: "Build" + title: "^build.*" + - label: "Revert" + title: "^revert.*" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..aca51c6ea --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ +## ✨ Context + + + +## πŸ›  What does this PR implement + + + +## πŸ™ˆ Missing + + + +## 🚦 Before submitting + +- [ ] Do these changes cover one single feature (one change at a time)? +- [ ] Did you read the [contributor guideline](https://opentargets.github.io/gentropy/development/contributing/#contributing-checklist)? +- [ ] Did you make sure to update the documentation with your changes? +- [ ] Did you make sure there is no commented out code in this PR? +- [ ] Did you follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) standards in PR title and commit messages? +- [ ] Did you make sure the branch is up-to-date with the `dev` branch? +- [ ] Did you write any new necessary tests? +- [ ] Did you make sure the changes pass local tests (`make test`)? +- [ ] Did you make sure the changes pass pre-commit rules (e.g `poetry run pre-commit run --all-files`)? diff --git a/.github/workflows/artifact.yml b/.github/workflows/artifact.yml new file mode 100644 index 000000000..2aa634a7e --- /dev/null +++ b/.github/workflows/artifact.yml @@ -0,0 +1,85 @@ +name: Build and Push to Artifact Registry + +"on": + push: + branches: ["*"] + tags: ["*"] + +env: + PROJECT_ID: open-targets-genetics-dev + REGION: europe-west1 + GAR_LOCATION: europe-west1-docker.pkg.dev/open-targets-genetics-dev + REPOSITORY: gentropy-app + PYTHON_VERSION_DEFAULT: "3.10.8" + +jobs: + build-push-artifact: + runs-on: ubuntu-latest + steps: + - name: "Checkout" + uses: "actions/checkout@v3" + + - name: "auth" + uses: "google-github-actions/auth@v2" + with: + credentials_json: "${{ secrets.SERVICE_ACCOUNT_KEY }}" + + - name: "Set up Cloud SDK" + uses: "google-github-actions/setup-gcloud@v2" + + - name: "Use gcloud CLI" + run: "gcloud info" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: "Docker auth" + run: |- + gcloud auth configure-docker ${{ env.REGION }}-docker.pkg.dev --quiet + + - name: Quick Docker build (gentropy only, AMD64 only, with layer cache) + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: true + tags: "${{ env.GAR_LOCATION }}/${{ env.REPOSITORY }}/gentropy:${{ github.ref_name }}" + context: . + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push gentropy image + if: github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/v') + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64,linux/arm64 + push: true + tags: "${{ env.GAR_LOCATION }}/${{ env.REPOSITORY }}/gentropy:${{ github.ref_name }}" + context: . + + - name: Build and push VEP image + if: github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/v') + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: true + tags: "${{ env.GAR_LOCATION }}/${{ env.REPOSITORY }}/custom_ensembl_vep:${{ github.ref_name }}" + context: . + file: "src/vep/Dockerfile" + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ env.PYTHON_VERSION_DEFAULT }} + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Build and push spark cluster dependencies + run: | + make build diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 000000000..8e9e6f92e --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,14 @@ +name: Label PRs + +"on": + - pull_request + - issues + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: srvaroa/labeler@master + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 5fb541572..f27ae499e 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -17,6 +17,11 @@ jobs: uses: actions/setup-python@v5 with: python-version: 3.10.8 + - name: Set up Java + uses: actions/setup-java@v4 + with: + java-version: "8" + distribution: "temurin" - name: Install and configure Poetry uses: snok/install-poetry@v1 with: diff --git a/.github/workflows/pr_release_trigger.yaml b/.github/workflows/pr_release_trigger.yaml index 27c4d7dec..d97828754 100644 --- a/.github/workflows/pr_release_trigger.yaml +++ b/.github/workflows/pr_release_trigger.yaml @@ -15,7 +15,7 @@ jobs: source_branch: "dev" destination_branch: "main" pr_title: "chore: trigger release process" - pr_body: ":warning: *This PR requires a MERGE or REBASE COMMIT (Don't squash!)*" + pr_body: ":warning: *This PR requires a MERGE COMMIT (Don't squash!)*" pr_label: "auto-pr" pr_draft: false pr_allow_empty: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 385e0d9ec..4eb48b992 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -23,22 +23,35 @@ jobs: contents: write steps: + # NOTE: commits using GITHUB_TOKEN does not trigger workflows + - uses: actions/create-github-app-token@v1 + id: trigger-token + with: + app-id: ${{ vars.TRIGGER_WORKFLOW_GH_APP_ID}} + private-key: ${{ secrets.TRIGGER_WORKFLOW_GH_APP_KEY }} - uses: actions/checkout@v4 with: fetch-depth: 0 repository: opentargets/gentropy token: ${{ secrets.GITHUB_TOKEN }} + persist-credentials: false - name: Python Semantic Release id: semrelease - uses: python-semantic-release/python-semantic-release@master + # v9.6.0 is required due to the python v3.12 in the newer version of semantic release action which + # breaks the poetry build command. + uses: python-semantic-release/python-semantic-release@v9.6.0 with: - github_token: ${{ secrets.GITHUB_TOKEN }} + github_token: ${{ steps.trigger-token.outputs.token }} - name: Publish package to GitHub Release uses: python-semantic-release/upload-to-gh-release@main if: ${{ steps.semrelease.outputs.released }} == 'true' with: + # NOTE: allow to start the workflow when push action on tag gets executed + # requires using GH_APP to authenitcate, otherwise push authorised with + # the GITHUB_TOKEN does not trigger the tag artifact workflow. + # see https://github.com/actions/create-github-app-token github_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ steps.semrelease.outputs.tag }} diff --git a/.gitignore b/.gitignore index 07c8bef82..b62418654 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ src/airflow/logs/* !src/airflow/logs/.gitkeep site/ .env +.coverage* +wandb/ +hail*.log diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 45736c8af..e62a9d790 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,9 +1,12 @@ +default_language_version: + python: python3.10 ci: autoupdate_commit_msg: "chore: pre-commit autoupdate" autofix_commit_msg: "chore: pre-commit auto fixes [...]" + skip: [poetry-lock] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.2 + rev: v0.7.1 hooks: - id: ruff args: @@ -12,13 +15,12 @@ repos: files: ^((gentropy|utils|tests)/.+)?[^/]+\.py$ - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer exclude: "CHANGELOG.md" - id: debug-statements - - id: check-merge-conflict - id: check-case-conflict - id: check-json exclude: (.vscode|.devcontainer) @@ -56,14 +58,14 @@ repos: exclude: "CHANGELOG.md" - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook - rev: v9.11.0 + rev: v9.18.0 hooks: - id: commitlint - additional_dependencies: ["@commitlint/config-conventional"] + additional_dependencies: ["@commitlint/config-conventional@18.6.3"] stages: [commit-msg] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.8.0" + rev: "v1.13.0" hooks: - id: mypy args: @@ -79,7 +81,7 @@ repos: - "--disallow-untyped-defs" - repo: https://github.com/econchick/interrogate - rev: 1.5.0 + rev: 1.7.0 hooks: - id: interrogate args: [--verbose] @@ -96,6 +98,13 @@ repos: - id: beautysh - repo: https://github.com/jsh9/pydoclint - rev: 0.4.1 + rev: 0.5.9 hooks: - id: pydoclint + + - repo: https://github.com/python-poetry/poetry + rev: "1.8.0" + hooks: + - id: poetry-check + - id: poetry-lock + args: ["--no-update"] diff --git a/.vscode/settings.json b/.vscode/settings.json index aaafda97f..ecc456889 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,5 +25,8 @@ "python.testing.pytestEnabled": true, "mypy-type-checker.severity": { "error": "Information" - } + }, + "yaml.extension.recommendations": false, + "workbench.remoteIndicator.showExtensionRecommendations": false, + "extensions.ignoreRecommendations": true } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..ff8706b62 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM python:3.10-bullseye + +RUN apt-get update \ + && apt-get clean \ + && apt-get install -y openjdk-11-jdk \ + && rm -rf /var/lib/apt/lists/* + +ENV POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_IN_PROJECT=1 \ + POETRY_VIRTUALENVS_CREATE=1 \ + POETRY_CACHE_DIR=/tmp/poetry_cache \ + JAVA_HOME=/usr + +RUN pip install poetry==1.7.1 +WORKDIR /app + +COPY pyproject.toml poetry.lock ./ +RUN touch README.md + +RUN poetry config installer.max-workers 10 +RUN poetry install --without dev,docs,tests --no-root --no-interaction --no-ansi -vvv && rm -rf $POETRY_CACHE_DIR + +COPY src ./src + +RUN poetry install --without dev,docs,tests + +ENTRYPOINT ["poetry", "run", "gentropy"] diff --git a/Makefile b/Makefile index 3057f95ce..1d79d35fd 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ PROJECT_ID ?= open-targets-genetics-dev REGION ?= europe-west1 -APP_NAME ?= $$(cat pyproject.toml| grep -m 1 "name" | cut -d" " -f3 | sed 's/"//g') -VERSION_NO ?= $$(poetry version --short) -CLEAN_VERSION_NO := $(shell echo "$(VERSION_NO)" | tr -cd '[:alnum:]') -BUCKET_NAME=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/ -BUCKET_COMPOSER_DAGS=gs://europe-west1-ot-workflows-fe147745-bucket/dags/ +APP_NAME ?= $$(cat pyproject.toml | grep -m 1 "name" | cut -d" " -f3 | sed 's/"//g') +REF ?= $$(git rev-parse --abbrev-ref HEAD) +PACKAGE_VERSION ?= $$(poetry version --short) +CLEAN_PACKAGE_VERSION := $(shell echo "$(PACKAGE_VERSION)" | tr -cd '[:alnum:]') +BUCKET_NAME=gs://genetics_etl_python_playground/initialisation/${APP_NAME}/${REF} .PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST)) @@ -22,7 +22,7 @@ setup-dev: ## Setup development environment check: ## Lint and format code @echo "Linting API..." - @poetry run ruff src/gentropy . + @poetry run ruff check src/gentropy . @echo "Linting docstrings..." @poetry run pydoclint --config=pyproject.toml src @poetry run pydoclint --config=pyproject.toml --skip-checking-short-docstrings=true tests @@ -38,31 +38,33 @@ build-documentation: ## Create local server with documentation create-dev-cluster: build ## Spin up a simple dataproc cluster with all dependencies for development purposes @echo "Creating Dataproc Dev Cluster" @gcloud config set project ${PROJECT_ID} - @gcloud dataproc clusters create "ot-genetics-dev-${CLEAN_VERSION_NO}" \ + @gcloud dataproc clusters create "ot-genetics-dev-${CLEAN_PACKAGE_VERSION}-$(USER)" \ --image-version 2.1 \ --region ${REGION} \ --master-machine-type n1-standard-16 \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/install_dependencies_on_cluster.sh \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/gentropy-${VERSION_NO}-py3-none-any.whl,CONFIGTAR=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/config.tar.gz" \ - --single-node \ + --initialization-actions=$(BUCKET_NAME)/install_dependencies_on_cluster.sh \ + --metadata="PACKAGE=$(BUCKET_NAME)/${APP_NAME}-${PACKAGE_VERSION}-py3-none-any.whl" \ + --secondary-worker-type spot \ + --worker-machine-type n1-standard-4 \ + --worker-boot-disk-size 500 \ + --autoscaling-policy="projects/${PROJECT_ID}/regions/${REGION}/autoscalingPolicies/otg-etl" \ --optional-components=JUPYTER \ - --enable-component-gateway + --enable-component-gateway \ + --max-idle=60m make update-dev-cluster: build ## Reinstalls the package on the dev-cluster @echo "Updating Dataproc Dev Cluster" @gcloud config set project ${PROJECT_ID} - gcloud dataproc jobs submit pig --cluster="ot-genetics-dev-${CLEAN_VERSION_NO}" \ + gcloud dataproc jobs submit pig --cluster="ot-genetics-dev-${CLEAN_PACKAGE_VERSION}" \ --region ${REGION} \ --jars=${BUCKET_NAME}/install_dependencies_on_cluster.sh \ -e='sh chmod 750 $${PWD}/install_dependencies_on_cluster.sh; sh $${PWD}/install_dependencies_on_cluster.sh' build: clean ## Build Python package with dependencies @gcloud config set project ${PROJECT_ID} - @echo "Packaging Code and Dependencies for ${APP_NAME}-${VERSION_NO}" + @echo "Packaging Code and Dependencies for ${APP_NAME}-${PACKAGE_VERSION}" @poetry build - @tar -czf dist/config.tar.gz config/ - @echo "Uploading to Dataproc" - @gsutil cp src/gentropy/cli.py ${BUCKET_NAME} - @gsutil cp ./dist/${APP_NAME}-${VERSION_NO}-py3-none-any.whl ${BUCKET_NAME} - @gsutil cp ./dist/config.tar.gz ${BUCKET_NAME} - @gsutil cp ./utils/install_dependencies_on_cluster.sh ${BUCKET_NAME} + @echo "Uploading to ${BUCKET_NAME}" + @gsutil cp src/${APP_NAME}/cli.py ${BUCKET_NAME}/ + @gsutil cp ./dist/${APP_NAME}-${PACKAGE_VERSION}-py3-none-any.whl ${BUCKET_NAME}/ + @gsutil cp ./utils/install_dependencies_on_cluster.sh ${BUCKET_NAME}/ diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index 31939863f..000000000 --- a/config/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Reference configuration yamls.""" - -from __future__ import annotations diff --git a/config/datasets/ot_gcp.yaml b/config/datasets/ot_gcp.yaml deleted file mode 100644 index 54c7dd2fe..000000000 --- a/config/datasets/ot_gcp.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# Release specific configuration: -release_version: "24.01" -dev_version: XX.XX -release_folder: gs://genetics_etl_python_playground/releases/${datasets.release_version} - -inputs: gs://genetics_etl_python_playground/input -static_assets: gs://genetics_etl_python_playground/static_assetss -outputs: gs://genetics_etl_python_playground/output/python_etl/parquet/${datasets.dev_version} - -## Datasets: -gwas_catalog_dataset: gs://gwas_catalog_data -# Ingestion input files: -gwas_catalog_associations: ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_associations_ontology_annotated.tsv -gwas_catalog_studies: - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_download_studies.tsv - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_unpublished_studies.tsv -gwas_catalog_ancestries: - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_download_ancestries.tsv - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_unpublished_ancestries.tsv -gwas_catalog_sumstats_lut: ${datasets.gwas_catalog_dataset}/curated_inputs/harmonised_list.txt -gwas_catalog_study_curation: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_study_curation.tsv -# Harmonised summary statistics list: -gwas_catalog_summary_stats_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_harmonised_summary_statistics_list.txt -# Inclusion lists: -gwas_catalog_curated_inclusion_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_curation_included_studies -gwas_catalog_summary_statistics_inclusion_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_summary_statistics_included_studies -# Ingestion output folders: -gwas_catalog_study_index: ${datasets.gwas_catalog_dataset}/study_index -gwas_catalog_study_locus_folder: ${datasets.gwas_catalog_dataset}/study_locus_datasets -gwas_catalog_credible_set_folder: ${datasets.gwas_catalog_dataset}/credible_set_datasets - -# Input datasets -chain_37_38: ${datasets.static_assets}/grch37_to_grch38.over.chain -vep_consequences: ${datasets.static_assets}/vep_consequences.tsv -anderson: ${datasets.static_assets}/andersson2014/enhancer_tss_associations.bed -javierre: ${datasets.static_assets}/javierre_2016_preprocessed -jung: ${datasets.static_assets}/jung2019_pchic_tableS3.csv -thurman: ${datasets.static_assets}/thurman2012/genomewideCorrs_above0.7_promoterPlusMinus500kb_withGeneNames_32celltypeCategories.bed8.gz -target_index: ${datasets.release_folder}/targets # OTP 23.12 data - -gene_interactions: ${datasets.release_folder}/interaction # OTP 23.12 data -eqtl_catalogue_paths_imported: ${datasets.inputs}/preprocess/eqtl_catalogue/tabix_ftp_paths_imported.tsv -finngen_finemapping_results_path: ${datasets.inputs}/Finngen_susie_finemapping_r10/full -finngen_finemapping_summaries_path: ${datasets.inputs}/Finngen_susie_finemapping_r10/Finngen_susie_credset_summary_r10.tsv - -# Dev output datasets -variant_annotation: ${datasets.outputs}/variant_annotation -study_locus: ${datasets.outputs}/study_locus -summary_statistics: ${datasets.outputs}/summary_statistics -study_locus_overlap: ${datasets.outputs}/study_locus_overlap -susie_finemapping: ${datasets.outputs}/finngen_susie_finemapping - -ld_index: ${datasets.outputs}/ld_index -catalog_study_index: ${datasets.study_index}/catalog -catalog_study_locus: ${datasets.study_locus}/catalog_study_locus - -from_sumstats_study_locus: ${datasets.study_locus}/from_sumstats -from_sumstats_pics: ${datasets.credible_set}/from_sumstats - -# ETL output datasets: -l2g_gold_standard_curation: ${datasets.release_folder}/locus_to_gene_gold_standard.json -l2g_model: ${datasets.release_folder}/locus_to_gene_model -l2g_predictions: ${datasets.release_folder}/locus_to_gene_predictions -colocalisation: ${datasets.release_folder}/colocalisation -study_index: ${datasets.release_folder}/study_index -variant_index: ${datasets.release_folder}/variant_index -credible_set: ${datasets.release_folder}/credible_set -gene_index: ${datasets.release_folder}/gene_index -v2g: ${datasets.release_folder}/variant_to_gene diff --git a/config/ot_config.yaml b/config/ot_config.yaml deleted file mode 100644 index 7f28a58d6..000000000 --- a/config/ot_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - config - - datasets: ot_gcp - - _self_ - - override step/session: dataproc diff --git a/config/step/ot_colocalisation.yaml b/config/step/ot_colocalisation.yaml deleted file mode 100644 index 4433595ef..000000000 --- a/config/step/ot_colocalisation.yaml +++ /dev/null @@ -1,6 +0,0 @@ -defaults: - - colocalisation - -credible_set_path: ${datasets.credible_set} -study_index_path: ${datasets.study_index} -coloc_path: ${datasets.colocalisation} diff --git a/config/step/ot_eqtl_catalogue.yaml b/config/step/ot_eqtl_catalogue.yaml deleted file mode 100644 index 141c94ee3..000000000 --- a/config/step/ot_eqtl_catalogue.yaml +++ /dev/null @@ -1,6 +0,0 @@ -defaults: - - eqtl_catalogue - -eqtl_catalogue_paths_imported: ${datasets.eqtl_catalogue_paths_imported} -eqtl_catalogue_study_index_out: ${datasets.eqtl_catalogue_study_index_out} -eqtl_catalogue_summary_stats_out: ${datasets.eqtl_catalogue_summary_stats_out} diff --git a/config/step/ot_finngen_finemapping_ingestion.yaml b/config/step/ot_finngen_finemapping_ingestion.yaml deleted file mode 100644 index 46aa497fa..000000000 --- a/config/step/ot_finngen_finemapping_ingestion.yaml +++ /dev/null @@ -1,7 +0,0 @@ -defaults: - - finngen_finemapping_ingestion - -finngen_finemapping_results_path: ${datasets.finngen_finemapping_results_path} -finngen_finemapping_summaries_path: ${datasets.finngen_finemapping_summaries_path} -finngen_release_prefix: ${datasets.finngen_release_prefix} -finngen_finemapping_out: ${datasets.finngen_finemapping_out} diff --git a/config/step/ot_finngen_studies.yaml b/config/step/ot_finngen_studies.yaml deleted file mode 100644 index c2657bbf5..000000000 --- a/config/step/ot_finngen_studies.yaml +++ /dev/null @@ -1,4 +0,0 @@ -defaults: - - finngen_studies - -finngen_study_index_out: ??? diff --git a/config/step/ot_finngen_sumstat_preprocess.yaml b/config/step/ot_finngen_sumstat_preprocess.yaml deleted file mode 100644 index ad0e93a09..000000000 --- a/config/step/ot_finngen_sumstat_preprocess.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - finngen_sumstat_preprocess - -raw_sumstats_path: ??? -out_sumstats_path: ??? diff --git a/config/step/ot_gene_index.yaml b/config/step/ot_gene_index.yaml deleted file mode 100644 index ce5971bf9..000000000 --- a/config/step/ot_gene_index.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - gene_index - -target_path: ${datasets.target_index} -gene_index_path: ${datasets.gene_index} diff --git a/config/step/ot_gwas_catalog_ingestion.yaml b/config/step/ot_gwas_catalog_ingestion.yaml deleted file mode 100644 index fc82b82c2..000000000 --- a/config/step/ot_gwas_catalog_ingestion.yaml +++ /dev/null @@ -1,12 +0,0 @@ -defaults: - - gwas_catalog_ingestion - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_associations_file: ${datasets.gwas_catalog_associations} -catalog_sumstats_lut: ${datasets.gwas_catalog_sumstats_lut} -variant_annotation_path: ${datasets.variant_annotation} -catalog_studies_out: ${datasets.gwas_catalog_study_index} -catalog_associations_out: ${datasets.gwas_catalog_study_locus_folder}/gwas_catalog_curated_associations -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -inclusion_list_path: ${datasets.gwas_catalog_curated_inclusion_list} diff --git a/config/step/ot_gwas_catalog_study_curation.yaml b/config/step/ot_gwas_catalog_study_curation.yaml deleted file mode 100644 index 77c1d7834..000000000 --- a/config/step/ot_gwas_catalog_study_curation.yaml +++ /dev/null @@ -1,8 +0,0 @@ -defaults: - - gwas_catalog_study_curation - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_sumstats_lut: ${datasets.gwas_catalog_sumstats_lut} -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -gwas_catalog_study_curation_out: ??? diff --git a/config/step/ot_gwas_catalog_study_inclusion.yaml b/config/step/ot_gwas_catalog_study_inclusion.yaml deleted file mode 100644 index 7f3bf80b3..000000000 --- a/config/step/ot_gwas_catalog_study_inclusion.yaml +++ /dev/null @@ -1,12 +0,0 @@ -defaults: - - gwas_catalog_study_inclusion - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_associations_file: ${datasets.gwas_catalog_associations} -variant_annotation_path: ${datasets.variant_annotation} -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -harmonised_study_file: ${datasets.gwas_catalog_summary_stats_list} -criteria: ??? -inclusion_list_path: ??? -exclusion_list_path: ??? diff --git a/config/step/ot_gwas_catalog_sumstat_preprocess.yaml b/config/step/ot_gwas_catalog_sumstat_preprocess.yaml deleted file mode 100644 index d0c936807..000000000 --- a/config/step/ot_gwas_catalog_sumstat_preprocess.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - gwas_catalog_sumstat_preprocess - -raw_sumstats_path: ??? -out_sumstats_path: ??? diff --git a/config/step/ot_ld_based_clumping.yaml b/config/step/ot_ld_based_clumping.yaml deleted file mode 100644 index d02c0acdd..000000000 --- a/config/step/ot_ld_based_clumping.yaml +++ /dev/null @@ -1,7 +0,0 @@ -defaults: - - ld_based_clumping - -ld_index_path: ${datasets.ld_index} -study_locus_input_path: ??? -study_index_path: ??? -clumped_study_locus_output_path: ??? diff --git a/config/step/ot_ld_index.yaml b/config/step/ot_ld_index.yaml deleted file mode 100644 index 70dc6b5ee..000000000 --- a/config/step/ot_ld_index.yaml +++ /dev/null @@ -1,4 +0,0 @@ -defaults: - - ld_index - -ld_index_out: ${datasets.ld_index} diff --git a/config/step/ot_locus_to_gene_predict.yaml b/config/step/ot_locus_to_gene_predict.yaml deleted file mode 100644 index bd5c31b25..000000000 --- a/config/step/ot_locus_to_gene_predict.yaml +++ /dev/null @@ -1,10 +0,0 @@ -defaults: - - locus_to_gene - -run_mode: predict -model_path: ${datasets.l2g_model} -predictions_path: ${datasets.l2g_predictions} -credible_set_path: ${datasets.credible_set} -variant_gene_path: ${datasets.v2g} -colocalisation_path: ${datasets.colocalisation} -study_index_path: ${datasets.study_index} diff --git a/config/step/ot_locus_to_gene_train.yaml b/config/step/ot_locus_to_gene_train.yaml deleted file mode 100644 index d055621ca..000000000 --- a/config/step/ot_locus_to_gene_train.yaml +++ /dev/null @@ -1,17 +0,0 @@ -defaults: - - locus_to_gene - -run_mode: train -wandb_run_name: null -perform_cross_validation: false -model_path: ${datasets.l2g_model} -predictions_path: ${datasets.l2g_predictions} -credible_set_path: ${datasets.credible_set} -variant_gene_path: ${datasets.v2g} -colocalisation_path: ${datasets.colocalisation} -study_index_path: ${datasets.study_index} -gold_standard_curation_path: ${datasets.l2g_gold_standard_curation} -gene_interactions_path: ${datasets.gene_interactions} -hyperparameters: - max_depth: 5 - loss_function: binary:logistic diff --git a/config/step/ot_pics.yaml b/config/step/ot_pics.yaml deleted file mode 100644 index 851c4ca06..000000000 --- a/config/step/ot_pics.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - pics - -study_locus_ld_annotated_in: ??? -picsed_study_locus_out: ??? diff --git a/config/step/ot_variant_annotation.yaml b/config/step/ot_variant_annotation.yaml deleted file mode 100644 index 5da76b398..000000000 --- a/config/step/ot_variant_annotation.yaml +++ /dev/null @@ -1,4 +0,0 @@ -defaults: - - variant_annotation - -variant_annotation_path: ${datasets.variant_annotation} diff --git a/config/step/ot_variant_index.yaml b/config/step/ot_variant_index.yaml deleted file mode 100644 index 1625c7126..000000000 --- a/config/step/ot_variant_index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -defaults: - - variant_index - -variant_annotation_path: ${datasets.variant_annotation} -credible_set_path: ${datasets.study_locus} -variant_index_path: ${datasets.variant_index} diff --git a/config/step/ot_variant_to_gene.yaml b/config/step/ot_variant_to_gene.yaml deleted file mode 100644 index 1ac6d2fbe..000000000 --- a/config/step/ot_variant_to_gene.yaml +++ /dev/null @@ -1,14 +0,0 @@ -defaults: - - variant_to_gene - -variant_index_path: ${datasets.variant_index} -variant_annotation_path: ${datasets.variant_annotation} -gene_index_path: ${datasets.gene_index} -vep_consequences_path: ${datasets.vep_consequences} -liftover_chain_file_path: ${datasets.chain_37_38} -interval_sources: - andersson: ${datasets.anderson} - javierre: ${datasets.javierre} - jung: ${datasets.jung} - thurman: ${datasets.thurman} -v2g_path: ${datasets.v2g} diff --git a/config/step/ot_window_based_clumping.yaml b/config/step/ot_window_based_clumping.yaml deleted file mode 100644 index 0e7e0e39b..000000000 --- a/config/step/ot_window_based_clumping.yaml +++ /dev/null @@ -1,6 +0,0 @@ -defaults: - - window_based_clumping - -summary_statistics_input_path: ??? -study_locus_output_path: ??? -inclusion_list_path: ??? diff --git a/config/step/session/dataproc.yaml b/config/step/session/dataproc.yaml deleted file mode 100644 index 6ac641718..000000000 --- a/config/step/session/dataproc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - base_session - -spark_uri: yarn -write_mode: errorifexists diff --git a/docs/assets/imgs/ensembl_logo.png b/docs/assets/imgs/ensembl_logo.png new file mode 100644 index 000000000..83fd25751 Binary files /dev/null and b/docs/assets/imgs/ensembl_logo.png differ diff --git a/docs/development/airflow.md b/docs/development/airflow.md deleted file mode 100644 index ff5f7906c..000000000 --- a/docs/development/airflow.md +++ /dev/null @@ -1,124 +0,0 @@ -# Airflow configuration - -This section describes how to set up a local Airflow server which will orchestrate running workflows in Google Cloud Platform. This is useful for testing and debugging, but for production use, it is recommended to run Airflow on a dedicated server. - -## Install pre-requisites - -- [Docker](https://docs.docker.com/get-docker/) -- [Google Cloud SDK](https://cloud.google.com/sdk/docs/install) - -!!! warning macOS Docker memory allocation - - On macOS, the default amount of memory available for Docker might not be enough to get Airflow up and running. Allocate at least 4GB of memory for the Docker Engine (ideally 8GB). [More info](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#) - -## Configure Airflow access to Google Cloud Platform - -!!! warning Specifying Google Cloud parameters - - Run the next two command with the appropriate Google Cloud project ID and service account name to ensure the correct Google default application credentials are set up. - -Authenticate to Google Cloud: - -```bash -gcloud auth application-default login --project= -``` - -Create the service account key file that will be used by Airflow to access Google Cloud Platform resources: - -```bash -gcloud iam service-accounts keys create ~/.config/gcloud/service_account_credentials.json --iam-account=@appspot.gserviceaccount.com -``` - -## Set up Airflow - -Change the working directory so that all subsequent commands will work: - -```bash -cd src/airflow -``` - -### Build Docker image - -!!! note Custom Docker image for Airflow - - The custom Dockerfile built by the command below extends the official [Airflow Docker Compose YAML](https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml). We add support for Google Cloud SDK, Google Dataproc operators, and access to GCP credentials. - -```bash -docker build . --tag extending_airflow:latest -``` - -### Set Airflow user ID - -!!! note Setting Airflow user ID - - These commands allow Airflow running inside Docker to access the credentials file which was generated earlier. - -```bash -# If any user ID is already specified in .env, remove it. -grep -v "AIRFLOW_UID" .env > .env.tmp -# Add the correct user ID. -echo "AIRFLOW_UID=$(id -u)" >> .env.tmp -# Move the file. -mv .env.tmp .env -``` - -### Initialise - -Before starting Airflow, initialise the database: - -```bash -docker compose up airflow-init -``` - -Now start all services: - -```bash -docker compose up -d -``` - -Airflow UI will now be available at `http://localhost:8080/`. Default username and password are both `airflow`. - -For additional information on how to use Airflow visit the [official documentation](https://airflow.apache.org/docs/apache-airflow/stable/index.html). - -### Cleaning up - -At any time, you can check the status of your containers with: - -```bash -docker ps -``` - -To stop Airflow, run: - -```bash -docker compose down -``` - -To cleanup the Airflow database, run: - -```bash -docker compose down --volumes --remove-orphans -``` - -### Advanced configuration - -More information on running Airflow with Docker Compose can be found in the [official docs](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html). - -1. **Increase Airflow concurrency**. Modify the `docker-compose.yaml` and add the following to the x-airflow-common β†’ environment section: - - ```yaml - AIRFLOW__CORE__PARALLELISM: 32 - AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 32 - AIRFLOW__SCHEDULER__MAX_TIS_PER_QUERY: 16 - AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 1 - # Also add the following line if you are using CeleryExecutor (by default, LocalExecutor is used). - AIRFLOW__CELERY__WORKER_CONCURRENCY: 32 - ``` - -1. **Additional pip packages**. They can be added to the `requirements.txt` file. - -## Troubleshooting - -Note that when you a a new workflow under `dags/`, Airflow will not pick that up immediately. By default the filesystem is only scanned for new DAGs every 300s. However, once the DAG is added, updates are applied nearly instantaneously. - -Also, if you edit the DAG while an instance of it is running, it might cause problems with the run, as Airflow will try to update the tasks and their properties in DAG according to the file changes. diff --git a/docs/development/contributing.md b/docs/development/contributing.md index 9742d3742..acbb8f2a7 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -18,7 +18,7 @@ For Google Cloud configuration: Check that you have the `make` utility installed, and if not (which is unlikely), install it using your system package manager. -Check that you have `java` installed. +Check that you have `java` installed. To be able to use all features including hail support use java 11. ## Environment configuration @@ -26,30 +26,19 @@ Run `make setup-dev` to install/update the necessary packages and activate the d It is recommended to use VS Code as an IDE for development. -## How to run the code +## How to create gentropy step -All pipelines in this repository are intended to be run in Google Dataproc. Running them locally is not currently supported. +All gentropy steps can be invoked after successful environment configuration by running -In order to run the code: +```python +poetry run gentropy step= +``` -1. Manually edit your local `src/airflow/dags/*` file and comment out the steps you do not want to run. +1. Create a new step config in the `src/gentropy/config.py` that inherits from `StepConfig` class. -2. Manually edit your local `pyproject.toml` file and modify the version of the code. +2. Register new step configuration to `ConfigStore`. - - This must be different from the version used by any other people working on the repository to avoid any deployment conflicts, so it's a good idea to use your name, for example: `1.2.3+jdoe`. - - You can also add a brief branch description, for example: `1.2.3+jdoe.myfeature`. - - Note that the version must comply with [PEP440 conventions](https://peps.python.org/pep-0440/#normalization), otherwise Poetry will not allow it to be deployed. - - Do not use underscores or hyphens in your version name. When building the WHL file, they will be automatically converted to dots, which means the file name will no longer match the version and the build will fail. Use dots instead. - -3. Manually edit your local `src/airflow/dags/common_airflow.py` and set `OTG_VERSION` to the same version as you did in the previous step. - -4. Run `make build`. - - - This will create a bundle containing the neccessary code, configuration and dependencies to run the ETL pipeline, and then upload this bundle to Google Cloud. - - A version specific subpath is used, so uploading the code will not affect any branches but your own. - - If there was already a code bundle uploaded with the same version number, it will be replaced. - -5. Open Airflow UI and run the DAG. +3. Create a step class that holds the business logic in new file in the `src/gentropy`. ## Contributing checklist @@ -66,21 +55,26 @@ For more details on each of these steps, see the sections below. - If during development you had a question which wasn't covered in the documentation, and someone explained it to you, add it to the documentation. The same applies if you encountered any instructions in the documentation which were obsolete or incorrect. - Documentation autogeneration expressions start with `:::`. They will automatically generate sections of the documentation based on class and method docstrings. Be sure to update them for: - - Dataset definitions in `docs/python_api/datasource/STEP` (example: `docs/python_api/datasource/finngen/study_index.md`) - - Step definition in `docs/python_api/step/STEP.md` (example: `docs/python_api/step/finngen.md`) + - Datasource main page, for example: `docs/python_api/datasources/finngen/_finngen.md` + - Dataset definitions, for example: `docs/python_api/datasources/finngen/study_index.md` + - Step definition, for example: `docs/python_api/steps/finngen_sumstat_preprocess.md` ### Configuration -- Input and output paths in `config/datasets/gcp.yaml` -- Step configuration in `config/step/STEP.yaml` (example: `config/step/finngen.yaml`) +- step default configuration in the `src/gentropy/config/` `StepConfig` derived classes. ### Classes -- Dataset class in `src/gentropy/datasource/STEP` (example: `src/gentropy/datasource/finngen/study_index.py` β†’ `FinnGenStudyIndex`) -- Step main running class in `src/gentropy/STEP.py` (example: `src/gentropy/finngen.py`) +- Datasource init, for example: `src/gentropy/datasource/finngen/__init__.py` +- Dataset classes, for example: `src/gentropy/datasource/finngen/study_index.py` β†’ `FinnGenStudyIndex` +- Step main running class, for example: `src/gentropy/finngen_sumstat_preprocess.py` ### Tests -- Test study fixture in `tests/conftest.py` (example: `mock_study_index_finngen` in that module) -- Test sample data in `tests/data_samples` (example: `tests/gentropy/data_samples/finngen_studies_sample.json`) -- Test definition in `tests/` (example: `tests/dataset/test_study_index.py` β†’ `test_study_index_finngen_creation`) +- Test study fixture in `tests/conftest.py`, for example: `mock_study_index_finngen` in that module +- Test sample data, for example: `tests/gentropy/data_samples/finngen_studies_sample.json` +- Test definition, for example: `tests/dataset/test_study_index.py` β†’ `test_study_index_finngen_creation`) + +### Airflow dags + +- Upstream of version 2.0.0 airflow orchestration layer was moved to the [orchestration repository](https://github.com/opentargets/orchestration) diff --git a/docs/development/troubleshooting.md b/docs/development/troubleshooting.md index b9f7385da..498ee3b86 100644 --- a/docs/development/troubleshooting.md +++ b/docs/development/troubleshooting.md @@ -39,3 +39,29 @@ Another solution which helps is to remove Node, NodeJS, and npm from your system On Ubuntu, this can be done using `sudo apt remove node nodejs npm`, followed by `sudo apt autoremove`. But in some cases, depending on your existing installation, you may need to also manually remove some files. See [this StackOverflow answer](https://stackoverflow.com/a/41057802) for guidance. After running these commands, you are advised to open a fresh shell, and then also reinstall Pyenv and Poetry to make sure they pick up the changes (see relevant section above). + +## MacOS + +Some functions on MacOS may throw a java error: + +`python3.10/site-packages/py4j/protocol.py:326: Py4JJavaError` + +This can be resolved by adding the follow line to your `~/.zshrc`: + +`export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES` + +## Creating development dataproc cluster (OT users only) + +To start dataproc cluster in the development mode run + +``` +make create-dev-cluster +``` + +The command above will prepare 3 different resources: + +- gentropy package +- cli script +- cluster setup script + +and based on the branch ref (for example `dev`) will create a namespaced folder under GCS (`gs://genetics_etl_python_playground/initialisation/gentropy/dev`) with the three files described above. These files will be then used to create the cluster environment. diff --git a/docs/development/workflows.md b/docs/development/workflows.md deleted file mode 100644 index 2269041d8..000000000 --- a/docs/development/workflows.md +++ /dev/null @@ -1,27 +0,0 @@ -# Pipeline workflows - -This page describes the high level components of the pipeline, which are organised as Airflow DAGs (directed acyclic graphs). - -## Note on DAGs and Dataproc clusters - -Each DAG consists of the following general stages: - -1. Create cluster (if it already exists, this step is skipped) - -1. Install dependencies on the cluster - -1. Run data processing steps for this DAG - -1. Delete the cluster - -Within a DAG, all data processing steps run on the same Dataproc cluster as separate jobs. - -There is no need to configure DAGs or steps depending on the size of the input data. Clusters have autoscaling enabled, which means they will increase or decrease the number of worker VMs to accommodate the load. - -## DAG 1: Preprocess - -This DAG contains steps which are only supposed to be run once, or very rarely. They ingest external data and apply bespoke transformations specific for each particular data source. The output is normalised according to the data schemas used by the pipeline. - -## DAG 2: ETL - -The ETL DAG takes the inputs of the previous step and performs the main algorithmic processing. This processing is supposed to be data source agnostic. diff --git a/docs/howto/command_line/run_step_in_cli.md b/docs/howto/command_line/run_step_in_cli.md index ac7d55ff9..b935d84fb 100644 --- a/docs/howto/command_line/run_step_in_cli.md +++ b/docs/howto/command_line/run_step_in_cli.md @@ -24,7 +24,6 @@ Available options: ukbiobank variant_annotation variant_index - variant_to_gene Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace. ``` diff --git a/docs/python_api/_python_api.md b/docs/python_api/_python_api.md index 9952aa56f..0e1b51480 100644 --- a/docs/python_api/_python_api.md +++ b/docs/python_api/_python_api.md @@ -10,3 +10,4 @@ The overall architecture of the package distinguishes between: - [**Datasets**](datasets/_datasets.md): data model - [**Methods**](methods/_methods.md): statistical analysis tools - [**Steps**](steps/_steps.md): pipeline steps +- [**Common**](common/_common.md): Common classes diff --git a/docs/python_api/common/_common.md b/docs/python_api/common/_common.md new file mode 100644 index 000000000..5957ec3bd --- /dev/null +++ b/docs/python_api/common/_common.md @@ -0,0 +1,9 @@ +--- +title: Common +--- + +Common utilities used in gentropy package. + +- [**Genomic Region**](genomic_region.md): class to represent genomic regions +- [**Version Engine**](version_engine.md): class to extract version from datasource input paths +- [**Types**](types.md): Literal types used in the gentropy diff --git a/docs/python_api/common/genomic_region.md b/docs/python_api/common/genomic_region.md new file mode 100644 index 000000000..c0841d299 --- /dev/null +++ b/docs/python_api/common/genomic_region.md @@ -0,0 +1,6 @@ +--- +title: Genomic Region +--- + +:::gentropy.common.genomic_region.KnownGenomicRegions +:::gentropy.common.genomic_region.GenomicRegion diff --git a/docs/python_api/common/types.md b/docs/python_api/common/types.md new file mode 100644 index 000000000..ffb460a3a --- /dev/null +++ b/docs/python_api/common/types.md @@ -0,0 +1,8 @@ +--- +title: Literal Types +--- + +:::gentropy.common.types +:::gentropy.common.types.LD_Population +:::gentropy.common.types.VariantPopulation +:::gentropy.common.types.DataSourceType diff --git a/docs/python_api/common/version_engine.md b/docs/python_api/common/version_engine.md new file mode 100644 index 000000000..28d9b4b2e --- /dev/null +++ b/docs/python_api/common/version_engine.md @@ -0,0 +1,12 @@ +--- +title: VersionEngine +--- + +**VersionEngine**: + +Version engine allows for registering datasource specific version seeker class to retrieve datasource version used as input to gentropy steps. Currently implemented only for GnomAD datasource. + +This class can be then used to produce automation over output directory versioning. + +:::gentropy.common.version_engine.VersionEngine +:::gentropy.common.version_engine.GnomADVersionSeeker diff --git a/docs/python_api/datasets/biosample_index.md b/docs/python_api/datasets/biosample_index.md new file mode 100644 index 000000000..d3e4ee2c8 --- /dev/null +++ b/docs/python_api/datasets/biosample_index.md @@ -0,0 +1,9 @@ +--- +title: Biosample index +--- + +::: gentropy.dataset.biosample_index.BiosampleIndex + +## Schema + +--8<-- "assets/schemas/biosample_index.md" diff --git a/docs/python_api/datasets/l2g_feature.md b/docs/python_api/datasets/l2g_features/_l2g_feature.md similarity index 50% rename from docs/python_api/datasets/l2g_feature.md rename to docs/python_api/datasets/l2g_features/_l2g_feature.md index cf8c3dcf1..b2f6f8187 100644 --- a/docs/python_api/datasets/l2g_feature.md +++ b/docs/python_api/datasets/l2g_features/_l2g_feature.md @@ -2,7 +2,9 @@ title: L2G Feature --- -::: gentropy.method.l2g.feature_factory.L2GFeature +## Abstract Class + +::: gentropy.dataset.l2g_features.l2g_feature.L2GFeature ## Schema diff --git a/docs/python_api/datasets/l2g_features/colocalisation.md b/docs/python_api/datasets/l2g_features/colocalisation.md new file mode 100644 index 000000000..2b2680e66 --- /dev/null +++ b/docs/python_api/datasets/l2g_features/colocalisation.md @@ -0,0 +1,24 @@ +--- +title: From colocalisation +--- + +## List of features + +::: gentropy.dataset.l2g_features.colocalisation.EQtlColocClppMaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.PQtlColocClppMaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.SQtlColocClppMaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.EQtlColocH4MaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.PQtlColocH4MaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.SQtlColocH4MaximumFeature +::: gentropy.dataset.l2g_features.colocalisation.EQtlColocClppMaximumNeighbourhoodFeature +::: gentropy.dataset.l2g_features.colocalisation.PQtlColocClppMaximumNeighbourhoodFeature +::: gentropy.dataset.l2g_features.colocalisation.SQtlColocClppMaximumNeighbourhoodFeature +::: gentropy.dataset.l2g_features.colocalisation.EQtlColocH4MaximumNeighbourhoodFeature +::: gentropy.dataset.l2g_features.colocalisation.PQtlColocH4MaximumNeighbourhoodFeature +::: gentropy.dataset.l2g_features.colocalisation.SQtlColocH4MaximumNeighbourhoodFeature + +## Common logic + +::: gentropy.dataset.l2g_features.colocalisation.common_colocalisation_feature_logic +::: gentropy.dataset.l2g_features.colocalisation.extend_missing_colocalisation_to_neighbourhood_genes +::: gentropy.dataset.l2g_features.colocalisation.common_neighbourhood_colocalisation_feature_logic diff --git a/docs/python_api/datasets/l2g_features/distance.md b/docs/python_api/datasets/l2g_features/distance.md new file mode 100644 index 000000000..e426b2952 --- /dev/null +++ b/docs/python_api/datasets/l2g_features/distance.md @@ -0,0 +1,19 @@ +--- +title: From distance +--- + +## List of features + +::: gentropy.dataset.l2g_features.distance.DistanceSentinelTssFeature +::: gentropy.dataset.l2g_features.distance.DistanceSentinelTssNeighbourhoodFeature +::: gentropy.dataset.l2g_features.distance.DistanceTssMeanFeature +::: gentropy.dataset.l2g_features.distance.DistanceTssMeanNeighbourhoodFeature +::: gentropy.dataset.l2g_features.distance.DistanceSentinelFootprintFeature +::: gentropy.dataset.l2g_features.distance.DistanceSentinelFootprintNeighbourhoodFeature +::: gentropy.dataset.l2g_features.distance.DistanceFootprintMeanFeature +::: gentropy.dataset.l2g_features.distance.DistanceFootprintMeanNeighbourhoodFeature + +## Common logic + +::: gentropy.dataset.l2g_features.distance.common_distance_feature_logic +::: gentropy.dataset.l2g_features.distance.common_neighbourhood_distance_feature_logic diff --git a/docs/python_api/datasets/l2g_features/other.md b/docs/python_api/datasets/l2g_features/other.md new file mode 100644 index 000000000..a3d89c13b --- /dev/null +++ b/docs/python_api/datasets/l2g_features/other.md @@ -0,0 +1,15 @@ +--- +title: Other features +--- + +## List of features + +::: gentropy.dataset.l2g_features.other.GeneCountFeature +::: gentropy.dataset.l2g_features.other.ProteinGeneCountFeature +::: gentropy.dataset.l2g_features.other.ProteinCodingFeature +::: gentropy.dataset.l2g_features.other.CredibleSetConfidenceFeature + +## Common logic + +::: gentropy.dataset.l2g_features.other.common_genecount_feature_logic +::: gentropy.dataset.l2g_features.other.is_protein_coding_feature_logic diff --git a/docs/python_api/datasets/l2g_features/vep.md b/docs/python_api/datasets/l2g_features/vep.md new file mode 100644 index 000000000..d2715e977 --- /dev/null +++ b/docs/python_api/datasets/l2g_features/vep.md @@ -0,0 +1,15 @@ +--- +title: From VEP +--- + +## List of features + +::: gentropy.dataset.l2g_features.vep.VepMeanFeature +::: gentropy.dataset.l2g_features.vep.VepMeanNeighbourhoodFeature +::: gentropy.dataset.l2g_features.vep.VepMaximumFeature +::: gentropy.dataset.l2g_features.vep.VepMaximumNeighbourhoodFeature + +## Common logic + +::: gentropy.dataset.l2g_features.vep.common_vep_feature_logic +::: gentropy.dataset.l2g_features.vep.common_neighbourhood_vep_feature_logic diff --git a/docs/python_api/datasets/l2g_prediction.md b/docs/python_api/datasets/l2g_prediction.md index 5434ad398..7606c7243 100644 --- a/docs/python_api/datasets/l2g_prediction.md +++ b/docs/python_api/datasets/l2g_prediction.md @@ -6,4 +6,4 @@ title: L2G Prediction ## Schema ---8<-- "assets/schemas/l2g_prediction.md" +--8<-- "assets/schemas/l2g_predictions.md" diff --git a/docs/python_api/datasets/variant_annotation.md b/docs/python_api/datasets/variant_annotation.md deleted file mode 100644 index f82210b6e..000000000 --- a/docs/python_api/datasets/variant_annotation.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Variant annotation ---- - -::: gentropy.dataset.variant_annotation.VariantAnnotation - -## Schema - ---8<-- "assets/schemas/variant_annotation.md" diff --git a/docs/python_api/datasets/variant_to_gene.md b/docs/python_api/datasets/variant_to_gene.md deleted file mode 100644 index 2af67df92..000000000 --- a/docs/python_api/datasets/variant_to_gene.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Variant-to-gene ---- - -::: gentropy.dataset.v2g.V2G - -## Schema - ---8<-- "assets/schemas/v2g.md" diff --git a/docs/python_api/datasources/_datasources.md b/docs/python_api/datasources/_datasources.md index 036dbcb37..43b212e50 100644 --- a/docs/python_api/datasources/_datasources.md +++ b/docs/python_api/datasources/_datasources.md @@ -10,6 +10,7 @@ This section contains information about the data source harmonisation tools avai 1. [GWAS Catalog](gwas_catalog/_gwas_catalog.md) (with or without full summary statistics) 1. [FinnGen](finngen/_finngen.md) +1. [UKB PPP (EUR)](ukb_ppp_eur/_ukb_ppp_eur.md) ## Molecular QTLs @@ -22,9 +23,10 @@ This section contains information about the data source harmonisation tools avai ## Variant annotation/validation 1. [GnomAD](gnomad/_gnomad.md) v4.0 -1. GWAS catalog harmonisation pipeline [more info](https://www.ebi.ac.uk/gwas/docs/methods/summary-statistics#_harmonised_summary_statistics_data) +2. GWAS catalog's [harmonisation pipeline](https://www.ebi.ac.uk/gwas/docs/methods/summary-statistics#_harmonised_summary_statistics_data) +3. Ensembl's [Variant Effect Predictor](https://www.ensembl.org/info/docs/tools/vep/index.html) -## Linkage desiquilibrium +## Linkage disequilibrium 1. [GnomAD](gnomad/_gnomad.md) v2.1.1 LD matrixes (7 ancestries) @@ -35,3 +37,8 @@ This section contains information about the data source harmonisation tools avai ## Gene annotation 1. [Open Targets Platform Target Dataset](open_targets/target.md) (derived from Ensembl) + +## Biological samples + +1. [Uberon](biosample_ontologies/_uberon.md) +2. [Cell Ontology](biosample_ontologies/_cell_ontology.md) diff --git a/docs/python_api/datasources/biosample_ontologies/_cell_ontology.md b/docs/python_api/datasources/biosample_ontologies/_cell_ontology.md new file mode 100644 index 000000000..5798e032b --- /dev/null +++ b/docs/python_api/datasources/biosample_ontologies/_cell_ontology.md @@ -0,0 +1,5 @@ +--- +title: Cell Ontology +--- + +The [Cell Ontology](http://www.obofoundry.org/ontology/cl.html) is a structured controlled vocabulary for cell types. It is used to annotate cell types in single-cell RNA-seq data and other omics data. diff --git a/docs/python_api/datasources/biosample_ontologies/_uberon.md b/docs/python_api/datasources/biosample_ontologies/_uberon.md new file mode 100644 index 000000000..4bb47305a --- /dev/null +++ b/docs/python_api/datasources/biosample_ontologies/_uberon.md @@ -0,0 +1,5 @@ +--- +title: Uberon +--- + +The [Uberon](http://uberon.github.io/) ontology is a multi-species anatomy ontology that integrates cross-species ontologies into a single ontology. diff --git a/docs/python_api/datasources/ensembl/_ensembl.md b/docs/python_api/datasources/ensembl/_ensembl.md new file mode 100644 index 000000000..56c49870a --- /dev/null +++ b/docs/python_api/datasources/ensembl/_ensembl.md @@ -0,0 +1,10 @@ +--- +title: Ensembl annotations +--- + +
+ +

Ensembl

+
+ +[Ensembl](https://www.ensembl.org/index.html) provides a diverse set of genetic data Gentropy takes advantage of including gene set, and variant annotations. diff --git a/docs/python_api/datasources/ensembl/variant_effect_predictor_parser.md b/docs/python_api/datasources/ensembl/variant_effect_predictor_parser.md new file mode 100644 index 000000000..c956ed3e1 --- /dev/null +++ b/docs/python_api/datasources/ensembl/variant_effect_predictor_parser.md @@ -0,0 +1,5 @@ +--- +title: Variant effector parser +--- + +::: gentropy.datasource.ensembl.vep_parser.VariantEffectPredictorParser diff --git a/docs/python_api/datasources/eqtl_catalogue/_eqtl_catalogue.md b/docs/python_api/datasources/eqtl_catalogue/_eqtl_catalogue.md index 5382d9d57..2e95f561c 100644 --- a/docs/python_api/datasources/eqtl_catalogue/_eqtl_catalogue.md +++ b/docs/python_api/datasources/eqtl_catalogue/_eqtl_catalogue.md @@ -2,10 +2,6 @@ title: eQTL Catalogue --- -The [eQTL Catalogue](https://www.ebi.ac.uk/eqtl/) aims to provide uniformly processed gene expression and splicing Quantitative Trait Loci (QTLs) from all available public studies on humans. +The [eQTL Catalogue](https://www.ebi.ac.uk/eqtl/) aims to provide unified gene, protein expression and splicing Quantitative Trait Loci (QTLs) from all available human public studies. -It serves as the ultimate resource of eQTLs that we use for colocalization and target prioritization. - -We utilize data from the following study within the eQTL Catalogue: - -1. **GTEx v8**, 49 tissues +It serves as the ultimate resource of molecular QTLs that we use for colocalization and target prioritization. diff --git a/docs/python_api/datasources/eqtl_catalogue/finemapping.md b/docs/python_api/datasources/eqtl_catalogue/finemapping.md new file mode 100644 index 000000000..c272de266 --- /dev/null +++ b/docs/python_api/datasources/eqtl_catalogue/finemapping.md @@ -0,0 +1,5 @@ +--- +title: Fine mapping results +--- + +::: gentropy.datasource.eqtl_catalogue.finemapping.EqtlCatalogueFinemapping diff --git a/docs/python_api/datasources/ukb_ppp_eur/_ukb_ppp_eur.md b/docs/python_api/datasources/ukb_ppp_eur/_ukb_ppp_eur.md new file mode 100644 index 000000000..e416e1f32 --- /dev/null +++ b/docs/python_api/datasources/ukb_ppp_eur/_ukb_ppp_eur.md @@ -0,0 +1,7 @@ +--- +title: UKB-PPP (EUR) +--- + +The UKB-PPP is a collaboration between the UK Biobank (UKB) and thirteen biopharmaceutical companies characterising the plasma proteomic profiles of 54,219 UKB participants. + +The original data is available at https://www.synapse.org/#!Synapse:syn51364943/. The associated paper is https://www.nature.com/articles/s41586-023-06592-6. diff --git a/docs/python_api/datasources/ukb_ppp_eur/study_index.md b/docs/python_api/datasources/ukb_ppp_eur/study_index.md new file mode 100644 index 000000000..b7f0d91a0 --- /dev/null +++ b/docs/python_api/datasources/ukb_ppp_eur/study_index.md @@ -0,0 +1,5 @@ +--- +title: Study Index +--- + +::: gentropy.datasource.ukb_ppp_eur.study_index.UkbPppEurStudyIndex diff --git a/docs/python_api/datasources/ukb_ppp_eur/summary_stats.md b/docs/python_api/datasources/ukb_ppp_eur/summary_stats.md new file mode 100644 index 000000000..e2db55c25 --- /dev/null +++ b/docs/python_api/datasources/ukb_ppp_eur/summary_stats.md @@ -0,0 +1,5 @@ +--- +title: Summary Statistics +--- + +::: gentropy.datasource.ukb_ppp_eur.summary_stats.UkbPppEurSummaryStats diff --git a/docs/python_api/methods/clumping.md b/docs/python_api/methods/clumping.md index 6cc368013..86968dfe0 100644 --- a/docs/python_api/methods/clumping.md +++ b/docs/python_api/methods/clumping.md @@ -10,6 +10,7 @@ We have implemented two clumping methods: 1. **Distance-based clumping:** Uses genomic window to clump the significant SNPs into one hit. 2. **LD-based clumping:** Uses genomic window and LD to clump the significant SNPs into one hit. +3. **Locus-breaker clumping:** Applies a distance cutoff between baseline significant SNPs. Returns the start and end position of the locus as well. The algorithmic logic is similar to classic clumping approaches from PLINK (Reference: [PLINK Clump Documentation](https://zzz.bwh.harvard.edu/plink/clump.shtml)). See details below: @@ -20,3 +21,7 @@ The algorithmic logic is similar to classic clumping approaches from PLINK (Refe # LD-based clumping: ::: gentropy.method.clump.LDclumping + +# Locus-breaker clumping + +::: gentropy.method.locus_breaker_clumping.LocusBreakerClumping diff --git a/docs/python_api/methods/l2g/_l2g.md b/docs/python_api/methods/l2g/_l2g.md index fca3ba79d..bbd7dad66 100644 --- a/docs/python_api/methods/l2g/_l2g.md +++ b/docs/python_api/methods/l2g/_l2g.md @@ -9,13 +9,10 @@ The **β€œlocus-to-gene” (L2G)** model derives features to prioritize likely ca - **Chromatin Interaction:** (e.g., promoter-capture Hi-C) - **Variant Pathogenicity:** (from VEP) -The L2G model is distinct from the variant-to-gene (V2G) pipeline in that it: - -- Uses a machine-learning model to learn the weights of each evidence source based on a gold standard of previously identified causal genes. -- Relies upon fine-mapping and colocalization data. - Some of the predictive features weight variant-to-gene (or genomic region-to-gene) evidence based on the posterior probability that the variant is causal, determined through fine-mapping of the GWAS association. +For a more detailed description of how each feature is computed, see [the L2G Feature documentation](../../datasets/l2g_features/_l2g_feature.md). + Details of the L2G model are provided in our Nature Genetics publication (ref - [Nature Genetics Publication](https://www.nature.com/articles/s41588-021-00945-5)): - **Title:** An open approach to systematically prioritize causal variants and genes at all published human GWAS trait-associated loci. diff --git a/docs/python_api/methods/l2g/evaluator.md b/docs/python_api/methods/l2g/evaluator.md deleted file mode 100644 index 4b389e8c0..000000000 --- a/docs/python_api/methods/l2g/evaluator.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: W&B evaluator ---- - -::: gentropy.method.l2g.evaluator.WandbEvaluator diff --git a/docs/python_api/methods/l2g/feature_factory.md b/docs/python_api/methods/l2g/feature_factory.md index 35b4ed710..ec812d2da 100644 --- a/docs/python_api/methods/l2g/feature_factory.md +++ b/docs/python_api/methods/l2g/feature_factory.md @@ -2,6 +2,6 @@ title: L2G Feature Factory --- -::: gentropy.method.l2g.feature_factory.ColocalisationFactory +::: gentropy.method.l2g.feature_factory.FeatureFactory -::: gentropy.method.l2g.feature_factory.StudyLocusFactory +::: gentropy.method.l2g.feature_factory.L2GFeatureInputLoader diff --git a/docs/python_api/methods/sumstat_imputation.md b/docs/python_api/methods/sumstat_imputation.md new file mode 100644 index 000000000..6e64d35b1 --- /dev/null +++ b/docs/python_api/methods/sumstat_imputation.md @@ -0,0 +1,28 @@ +--- +title: Summary Statistics Imputation +--- + +Summary statistics imputation leverages linkage disequilibrium (LD) information to compute Z-scores of missing SNPs from neighbouring observed SNPs +SNPs by taking advantage of the Linkage Disequilibrium. + +We implemented the basic model from RAISS (Robust and Accurate Imputation from Summary Statistics) package (see the original [paper](https://academic.oup.com/bioinformatics/article/35/22/4837/5512360)). + +The full repository for the RAISS package can be found [here](https://gitlab.pasteur.fr/statistical-genetics/raiss). + +The original model was suggested in 2014 by Bogdan Pasaniuc et al. [here](https://pubmed.ncbi.nlm.nih.gov/24990607/). + +It represents the following formula: + +E(z*i|z_t) = M*{i,t} \cdot (M\_{t,t})^{-1} \cdot z_t + +Where: + +- E(z_i|z_t) represents the expected z-score of SNP 'i' given the observed z-scores at known SNP indexes 't'. + +- M\_{i,t} represents the LD (Linkage Disequilibrium) matrix between SNP 'i' and the known SNPs at indexes 't'. + +- (M\_{t,t})^{-1} represents the inverse of the LD matrix of the known SNPs at indexes 't'. + +- z_t represents the vector of observed z-scores at the known SNP indexes 't'. + +:::gentropy.method.sumstat_imputation.SummaryStatisticsImputation diff --git a/docs/python_api/methods/sumstat_quality_controls.md b/docs/python_api/methods/sumstat_quality_controls.md new file mode 100644 index 000000000..dfc5c9d16 --- /dev/null +++ b/docs/python_api/methods/sumstat_quality_controls.md @@ -0,0 +1,18 @@ +--- +title: QC of GWAS Summary Statistics +--- + +This class consists of several general quality control checks for GWAS with full summary statistics. +There are several checks included: + +1. Genomic control lambda (median of the distribution of Chi2 statistics divided by expected for Chi2 with df=1). Lambda should be reasonably close to 1. Ideally not bigger than 2. + +2. P-Z check: the linear regression between log10 of reported p-values and log10 of p-values inferred from betas and standard errors. Intercept of the regression should be close to 0, slope close to 1. + +3. Mean beta check: mean of beta. Should be close to 0. + +4. The N_eff check: It estimates the ratio between effective sample size and the expected one and checks its distribution. It is possible to conduct only if the effective allele frequency is provided in the study. The median ratio is always close to 1, standard error should be close to 0. + +5. Number of SNPs and number of significant SNPs. + +:::gentropy.method.sumstat_quality_controls.SummaryStatisticsQC diff --git a/docs/python_api/steps/biosample_index_step.md b/docs/python_api/steps/biosample_index_step.md new file mode 100644 index 000000000..d8f7abbb4 --- /dev/null +++ b/docs/python_api/steps/biosample_index_step.md @@ -0,0 +1,5 @@ +--- +title: biosample_index +--- + +::: gentropy.biosample_index.BiosampleIndexStep diff --git a/docs/python_api/steps/credible_set_qc_step.md b/docs/python_api/steps/credible_set_qc_step.md new file mode 100644 index 000000000..2999115e7 --- /dev/null +++ b/docs/python_api/steps/credible_set_qc_step.md @@ -0,0 +1,7 @@ +--- +title: credible_set_qc +--- + +::: gentropy.credible_set_qc.CredibleSetQCStep + +::: gentropy.config.CredibleSetQCStepConfig diff --git a/docs/python_api/steps/eqtl_catalogue.md b/docs/python_api/steps/eqtl_catalogue.md index 17ea6a6f6..32f2aa257 100644 --- a/docs/python_api/steps/eqtl_catalogue.md +++ b/docs/python_api/steps/eqtl_catalogue.md @@ -1,5 +1,5 @@ --- -title: eqtl_catalogue +title: eQTL Catalogue --- ::: gentropy.eqtl_catalogue.EqtlCatalogueStep diff --git a/docs/python_api/steps/gwas_catalog_inclusion.md b/docs/python_api/steps/gwas_catalog_inclusion.md deleted file mode 100644 index e9ede6dd6..000000000 --- a/docs/python_api/steps/gwas_catalog_inclusion.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: gwas_catalog_study_inclusion ---- - -::: gentropy.gwas_catalog_study_inclusion.GWASCatalogStudyInclusionGenerator diff --git a/docs/python_api/steps/gwas_catalog_ingestion.md b/docs/python_api/steps/gwas_catalog_ingestion.md deleted file mode 100644 index 69ea92479..000000000 --- a/docs/python_api/steps/gwas_catalog_ingestion.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: gwas_catalog_ingestion ---- - -::: gentropy.gwas_catalog_ingestion.GWASCatalogIngestionStep diff --git a/docs/python_api/steps/gwas_catalog_study_index.md b/docs/python_api/steps/gwas_catalog_study_index.md new file mode 100644 index 000000000..4984de2a0 --- /dev/null +++ b/docs/python_api/steps/gwas_catalog_study_index.md @@ -0,0 +1,5 @@ +--- +title: gwas_catalog_study_inclusion +--- + +::: gentropy.gwas_catalog_study_index.GWASCatalogStudyIndexGenerationStep diff --git a/docs/python_api/steps/gwas_catalog_top_hits.md b/docs/python_api/steps/gwas_catalog_top_hits.md new file mode 100644 index 000000000..03d81eafb --- /dev/null +++ b/docs/python_api/steps/gwas_catalog_top_hits.md @@ -0,0 +1,5 @@ +--- +title: GWAS Catalog Top Hits Ingestion Step +--- + +::: gentropy.gwas_catalog_top_hits.GWASCatalogTopHitIngestionStep diff --git a/docs/python_api/steps/l2g.md b/docs/python_api/steps/l2g.md index 847569e36..e6aeb0ebb 100644 --- a/docs/python_api/steps/l2g.md +++ b/docs/python_api/steps/l2g.md @@ -1,5 +1,11 @@ --- -title: locus_to_gene +title: Locus to Gene (L2G) --- +::: gentropy.l2g.LocusToGeneFeatureMatrixStep + ::: gentropy.l2g.LocusToGeneStep + +::: gentropy.l2g.LocusToGeneEvidenceStep + +::: gentropy.l2g.LocusToGeneAssociationsStep diff --git a/docs/python_api/steps/ld_index.md b/docs/python_api/steps/ld_index.md index bf8b9b58e..d8f61a528 100644 --- a/docs/python_api/steps/ld_index.md +++ b/docs/python_api/steps/ld_index.md @@ -1,5 +1,5 @@ --- -title: ld_index +title: GnomAD Linkage data ingestion --- -::: gentropy.ld_index.LDIndexStep +::: gentropy.gnomad_ingestion.LDIndexStep diff --git a/docs/python_api/steps/locus_breaker_clumping.md b/docs/python_api/steps/locus_breaker_clumping.md new file mode 100644 index 000000000..1e49234e3 --- /dev/null +++ b/docs/python_api/steps/locus_breaker_clumping.md @@ -0,0 +1,5 @@ +--- +title: locus_breaker_clumping +--- + +::: gentropy.locus_breaker_clumping.LocusBreakerClumpingStep diff --git a/docs/python_api/steps/study_locus_validation.md b/docs/python_api/steps/study_locus_validation.md new file mode 100644 index 000000000..350558806 --- /dev/null +++ b/docs/python_api/steps/study_locus_validation.md @@ -0,0 +1,5 @@ +--- +title: Study-Locus Validation +--- + +::: gentropy.study_locus_validation.StudyLocusValidationStep diff --git a/docs/python_api/steps/study_validation.md b/docs/python_api/steps/study_validation.md new file mode 100644 index 000000000..8e2b68099 --- /dev/null +++ b/docs/python_api/steps/study_validation.md @@ -0,0 +1,5 @@ +--- +title: Study Validation +--- + +::: gentropy.study_validation.StudyValidationStep diff --git a/docs/python_api/steps/summary_statistics_qc.md b/docs/python_api/steps/summary_statistics_qc.md new file mode 100644 index 000000000..a9fea12b9 --- /dev/null +++ b/docs/python_api/steps/summary_statistics_qc.md @@ -0,0 +1,5 @@ +--- +title: summary_statistics_qc +--- + +::: gentropy.sumstat_qc_step.SummaryStatisticsQCStep diff --git a/docs/python_api/steps/ukb_ppp_eur_sumstat_preprocess.md b/docs/python_api/steps/ukb_ppp_eur_sumstat_preprocess.md new file mode 100644 index 000000000..4dd74f1df --- /dev/null +++ b/docs/python_api/steps/ukb_ppp_eur_sumstat_preprocess.md @@ -0,0 +1,5 @@ +--- +title: ukb_ppp_eur_sumstat_preprocess +--- + +::: gentropy.ukb_ppp_eur_sumstat_preprocess.UkbPppEurStep diff --git a/docs/python_api/steps/variant_annotation_step.md b/docs/python_api/steps/variant_annotation_step.md index e65a071b2..2b5582df4 100644 --- a/docs/python_api/steps/variant_annotation_step.md +++ b/docs/python_api/steps/variant_annotation_step.md @@ -1,5 +1,5 @@ --- -title: variant_annotation +title: GnomAD variant data ingestion --- -::: gentropy.variant_annotation.VariantAnnotationStep +::: gentropy.gnomad_ingestion.GnomadVariantIndexStep diff --git a/docs/python_api/steps/variant_to_gene_step.md b/docs/python_api/steps/variant_to_gene_step.md deleted file mode 100644 index 1a3e56af8..000000000 --- a/docs/python_api/steps/variant_to_gene_step.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: variant_to_gene ---- - -::: gentropy.v2g.V2GStep diff --git a/docs/roadmap.md b/docs/roadmap.md index 33ddf5eb2..51d4636f2 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -14,7 +14,7 @@ The Open Targets core team is working on refactoring Open Targets Genetics, aimi - Faster/robust addition of new datasets and datatypes - Reduce computational and financial cost -See [here](https://github.com/opentargets/issues/issues?q=is%3Aissue+is%3Aopen+label%3AGenetics_ETL_refactoring) for a list of open issues for this project. +See [here](https://github.com/opentargets/issues/issues?q=is%3Aissue+is%3Aopen+label%3Agentropy) for a list of open issues for this project. Schematic diagram representing the drafted process: diff --git a/docs/src_snippets/howto/python_api/b_create_dataset.py b/docs/src_snippets/howto/python_api/b_create_dataset.py index 1a006c97a..61945862e 100644 --- a/docs/src_snippets/howto/python_api/b_create_dataset.py +++ b/docs/src_snippets/howto/python_api/b_create_dataset.py @@ -42,6 +42,7 @@ def create_from_pandas() -> SummaryStatistics: """Create a dataset from a path with Pandas files.""" # --8<-- [start:create_from_pandas_import] import pyspark.pandas as ps + from gentropy.dataset.summary_statistics import SummaryStatistics # --8<-- [end:create_from_pandas_import] diff --git a/docs/src_snippets/howto/python_api/c_applying_methods.py b/docs/src_snippets/howto/python_api/c_applying_methods.py index 12eaf61ac..d0bec9edc 100644 --- a/docs/src_snippets/howto/python_api/c_applying_methods.py +++ b/docs/src_snippets/howto/python_api/c_applying_methods.py @@ -23,7 +23,7 @@ def apply_class_method_clumping(summary_stats: SummaryStatistics) -> StudyLocus: from gentropy.method.window_based_clumping import WindowBasedClumping clumped_summary_statistics = WindowBasedClumping.clump( - summary_stats, window_length=500_000 + summary_stats, distance=250_000 ) # --8<-- [end:apply_class_method_clumping] return clumped_summary_statistics diff --git a/mkdocs.yml b/mkdocs.yml index 180c6fbe1..3704ed274 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,7 +48,8 @@ markdown_extensions: - pymdownx.tabbed: alternate_style: true combine_header_slug: true - + - pymdownx.tasklist: + custom_checkbox: true hooks: - src/utils/schemadocs.py diff --git a/notebooks/FineMappingSimmuations.ipynb b/notebooks/FineMappingSimmuations.ipynb new file mode 100644 index 000000000..fcec9bbe9 --- /dev/null +++ b/notebooks/FineMappingSimmuations.ipynb @@ -0,0 +1,407 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simulations to benchmark the fine-mapping" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The simulations are based on the specific GnomAD LD matrix from the 1Mb region on chromosome 7.\n", + "\n", + "At each iteration of the simulation we randomly select n_causal causal variants and generate Z-scores. We then perform fine mapping using GentroPy functions and examine the output.\n", + "\n", + "We expect all selected variants to be presented in detected credible sets." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"f1ddd57f-afd5-4c09-9706-19e3f06fa51c\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"f1ddd57f-afd5-4c09-9706-19e3f06fa51c\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/05/21 18:05:22 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.finemapping_simulations import FineMappingSimulations\n", + "\n", + "session = Session()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "ld_matrix = np.load(\"/Users/yt4/Projects/ot_data/tmp/ld_matrix.npy\")\n", + "ld_index=session.spark.read.parquet(\"/Users/yt4/Projects/ot_data/tmp/ld_index\")\n", + "ld_matrix_for_sim=ld_matrix[0:500,:][:,0:500]\n", + "ld_index_for_sim=ld_index.limit(500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Number of causal variants = 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=1\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.003,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 76, 'number_of_cs': 76, 'expected_results': 76, 'false_positives': 0.013157894736842105, 'accuracy': 0.9868421052631579, 'accuracy_lead': 0.6447368421052632, 'sensitivity': 0.9868421052631579}\n", + "{'successful_runs': 76, 'number_of_cs': 76, 'expected_results': 76, 'false_positives': 0.013157894736842105, 'accuracy': 0.9868421052631579, 'accuracy_lead': 0.6447368421052632, 'sensitivity': 0.9868421052631579}\n", + "{'successful_runs': 76, 'number_of_cs': 76, 'expected_results': 76, 'false_positives': 0.013157894736842105, 'accuracy': 0.9868421052631579, 'accuracy_lead': 0.6447368421052632, 'sensitivity': 0.9868421052631579}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Number of causal variants = 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=3\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.003,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 89, 'number_of_cs': 177, 'expected_results': 267, 'false_positives': 0.062146892655367235, 'accuracy': 0.9378531073446328, 'accuracy_lead': 0.6666666666666666, 'sensitivity': 0.6217228464419475}\n", + "{'successful_runs': 89, 'number_of_cs': 172, 'expected_results': 267, 'false_positives': 0.05232558139534884, 'accuracy': 0.9476744186046512, 'accuracy_lead': 0.6802325581395349, 'sensitivity': 0.6104868913857678}\n", + "{'successful_runs': 89, 'number_of_cs': 161, 'expected_results': 267, 'false_positives': 0.049689440993788817, 'accuracy': 0.9503105590062112, 'accuracy_lead': 0.6832298136645962, 'sensitivity': 0.5730337078651685}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CARMA without noise" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=1\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.003,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim,\n", + " noise=False,\n", + " run_carma=True\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 74, 'number_of_cs': 74, 'expected_results': 74, 'false_positives': 0.04054054054054054, 'accuracy': 0.9594594594594594, 'accuracy_lead': 0.7027027027027027, 'sensitivity': 0.9594594594594594}\n", + "{'successful_runs': 74, 'number_of_cs': 74, 'expected_results': 74, 'false_positives': 0.04054054054054054, 'accuracy': 0.9594594594594594, 'accuracy_lead': 0.7027027027027027, 'sensitivity': 0.9594594594594594}\n", + "{'successful_runs': 74, 'number_of_cs': 74, 'expected_results': 74, 'false_positives': 0.04054054054054054, 'accuracy': 0.9594594594594594, 'accuracy_lead': 0.7027027027027027, 'sensitivity': 0.9594594594594594}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## No noise, but with CARMA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=3\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.003,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim,\n", + " noise=False,\n", + " run_carma=True\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 91, 'number_of_cs': 172, 'expected_results': 273, 'false_positives': 0.10465116279069768, 'accuracy': 0.8953488372093024, 'accuracy_lead': 0.6453488372093024, 'sensitivity': 0.5641025641025641}\n", + "{'successful_runs': 91, 'number_of_cs': 162, 'expected_results': 273, 'false_positives': 0.09259259259259259, 'accuracy': 0.9074074074074074, 'accuracy_lead': 0.6666666666666666, 'sensitivity': 0.5384615384615384}\n", + "{'successful_runs': 91, 'number_of_cs': 150, 'expected_results': 273, 'false_positives': 0.07333333333333333, 'accuracy': 0.9266666666666666, 'accuracy_lead': 0.6933333333333334, 'sensitivity': 0.5091575091575091}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adding noise" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### One varaint, noise, no CARMA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=1\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.005,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim,\n", + " noise=True,\n", + " run_carma=False,\n", + " scale_noise=2,\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 76, 'number_of_cs': 115, 'expected_results': 76, 'false_positives': 0.48695652173913045, 'accuracy': 0.5130434782608696, 'accuracy_lead': 0.4, 'sensitivity': 0.7763157894736842}\n", + "{'successful_runs': 76, 'number_of_cs': 112, 'expected_results': 76, 'false_positives': 0.4732142857142857, 'accuracy': 0.5267857142857143, 'accuracy_lead': 0.4107142857142857, 'sensitivity': 0.7763157894736842}\n", + "{'successful_runs': 76, 'number_of_cs': 111, 'expected_results': 76, 'false_positives': 0.46846846846846846, 'accuracy': 0.5315315315315315, 'accuracy_lead': 0.4144144144144144, 'sensitivity': 0.7763157894736842}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### One varaint, noise and CARMA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_causal=1\n", + "x1=FineMappingSimulations.SimulationLoop(\n", + " n_iter=100,\n", + " n_causal=n_causal,\n", + " session=session,\n", + " he2_reggen=0.005,\n", + " sample_size=100_000,\n", + " ld_matrix_for_sim=ld_matrix_for_sim,\n", + " ld_index=ld_index_for_sim,\n", + " noise=True,\n", + " run_carma=True,\n", + " scale_noise=2,\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'successful_runs': 86, 'number_of_cs': 99, 'expected_results': 86, 'false_positives': 0.30303030303030304, 'accuracy': 0.696969696969697, 'accuracy_lead': 0.5353535353535354, 'sensitivity': 0.8023255813953488}\n", + "{'successful_runs': 86, 'number_of_cs': 95, 'expected_results': 86, 'false_positives': 0.2736842105263158, 'accuracy': 0.7263157894736842, 'accuracy_lead': 0.5578947368421052, 'sensitivity': 0.8023255813953488}\n", + "{'successful_runs': 86, 'number_of_cs': 93, 'expected_results': 86, 'false_positives': 0.26881720430107525, 'accuracy': 0.7311827956989247, 'accuracy_lead': 0.5698924731182796, 'sensitivity': 0.7906976744186046}\n" + ] + } + ], + "source": [ + "x2=x1[(x1[\"pValueExponent\"]<=-6) | (x1[\"credibleSetIndex\"]==1)]\n", + "x3=x2[(x2[\"purityMinR2\"]>=0.25) | (x2[\"credibleSetIndex\"]==1)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-krNFZEZg-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/FineMapping_AlzheimierDisease.ipynb b/notebooks/FineMapping_AlzheimierDisease.ipynb new file mode 100644 index 000000000..bdb37e354 --- /dev/null +++ b/notebooks/FineMapping_AlzheimierDisease.ipynb @@ -0,0 +1,1714 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fine-mapping of Alzheimer's disease GWAS summary statistics using GentroPy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook presents an example of fine-mapping of the GWAS catalog study for Alzheimer's disease ([link to study](https://genetics.opentargets.org/Study/GCST90012877/associations)). The study itself is a good benchmarking example for fine-mapping - relatively large number of SNPs, very strong signal on the 19th chromosome (APOE). It's worth noting that usually very strong signals are excluded from fine-mapping due to instability.\n", + "\n", + "Also, we excluded MHC region (6:28M-34M) from fine-mapping because it has a huge density of the variants.\n", + "\n", + "To execute it on your local machine (not dataproc) you need to install https://github.com/broadinstitute/install-gcs-connector." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialization" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your browser has been opened to visit:\n", + "\n", + " https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8085%2F&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fsqlservice.login+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&state=2Jvk4c7unAsigRvEKhceIxcrpGmeK8&access_type=offline&code_challenge=84guS6MmOY7qgvNpHLxoJbhRDBUAEUS93teMwQboD3Q&code_challenge_method=S256\n", + "\n", + "\n", + "Credentials saved to file: [/Users/yt4/.config/gcloud/application_default_credentials.json]\n", + "\n", + "These credentials will be used by any library that requests Application Default Credentials (ADC).\n", + "\n", + "Quota project \"open-targets-genetics-dev\" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.\n", + "\n", + "\n", + "Updates are available for some Google Cloud CLI components. To install them,\n", + "please run:\n", + " $ gcloud components update\n", + "\n" + ] + } + ], + "source": [ + "!gcloud auth application-default login" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"a8e9a6a6-96f7-4efd-a426-b2299499ef03\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"a8e9a6a6-96f7-4efd-a426-b2299499ef03\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/04/09 10:40:45 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "pip-installed Hail requires additional configuration options in Spark referring\n", + " to the path to the Hail Python module directory HAIL_DIR,\n", + " e.g. /path/to/python/site-packages/hail:\n", + " spark.jars=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.driver.extraClassPath=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.executor.extraClassPath=./hail-all-spark.jarRunning on Apache Spark version 3.3.4\n", + "SparkUI available at http://192.168.0.232:4040\n", + "Welcome to\n", + " __ __ <>__\n", + " / /_/ /__ __/ /\n", + " / __ / _ `/ / /\n", + " /_/ /_/\\_,_/_/_/ version 0.2.127-bb535cd096c5\n", + "LOGGING: writing to /dev/null\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "import hail as hl\n", + "import pandas as pd\n", + "import pyspark.sql.functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "from gentropy.dataset.summary_statistics import SummaryStatistics\n", + "from gentropy.method.window_based_clumping import WindowBasedClumping\n", + "from gentropy.susie_finemapper import SusieFineMapperStep\n", + "\n", + "pd.set_option(\"display.max_colwidth\", None)\n", + "pd.set_option(\"display.expand_frame_repr\", False)\n", + "\n", + "hail_dir = os.path.dirname(hl.__file__)\n", + "session = Session(hail_home=hail_dir, start_hail=True, extended_spark_conf={\"spark.driver.memory\": \"12g\",\n", + " \"spark.kryoserializer.buffer.max\": \"500m\",\"spark.driver.maxResultSize\":\"3g\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading the data and clumping" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of SNPs in GWAS: 10607272\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 7:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of clumps: 33\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "path_gwas1=\"gs://gwas_catalog_data/harmonised_summary_statistics/GCST90012877.parquet\"\n", + "path_si=\"gs://gwas_catalog_data/study_index\"\n", + "\n", + "gwas1 = SummaryStatistics.from_parquet(session, path_gwas1)\n", + "study_index = StudyIndex.from_parquet(session, path_si)\n", + "\n", + "slt=WindowBasedClumping.clump(gwas1,gwas_significance=5e-8,distance=1e6)\n", + "slt_df=slt._df\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 15:===================================================> (9 + 1) / 10]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------+----------------+----------+---------+----------------+----------+--------------+--------------+-------------------------------+----------------+--------------------+---------------+\n", + "| studyId| variantId|chromosome| position| beta|sampleSize|pValueMantissa|pValueExponent|effectAlleleFrequencyFromSource| standardError| studyLocusId|qualityControls|\n", + "+------------+----------------+----------+---------+----------------+----------+--------------+--------------+-------------------------------+----------------+--------------------+---------------+\n", + "|GCST90012877| 1_161185602_G_A| 1|161185602| 0.0609052805639| null| 4.302| -8| 0.23499| 0.0111181765833| 6360456299763482946| []|\n", + "|GCST90012877| 1_207577223_T_C| 1|207577223| -0.122752564739| null| 1.403| -23| 0.822818| 0.0122652043685|-6742466305250328444| []|\n", + "|GCST90012877| 10_11678309_A_G| 10| 11678309| 0.0668997305692| null| 1.085| -11| 0.380517|0.00984571382836| 3672202482976347473| []|\n", + "|GCST90012877| 10_59886075_G_T| 10| 59886075|-0.0523916765294| null| 3.802| -8| 0.480668|0.00952612570169| 760299597568413738| []|\n", + "|GCST90012877| 10_80520381_T_G| 10| 80520381| 0.0701098772587| null| 2.736| -9| 0.793475| 0.0117897597766|-6168361428432361140| []|\n", + "|GCST90012877|11_121564878_T_C| 11|121564878| -0.186386086749| null| 5.586| -14| 0.037005| 0.0247938672944|-7548659272243096830| []|\n", + "|GCST90012877| 11_47370397_G_A| 11| 47370397| 0.0634588530202| null| 6.911| -11| 0.387521| 0.0097291000298| 1916491992423016132| []|\n", + "|GCST90012877| 11_60328267_T_C| 11| 60328267|-0.0892048800109| null| 9.335| -20| 0.371215|0.00980658024905| 3318332793803757311| []|\n", + "|GCST90012877| 11_86156833_A_G| 11| 86156833| 0.103281644827| null| 5.214| -26| 0.629462|0.00979200684254| 3806751464721795080| []|\n", + "|GCST90012877| 14_52924962_A_G| 14| 52924962| 0.102404628268| null| 3.69| -10| 0.092233| 0.0163413709974|-8640267085448358001| []|\n", + "|GCST90012877| 14_92472511_G_A| 14| 92472511|-0.0762776811698| null| 7.454| -14| 0.339674| 0.0101980809801| 8895835730818824947| []|\n", + "|GCST90012877| 15_50707194_C_G| 15| 50707194|-0.0722934881552| null| 1.639| -9| 0.197469| 0.0119888249532|-4585712009512019667| []|\n", + "|GCST90012877| 15_58730416_T_C| 15| 58730416|-0.0675867539589| null| 2.674| -11| 0.319058| 0.010142839928|-9173595866829505633| []|\n", + "|GCST90012877| 15_63277703_C_T| 15| 63277703| 0.0849598934189| null| 1.052| -8| 0.139487| 0.0148475601067|-6181511576673508209| []|\n", + "|GCST90012877| 16_31115000_C_A| 16| 31115000|-0.0620662164665| null| 4.466| -9| 0.281382| 0.0105807514538|-3612515273077152914| []|\n", + "|GCST90012877| 17_5229833_T_C| 17| 5229833|-0.0849787931131| null| 1.352| -9| 0.875068| 0.0140203927902|-7070596043624425654| []|\n", + "|GCST90012877| 17_63483402_T_C| 17| 63483402| 0.0542810764988| null| 1.215| -8| 0.529632|0.00952697587266| 7171154626284587162| []|\n", + "|GCST90012877| 19_1050875_A_G| 19| 1050875|-0.0772974277902| null| 2.415| -13| 0.674169| 0.0105546077307| 6109438569946056978| []|\n", + "|GCST90012877| 19_44892009_G_A| 19| 44892009| 0.352722374032| null| 1.995| -277| 0.605067|0.00991069396551| 6814727764900576662| []|\n", + "|GCST90012877| 19_51224706_C_A| 19| 51224706|-0.0582180344342| null| 1.295| -8| 0.325551| 0.010237506551|-8288099943480320096| []|\n", + "+------------+----------------+----------+---------+----------------+----------+--------------+--------------+-------------------------------+----------------+--------------------+---------------+\n", + "only showing top 20 rows\n", + "\n", + "None\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fine-mapping without outliers detection and imputation using 2M as window size" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-09 10:41:57.354 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:42:15.499 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:42:28.284 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:44:41.305 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:44:51.854 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:45:03.059 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:47:04.871 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:47:17.310 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:47:29.113 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:50:32.790 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:50:46.191 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:50:57.958 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:53:22.698 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:53:34.535 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:53:45.816 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:57:23.189 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:57:34.563 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:57:43.988 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 10:59:39.834 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 10:59:52.878 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:00:06.629 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:02:11.433 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:02:22.101 Hail: INFO: Ordering unsorted dataset with network shuffle\n", + "2024-04-09 11:02:32.320 Hail: INFO: wrote table with 175330 rows in 8 partitions to /tmp/__iruid_20813-EyC6kjgQ1hAjFSiH1Xp7sB\n", + "2024-04-09 11:02:35.350 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:04:16.225 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:04:27.837 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:04:41.879 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:07:09.950 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:07:21.139 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:07:33.197 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:09:56.240 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:10:08.288 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:10:20.802 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:14:07.114 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:14:20.204 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:14:32.464 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:16:41.133 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:16:53.191 Hail: INFO: Ordering unsorted dataset with network shuffle\n", + "2024-04-09 11:17:03.328 Hail: INFO: wrote table with 211068 rows in 9 partitions to /tmp/__iruid_35318-By6CsozcY2JvH6dhwjdBPU\n", + "2024-04-09 11:17:10.133 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:19:10.141 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:19:21.964 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:19:34.636 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:21:47.445 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:21:59.127 Hail: INFO: Ordering unsorted dataset with network shuffle\n", + "2024-04-09 11:22:15.902 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:23:18.294 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:23:32.131 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:23:48.719 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:26:51.703 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:27:02.820 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:27:18.412 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:29:02.997 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:29:19.516 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:29:41.224 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:33:19.553 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:33:32.903 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:33:49.144 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:36:16.552 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:36:28.952 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:36:46.964 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:40:40.837 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:40:51.976 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:41:04.014 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:43:54.259 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:44:05.534 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:44:20.087 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:46:45.605 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:46:59.301 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:47:13.181 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:49:50.219 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:50:02.311 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:50:16.072 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:52:34.864 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:52:46.513 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:53:00.919 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:55:50.580 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:56:02.124 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:56:16.907 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:59:15.457 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 11:59:27.380 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 11:59:40.184 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:03:31.055 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:03:42.554 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:03:53.915 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:06:33.123 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:06:45.813 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:06:58.340 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:09:23.153 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:09:33.531 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:09:43.693 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:11:13.739 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:11:26.087 Hail: INFO: Ordering unsorted dataset with network shuffle\n", + "2024-04-09 12:11:38.950 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:13:17.020 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:13:29.727 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:13:45.213 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:20:03.844 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-09 12:20:13.834 Hail: INFO: Coerced sorted dataset\n", + "2024-04-09 12:20:24.282 Hail: INFO: Coerced sorted dataset\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 1:160185602-162185602 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/p5/4t9crp1563l792qz8xz_3x5h0000gq/T/ipykernel_46905/1319014212.py:29: FutureWarning:\n", + "\n", + "The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", + "\n", + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 1:206577223-208577223 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 10:10678309-12678309 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 10:58886075-60886075 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 10:79520381-81520381 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 11:120564878-122564878 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 11:46370397-48370397 ; number of CSs: 6 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 11:59328267-61328267 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 11:85156833-87156833 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 14:51924962-53924962 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 14:91472511-93472511 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 15:49707194-51707194 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 15:57730416-59730416 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 15:62277703-64277703 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 16:30115000-32115000 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 17:4229833-6229833 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 17:62483402-64483402 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 19:50875-2050875 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 19:43892009-45892009 ; number of CSs: 10 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 19:50224706-52224706 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 2:104749599-106749599 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 2:126135234-128135234 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 2:232117202-234117202 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 2:64381229-66381229 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 20:55423488-57423488 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1199:=====================> (3 + 5) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 21:25775872-27775872 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 4:10025995-12025995 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 6:39974457-41974457 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 6:46627419-48627419 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1403:===================================> (5 + 3) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 7:142410495-144410495 ; number of CSs: 2 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 7:99374211-101374211 ; number of CSs: 1 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1505:> (0 + 8) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region: 8:26610986-28610986 ; number of CSs: 3 ; log:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "df = slt_df.withColumn(\"row_index\", f.monotonically_increasing_id())\n", + "\n", + "columns = [\"N_gwas\", \"N_ld\", \"N_overlap\", \"N_outliers\", \"N_imputed\", \"N_final_to_fm\", \"eleapsed_time\"]\n", + "logs = pd.DataFrame(columns=columns)\n", + "\n", + "for i in range(0,df.count()):\n", + " if i!=27:\n", + " one_row = df.filter(df.row_index == i).first()\n", + "\n", + " res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=False,\n", + " run_sumstat_imputation=False,\n", + " carma_time_limit=600,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + " )\n", + "\n", + " sl=res[\"study_locus\"]\n", + " #print(sl._df.withColumn(\"size\", f.size(sl._df[\"locus\"])).show())\n", + " #print(res[\"log\"])\n", + " logs=pd.concat([logs,res[\"log\"]])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7120 10431 6456 0 0 6456 56.839336\n", + "0 7128 8657 5769 0 0 5769 46.149004\n", + "0 9203 12106 7930 0 0 7930 93.531924\n", + "0 8351 10014 6995 0 0 6995 74.174323\n", + "0 9388 12551 8337 0 0 8337 120.602071\n", + "0 6560 8729 5758 0 0 5758 45.064894\n", + "0 5005 7701 3954 0 0 3954 55.229344\n", + "0 7012 8940 5815 0 0 5815 38.824251\n", + "0 8661 10303 7291 0 0 7291 68.802810\n", + "0 8081 9966 6771 0 0 6771 64.327746\n", + "0 8375 11213 7467 0 0 7467 141.808555\n", + "0 7377 9622 6369 0 0 6369 51.198955\n", + "0 8181 10864 7116 0 0 7116 49.033224\n", + "0 7976 10135 6704 0 0 6704 58.357743\n", + "0 3369 6542 2972 0 0 2972 17.138722\n", + "0 9006 12776 7969 0 0 7969 83.551872\n", + "0 4565 7018 3887 0 0 3887 37.801989\n", + "0 8278 13741 7852 0 0 7852 105.623508\n", + "0 7582 10448 6100 0 0 6100 58.572944\n", + "0 9145 12706 8242 0 0 8242 129.442009\n", + "0 8795 11311 7584 0 0 7584 86.336201\n", + "0 7852 10028 7041 0 0 7041 67.886754\n", + "0 8393 10850 7195 0 0 7195 72.375809\n", + "0 7639 10031 6520 0 0 6520 61.900982\n", + "0 8899 11509 7922 0 0 7922 86.535298\n", + "0 8908 11309 7889 0 0 7889 93.595320\n", + "0 10654 12663 8990 0 0 8990 133.390712\n", + "0 9073 10228 7398 0 0 7398 79.774280\n", + "0 8033 9785 6822 0 0 6822 63.950340\n", + "0 4570 5516 3162 0 0 3162 27.943313\n", + "0 5716 8785 4760 0 0 4760 30.024706\n", + "0 9243 10989 7869 0 0 7869 108.898056\n" + ] + } + ], + "source": [ + "pd.set_option(\"display.max_rows\", None)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6653.3125\n" + ] + } + ], + "source": [ + "summary = logs[\"N_overlap\"].mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fine-mapping of APOE locus" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "Row(studyId='GCST90012877', variantId='19_44892009_G_A', chromosome='19', position=44892009, beta=0.352722374032, sampleSize=None, pValueMantissa=1.9950000047683716, pValueExponent=-277, effectAlleleFrequencyFromSource=0.6050670146942139, standardError=0.00991069396551, studyLocusId=6814727764900576662, qualityControls=[], row_index=18)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = slt_df.withColumn(\"row_index\", f.monotonically_increasing_id())\n", + "one_row = df.filter(df.row_index == 18).first()\n", + "one_row" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Without CARMA, without imputation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-08 21:34:03.208 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + "2024-04-08 21:34:19.253 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 21:34:34.941 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 21:37:16.576 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + "2024-04-08 21:37:28.867 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 21:37:44.733 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 21:52:03.198 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + "2024-04-08 21:52:15.100 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 21:52:30.553 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:21:27.877 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + "2024-04-08 22:21:40.137 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:21:55.249 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:23:21.795 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + "2024-04-08 22:23:35.031 Hail: INFO: Coerced sorted dataset\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 1|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 2135.710824756712| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 2|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf| 955.4948390766739| 1|\n", + "| 8324745608044585165|GCST90012877|19:43892009-45892009| 3|[{19_44917947_C_T...|19_44917947_C_T| 19|44917947| SuSiE-inf| 690.0307437138443| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 4|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf|425.33378303492805| 1|\n", + "| 2240477384494621278|GCST90012877|19:43892009-45892009| 5|[{19_44891079_T_C...|19_44891079_T_C| 19|44891079| SuSiE-inf|395.31055398960274| 1|\n", + "| 1029535804909934921|GCST90012877|19:43892009-45892009| 6|[{19_44894695_T_C...|19_44894695_T_C| 19|44894695| SuSiE-inf| 333.9497424582455| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 7|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 261.573648706883| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 8|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf|186.66554412409607| 1|\n", + "|-7370952295217410456|GCST90012877|19:43892009-45892009| 9|[{19_44922505_T_G...|19_44922505_T_G| 19|44922505| SuSiE-inf| 78.06352464083552| 1|\n", + "| 3925446284512644964|GCST90012877|19:43892009-45892009| 10|[{19_44913574_T_G...|19_44913574_T_G| 19|44913574| SuSiE-inf|55.346197523194675| 1|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7582 10448 6100 0 0 6100 66.112839\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=False,\n", + " run_sumstat_imputation=False,\n", + " carma_time_limit=1000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With CARMA, without imputation" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 1|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf|1995.6574121818223| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 2|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf| 721.2637360279233| 1|\n", + "| 7760477027903907683|GCST90012877|19:43892009-45892009| 3|[{19_44911142_C_A...|19_44911142_C_A| 19|44911142| SuSiE-inf|248.39159334060017| 1|\n", + "|-1172224975892516254|GCST90012877|19:43892009-45892009| 4|[{19_44894255_A_C...|19_44894255_A_C| 19|44894255| SuSiE-inf| 96.16160678286879| 1|\n", + "| 8852802213660052283|GCST90012877|19:43892009-45892009| 5|[{19_44862190_G_A...|19_44862190_G_A| 19|44862190| SuSiE-inf| 55.80518621838019| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 6|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf| 53.24772075097935| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 7|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 45.65754067281976| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 8|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 39.3840804563262| 1|\n", + "| 6986973025714240626|GCST90012877|19:43892009-45892009| 9|[{19_44873060_C_G...|19_44873060_C_G| 19|44873060| SuSiE-inf| 38.54912041595975| 1|\n", + "| 3640651426400620880|GCST90012877|19:43892009-45892009| 10|[{19_44845920_G_C...|19_44845920_G_C| 19|44845920| SuSiE-inf|35.378479810047224| 2|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7582 10448 6100 151 0 5949 783.939477\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=True,\n", + " run_sumstat_imputation=False,\n", + " carma_time_limit=1000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Without CARMA, with imputation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-04-08 22:25:15.739 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-08 22:25:30.625 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:25:46.020 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:32:35.094 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-08 22:32:47.616 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:33:02.484 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:51:33.149 Hail: INFO: Table.join: renamed the following fields on the right to avoid name conflicts:\n", + " 'age_index_dict' -> 'age_index_dict_1'\n", + " 'freq_index_dict' -> 'freq_index_dict_1'\n", + " 'faf_index_dict' -> 'faf_index_dict_1'\n", + " 'freq_meta' -> 'freq_meta_1'\n", + " 'rf' -> 'rf_1'\n", + " 'age_distribution' -> 'age_distribution_1'\n", + " 'popmax_index_dict' -> 'popmax_index_dict_1'\n", + "2024-04-08 22:51:45.708 Hail: INFO: Coerced sorted dataset\n", + "2024-04-08 22:52:00.731 Hail: INFO: Coerced sorted dataset\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+--------------------+----------------+--------------------+-----------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+--------------------+----------------+--------------------+-----------------+----------+--------+-----------------+------------------+----+\n", + "|-1350283509846281677|GCST90012877|19:43892009-45892009| 1|[{19_44909967_TGG...|19_44909967_TGG_T| 19|44909967| SuSiE-inf| 2310.665662473933| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 2|[{19_44921094_A_T...| 19_44921094_A_T| 19|44921094| SuSiE-inf| 903.6138342773536| 1|\n", + "| 8324745608044585165|GCST90012877|19:43892009-45892009| 3|[{19_44917947_C_T...| 19_44917947_C_T| 19|44917947| SuSiE-inf| 700.3080514793324| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 4|[{19_44921094_A_T...| 19_44921094_A_T| 19|44921094| SuSiE-inf|431.79459690536703| 1|\n", + "| 1029535804909934921|GCST90012877|19:43892009-45892009| 5|[{19_44894695_T_C...| 19_44894695_T_C| 19|44894695| SuSiE-inf|402.50010763388156| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 6|[{19_44921094_A_T...| 19_44921094_A_T| 19|44921094| SuSiE-inf|225.93101254172214| 1|\n", + "| -60207296485035224|GCST90012877|19:43892009-45892009| 7|[{19_44888997_C_T...| 19_44888997_C_T| 19|44888997| SuSiE-inf| 191.4947272198485| 1|\n", + "|-1350283509846281677|GCST90012877|19:43892009-45892009| 8|[{19_44909967_TGG...|19_44909967_TGG_T| 19|44909967| SuSiE-inf|105.04460057482835| 1|\n", + "|-4078755027603845519|GCST90012877|19:43892009-45892009| 9|[{19_44918393_G_A...| 19_44918393_G_A| 19|44918393| SuSiE-inf| 63.30243818120949| 1|\n", + "| 3925446284512644964|GCST90012877|19:43892009-45892009| 10|[{19_44913574_T_G...| 19_44913574_T_G| 19|44913574| SuSiE-inf|54.079307276192694| 1|\n", + "+--------------------+------------+--------------------+----------------+--------------------+-----------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7582 10448 6100 0 681 6781 334.328722\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=False,\n", + " run_sumstat_imputation=True,\n", + " carma_time_limit=10000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With CARMA, with imputation" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| 3030414938485808431|GCST90012877|19:43892009-45892009| 1|[{19_44895007_C_T...|19_44895007_C_T| 19|44895007| SuSiE-inf|2680.9099711333456| 1|\n", + "|-2201142982564351776|GCST90012877|19:43892009-45892009| 2|[{19_44900601_A_G...|19_44900601_A_G| 19|44900601| SuSiE-inf| 2103.873956796136| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 3|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf|1968.8126348567705| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 4|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf|1089.9033376410644| 1|\n", + "| 7760477027903907683|GCST90012877|19:43892009-45892009| 5|[{19_44911142_C_A...|19_44911142_C_A| 19|44911142| SuSiE-inf|188.55568384844716| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 6|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 83.57344085238768| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 7|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf| 82.01732099119907| 1|\n", + "| 8852802213660052283|GCST90012877|19:43892009-45892009| 8|[{19_44862190_G_A...|19_44862190_G_A| 19|44862190| SuSiE-inf| 45.92126992319222| 1|\n", + "|-1611304699666037367|GCST90012877|19:43892009-45892009| 9|[{19_44821259_C_T...|19_44821259_C_T| 19|44821259| SuSiE-inf|37.363613067645254| 1|\n", + "| 3556335645959991344|GCST90012877|19:43892009-45892009| 10|[{19_45017701_G_T...|19_45017701_G_T| 19|45017701| SuSiE-inf|30.736039473626658| 4|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7582 10448 6100 152 715 6663 1036.467428\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=True,\n", + " run_sumstat_imputation=True,\n", + " carma_time_limit=10000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With CARMA, with imputation, with estimation of infinitisimal effects (susie_est_tausq=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 1|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 1105.297844890198| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 2|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf|1042.0949995382389| 1|\n", + "|-2201142982564351776|GCST90012877|19:43892009-45892009| 3|[{19_44900601_A_G...|19_44900601_A_G| 19|44900601| SuSiE-inf| 760.0654878716481| 1|\n", + "| 3030414938485808431|GCST90012877|19:43892009-45892009| 4|[{19_44895007_C_T...|19_44895007_C_T| 19|44895007| SuSiE-inf| 388.8928142354868| 1|\n", + "| -251577639520141451|GCST90012877|19:43892009-45892009| 5|[{19_44899220_C_T...|19_44899220_C_T| 19|44899220| SuSiE-inf| 259.5645544847559| 1|\n", + "| 7760477027903907683|GCST90012877|19:43892009-45892009| 6|[{19_44911142_C_A...|19_44911142_C_A| 19|44911142| SuSiE-inf|231.66277856324325| 1|\n", + "| 4133344777320628094|GCST90012877|19:43892009-45892009| 7|[{19_44904531_G_A...|19_44904531_G_A| 19|44904531| SuSiE-inf|143.22657752219786| 1|\n", + "|-1764089385585984368|GCST90012877|19:43892009-45892009| 8|[{19_44893642_T_C...|19_44893642_T_C| 19|44893642| SuSiE-inf| 87.72507299242906| 1|\n", + "|-1158278093713046158|GCST90012877|19:43892009-45892009| 9|[{19_44921094_A_T...|19_44921094_A_T| 19|44921094| SuSiE-inf| 71.4171763690986| 1|\n", + "|-6417720984991662128|GCST90012877|19:43892009-45892009| 10|[{19_44908684_T_C...|19_44908684_T_C| 19|44908684| SuSiE-inf| 43.36071977593145| 1|\n", + "+--------------------+------------+--------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 7582 10448 6100 151 720 6669 1229.515921\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 2_000_000,\n", + " L=10,\n", + " susie_est_tausq=True,\n", + " run_carma=True,\n", + " run_sumstat_imputation=True,\n", + " carma_time_limit=10000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fine-mapping of MHC region using 1Mb window" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "Row(studyId='GCST90012877', variantId='6_32592248_A_G', chromosome='6', position=32592248, beta=-0.103604380043, sampleSize=None, pValueMantissa=2.877000093460083, pValueExponent=-15, effectAlleleFrequencyFromSource=0.21086899936199188, standardError=0.0131209374957, studyLocusId=5718491981995302674, qualityControls=[], row_index=27)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = slt_df.withColumn(\"row_index\", f.monotonically_increasing_id())\n", + "one_row = df.filter(df.row_index == 27).first()\n", + "one_row" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 1541:==========================================> (6 + 2) / 8]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+------------+-------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "| studyLocusId| studyId| region|credibleSetIndex| locus| variantId|chromosome|position|finemappingMethod|credibleSetlog10BF|size|\n", + "+--------------------+------------+-------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "|-3446214959021623473|GCST90012877|6:32092248-33092248| 1|[{6_32557997_G_A,...| 6_32557997_G_A| 6|32557997| SuSiE-inf| 4323.908142062261| 1|\n", + "| -439738150050389281|GCST90012877|6:32092248-33092248| 2|[{6_32558002_G_T,...| 6_32558002_G_T| 6|32558002| SuSiE-inf|3428.8321277074765| 1|\n", + "| 5831857384024844796|GCST90012877|6:32092248-33092248| 3|[{6_32557987_C_A,...| 6_32557987_C_A| 6|32557987| SuSiE-inf|1699.8680349563335| 1|\n", + "|-1087057043201011402|GCST90012877|6:32092248-33092248| 4|[{6_32557977_T_C,...| 6_32557977_T_C| 6|32557977| SuSiE-inf| 965.9753305300063| 1|\n", + "| 6919234179916081233|GCST90012877|6:32092248-33092248| 5|[{6_32649735_C_T,...| 6_32649735_C_T| 6|32649735| SuSiE-inf| 369.9698233117616| 1|\n", + "| 7781006900918060896|GCST90012877|6:32092248-33092248| 6|[{6_32652962_C_T,...| 6_32652962_C_T| 6|32652962| SuSiE-inf| 328.6834447478274| 1|\n", + "|-7512794333418509403|GCST90012877|6:32092248-33092248| 7|[{6_32591896_T_G,...| 6_32591896_T_G| 6|32591896| SuSiE-inf|326.52393082050276| 1|\n", + "| 4056478719932360430|GCST90012877|6:32092248-33092248| 8|[{6_32621456_GC_G...|6_32621456_GC_G| 6|32621456| SuSiE-inf|263.48518383939836| 1|\n", + "| 8380896542014789747|GCST90012877|6:32092248-33092248| 9|[{6_32648039_G_A,...| 6_32648039_G_A| 6|32648039| SuSiE-inf|176.62947310155317| 1|\n", + "| 9053545161380162736|GCST90012877|6:32092248-33092248| 10|[{6_32700030_C_T,...| 6_32700030_C_T| 6|32700030| SuSiE-inf| 69.83226092797517| 2|\n", + "+--------------------+------------+-------------------+----------------+--------------------+---------------+----------+--------+-----------------+------------------+----+\n", + "\n", + "None\n", + " N_gwas N_ld N_overlap N_outliers N_imputed N_final_to_fm eleapsed_time\n", + "0 19311 22318 13188 0 0 13188 298.784288\n" + ] + } + ], + "source": [ + "res=SusieFineMapperStep.susie_finemapper_one_studylocus_row_v2_dev(\n", + " GWAS=gwas1,\n", + " session=session,\n", + " study_locus_row=one_row,\n", + " study_index=study_index,\n", + " window= 1_000_000,\n", + " L=10,\n", + " susie_est_tausq=False,\n", + " run_carma=False,\n", + " run_sumstat_imputation=False,\n", + " carma_time_limit=10000,\n", + " imputed_r2_threshold=0.8,\n", + " ld_score_threshold=4\n", + ")\n", + "sl=res[\"study_locus\"]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-krNFZEZg-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/Finngen_PICS_run.ipynb b/notebooks/Finngen_PICS_run.ipynb index 21f29db2f..614f07ba5 100644 --- a/notebooks/Finngen_PICS_run.ipynb +++ b/notebooks/Finngen_PICS_run.ipynb @@ -1,1293 +1,1284 @@ { - "cells": [ + "cells": [ + { + "cell_type": "markdown", + "id": "2dd3bf11", + "metadata": {}, + "source": [ + "# Running PICS finemapping on Finngen summary statistics\n", + "\n", + "1. Read summary stats.\n", + "2. Apply window based clumping.\n", + "3. LD expansion.\n", + "4. lD clumping.\n", + "5. PICS." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0deeb686", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T09:53:43.429135Z", + "start_time": "2023-10-13T09:53:23.566141Z" + } + }, + "outputs": [ { - "cell_type": "markdown", - "id": "2dd3bf11", - "metadata": {}, - "source": [ - "# Running PICS finemapping on Finngen summary statistics\n", - "\n", - "1. Read summary stats.\n", - "2. Apply window based clumping.\n", - "3. LD expansion.\n", - "4. lD clumping.\n", - "5. PICS." + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" ] + }, + "metadata": {}, + "output_type": "display_data" }, { - "cell_type": "code", - "execution_count": 1, - "id": "0deeb686", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T09:53:43.429135Z", - "start_time": "2023-10-13T09:53:23.566141Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - " Loading BokehJS ...\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", - "application/vnd.bokehjs_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", - "23/10/13 09:53:40 INFO SparkEnv: Registering MapOutputTracker\n", - "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMaster\n", - "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMasterHeartbeat\n", - "23/10/13 09:53:40 INFO SparkEnv: Registering OutputCommitCoordinator\n", - "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=198; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n", - "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_mkdirs. latencyMs=166; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n" - ] - } - ], - "source": [ - "# Import:\n", - "from pyspark.sql import functions as f, types as t\n", - "\n", - "from gentropy.common.session import Session\n", - "\n", - "from gentropy.dataset.summary_statistics import SummaryStatistics\n", - "from gentropy.dataset.study_locus import StudyLocus\n", - "from gentropy.dataset.study_index import StudyIndex\n", - "from gentropy.dataset.ld_index import LDIndex\n", - "from gentropy.method.ld import LDAnnotator\n", - "\n", - "from gentropy.method.pics import PICS\n", - "\n", - "# Initialize session:\n", - "session = Session()\n", - "\n", - "# Input:\n", - "sumstats = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*'\n", - "ld_index_path = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/'\n", - "\n", - "# Parameters:\n", - "clump_window_length = 500_000 # Distance between semi-indices.\n", - "locus_window_length = 250_000 # Distance around semi-indices from where the tags are collected.\n", - "\n", - "# Output:\n", - "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", - "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus'\n", - "picsed_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_PICSed'\n" - ] + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.2.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"cb01f13c-6396-4b85-99db-68f8056c07dd\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" }, { - "cell_type": "markdown", - "id": "3bdbcfbf", - "metadata": {}, - "source": [ - "## 1. Read summary statistics" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering MapOutputTracker\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMaster\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering BlockManagerMasterHeartbeat\n", + "23/10/13 09:53:40 INFO SparkEnv: Registering OutputCommitCoordinator\n", + "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=198; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n", + "23/10/13 09:53:42 WARN GhfsStorageStatistics: Detected potential high latency for operation op_mkdirs. latencyMs=166; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history\n" + ] + } + ], + "source": [ + "# Import:\n", + "from pyspark.sql import functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.dataset.ld_index import LDIndex\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "from gentropy.dataset.study_locus import StudyLocus\n", + "from gentropy.dataset.summary_statistics import SummaryStatistics\n", + "from gentropy.method.ld import LDAnnotator\n", + "from gentropy.method.pics import PICS\n", + "\n", + "# Initialize session:\n", + "session = Session()\n", + "\n", + "# Input:\n", + "sumstats = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*\"\n", + "ld_index_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/\"\n", + "\n", + "# Parameters:\n", + "clump_window_length = 500_000 # Distance between semi-indices.\n", + "locus_window_length = 250_000 # Distance around semi-indices from where the tags are collected.\n", + "\n", + "# Output:\n", + "window_based_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus\"\n", + "ld_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus\"\n", + "picsed_output = \"gs://ot-team/dsuveges/finngen/2023.10.06_PICSed\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "3bdbcfbf", + "metadata": {}, + "source": [ + "## 1. Read summary statistics" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c893433c", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T08:46:39.186806Z", + "start_time": "2023-10-06T08:46:04.601886Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 16, - "id": "c893433c", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T08:46:39.186806Z", - "start_time": "2023-10-06T08:46:04.601886Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=236; previousMaxLatencyMs=147; operationCount=276; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AB1_ACTINOMYCOSIS/chromosome=1/part-00011-33e31f88-435f-4200-9adc-3e909d706910.c000.snappy.parquet\n", - "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=269; previousMaxLatencyMs=236; operationCount=282; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n", - "23/10/06 08:46:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=417; previousMaxLatencyMs=269; operationCount=288; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", - "| studyId| variantId|position|pValueMantissa|pValueExponent| beta|standardError|effectAlleleFrequencyFromSource|betaConfidenceIntervalLower|betaConfidenceIntervalUpper|chromosome|\n", - "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", - "|FINNGEN_R9_HEIGHT...|2_10603_A_C| 10603| 8.515| -1| 0.0117813| 0.0629271| 2.30629E-4| -0.0511458| 0.0747084| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10610_G_A| 10610| 8.814| -3| 0.0187529| 0.00715985| 0.0194828| 0.01159305| 0.02591275| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10659_G_A| 10659| 9.292| -1|-0.00289323| 0.0325443| 8.5694E-4| -0.03543752999999...| 0.029651069999999998| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10756_T_C| 10756| 2.368| -1| -0.180083| 0.15223| 5.62468E-5| -0.33231299999999997| -0.02785299999999999| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10797_C_T| 10797| 8.506| -1|-0.00190634| 0.01012| 0.00847354| -0.01202634| 0.008213660000000001| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10823_G_C| 10823| 6.834| -2| -0.259102| 0.142146| 1.48813E-4| -0.401248| -0.116956| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_10847_C_T| 10847| 5.97| -1| 0.0487634| 0.0922252| 1.03478E-4| -0.04346179999999...| 0.1409886| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11305_G_C| 11305| 6.992| -1|-0.00333638| 0.00863326| 0.013513| -0.01196964| 0.00529688| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11311_C_G| 11311| 1.676| -1| 0.112938| 0.0818501| 1.30145E-4| 0.0310879| 0.1947881| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11320_G_A| 11320| 2.484| -7| -0.0106449| 0.0020634| 0.302909| -0.0127083| -0.0085815| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11486_A_G| 11486| 6.829| -3| 0.0135765| 0.00501887| 0.035261| 0.00855763| 0.01859537| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11573_A_C| 11573| 7.428| -1| 0.00483333| 0.0147283| 0.00424829| -0.00989497| 0.01956163| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11594_G_T| 11594| 5.291| -1|-0.00908649| 0.014438| 0.0045864| -0.02352449| 0.00535151| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11607_T_C| 11607| 5.666| -3| 0.0139369| 0.00503765| 0.0350636| 0.008899250000000001| 0.01897455| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11609_T_G| 11609| 8.231| -2| -0.065766| 0.0378528| 7.11595E-4| -0.10361880000000001| -0.02791320000000...| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11620_G_C| 11620| 5.866| -1| -0.0235368| 0.0432809| 5.48483E-4| -0.0668177| 0.019744099999999997| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11677_C_G| 11677| 3.944| -1| -0.0888112| 0.104287| 1.01977E-4| -0.1930982| 0.015475799999999998| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11694_C_T| 11694| 8.855| -2| -0.0468924| 0.0275339| 0.00127759| -0.0744263| -0.0193585| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11696_C_T| 11696| 2.446| -1| -0.0384871| 0.0330789| 8.17298E-4| -0.071566| -0.00540820000000...| 2|\n", - "|FINNGEN_R9_HEIGHT...|2_11834_A_G| 11834| 5.664| -3| 0.0139372| 0.00503766| 0.0350634| 0.008899540000000001| 0.01897486| 2|\n", - "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "finngen_sumstats = SummaryStatistics(\n", - " _df=(\n", - " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", - " # We need to add chromosome column as this is a partition column:\n", - " .withColumn('chromosome',f.split(f.col('variantId'), '_')[0])\n", - " ),\n", - " _schema=SummaryStatistics.get_schema()\n", - ")\n", - "finngen_sumstats.df.show()\n", - "print(finngen_sumstats.df.count())" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=236; previousMaxLatencyMs=147; operationCount=276; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AB1_ACTINOMYCOSIS/chromosome=1/part-00011-33e31f88-435f-4200-9adc-3e909d706910.c000.snappy.parquet\n", + "23/10/06 08:46:37 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=269; previousMaxLatencyMs=236; operationCount=282; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n", + "23/10/06 08:46:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=417; previousMaxLatencyMs=269; operationCount=288; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_HEIGHT_IRN/chromosome=2/part-00020-774f0990-ad3d-46ae-9648-f39c18fae314.c000.snappy.parquet\n" + ] }, { - "cell_type": "markdown", - "id": "a76b27ce", - "metadata": {}, - "source": [ - "## 2. Apply window based clumping.\n", - "\n", - "- Clumping distance: +/-500kbp\n", - "- Locus collected: +/-250kbp" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "| studyId| variantId|position|pValueMantissa|pValueExponent| beta|standardError|effectAlleleFrequencyFromSource|betaConfidenceIntervalLower|betaConfidenceIntervalUpper|chromosome|\n", + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "|FINNGEN_R9_HEIGHT...|2_10603_A_C| 10603| 8.515| -1| 0.0117813| 0.0629271| 2.30629E-4| -0.0511458| 0.0747084| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10610_G_A| 10610| 8.814| -3| 0.0187529| 0.00715985| 0.0194828| 0.01159305| 0.02591275| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10659_G_A| 10659| 9.292| -1|-0.00289323| 0.0325443| 8.5694E-4| -0.03543752999999...| 0.029651069999999998| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10756_T_C| 10756| 2.368| -1| -0.180083| 0.15223| 5.62468E-5| -0.33231299999999997| -0.02785299999999999| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10797_C_T| 10797| 8.506| -1|-0.00190634| 0.01012| 0.00847354| -0.01202634| 0.008213660000000001| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10823_G_C| 10823| 6.834| -2| -0.259102| 0.142146| 1.48813E-4| -0.401248| -0.116956| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_10847_C_T| 10847| 5.97| -1| 0.0487634| 0.0922252| 1.03478E-4| -0.04346179999999...| 0.1409886| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11305_G_C| 11305| 6.992| -1|-0.00333638| 0.00863326| 0.013513| -0.01196964| 0.00529688| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11311_C_G| 11311| 1.676| -1| 0.112938| 0.0818501| 1.30145E-4| 0.0310879| 0.1947881| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11320_G_A| 11320| 2.484| -7| -0.0106449| 0.0020634| 0.302909| -0.0127083| -0.0085815| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11486_A_G| 11486| 6.829| -3| 0.0135765| 0.00501887| 0.035261| 0.00855763| 0.01859537| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11573_A_C| 11573| 7.428| -1| 0.00483333| 0.0147283| 0.00424829| -0.00989497| 0.01956163| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11594_G_T| 11594| 5.291| -1|-0.00908649| 0.014438| 0.0045864| -0.02352449| 0.00535151| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11607_T_C| 11607| 5.666| -3| 0.0139369| 0.00503765| 0.0350636| 0.008899250000000001| 0.01897455| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11609_T_G| 11609| 8.231| -2| -0.065766| 0.0378528| 7.11595E-4| -0.10361880000000001| -0.02791320000000...| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11620_G_C| 11620| 5.866| -1| -0.0235368| 0.0432809| 5.48483E-4| -0.0668177| 0.019744099999999997| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11677_C_G| 11677| 3.944| -1| -0.0888112| 0.104287| 1.01977E-4| -0.1930982| 0.015475799999999998| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11694_C_T| 11694| 8.855| -2| -0.0468924| 0.0275339| 0.00127759| -0.0744263| -0.0193585| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11696_C_T| 11696| 2.446| -1| -0.0384871| 0.0330789| 8.17298E-4| -0.071566| -0.00540820000000...| 2|\n", + "|FINNGEN_R9_HEIGHT...|2_11834_A_G| 11834| 5.664| -3| 0.0139372| 0.00503766| 0.0350634| 0.008899540000000001| 0.01897486| 2|\n", + "+--------------------+-----------+--------+--------------+--------------+-----------+-------------+-------------------------------+---------------------------+---------------------------+----------+\n", + "only showing top 20 rows\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": 34, - "id": "fc0dd4f0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:22:38.264681Z", - "start_time": "2023-10-06T10:10:29.768171Z" - }, - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 10:22:32 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=1812; previousMaxLatencyMs=253; operationCount=415; context=gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped/_temporary/0/_temporary/attempt_202310061022254599137247441201519_0051_m_000011_106753/part-00011-53e48f6d-d432-40c5-9201-d4c8f03e6dee-c000.snappy.parquet\n", - " \r" - ] - } - ], - "source": [ - "# This process takes ~1h on a 32 cores:\n", - "(\n", - " SummaryStatistics(\n", - " _df=(\n", - " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", - " .withColumn(\n", - " 'chromosome',\n", - " f.split(f.col('variantId'), '_')[0]\n", - " )\n", - " ),\n", - " _schema=SummaryStatistics.get_schema()\n", - " )\n", - " .window_based_clumping(\n", - " distance=clump_window_length,\n", - " locus_collect_distance=locus_window_length,\n", - " with_locus=True\n", - " )\n", - " .df.write.mode('overwrite')\n", - " .parquet(window_based_clumped_output)\n", - ")" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "finngen_sumstats = SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " # We need to add chromosome column as this is a partition column:\n", + " .withColumn(\"chromosome\",f.split(f.col(\"variantId\"), \"_\")[0])\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + ")\n", + "finngen_sumstats.df.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a76b27ce", + "metadata": {}, + "source": [ + "## 2. Apply window based clumping.\n", + "\n", + "- Clumping distance: +/-500kbp\n", + "- Locus collected: +/-250kbp" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "fc0dd4f0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:22:38.264681Z", + "start_time": "2023-10-06T10:10:29.768171Z" }, + "scrolled": false + }, + "outputs": [ { - "cell_type": "markdown", - "id": "a1cd0172", - "metadata": {}, - "source": [ - "## 3. LD expansion\n", - "\n", - "- For FINNGEN, study table needs to be mocked." - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:22:32 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=1812; previousMaxLatencyMs=253; operationCount=415; context=gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped/_temporary/0/_temporary/attempt_202310061022254599137247441201519_0051_m_000011_106753/part-00011-53e48f6d-d432-40c5-9201-d4c8f03e6dee-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "# This process takes ~1h on a 32 cores:\n", + "(\n", + " SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " .withColumn(\n", + " \"chromosome\",\n", + " f.split(f.col(\"variantId\"), \"_\")[0]\n", + " )\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + " )\n", + " .window_based_clumping(\n", + " distance=clump_window_length,\n", + " locus_collect_distance=locus_window_length,\n", + " with_locus=True\n", + " )\n", + " .df.write.mode(\"overwrite\")\n", + " .parquet(window_based_clumped_output)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a1cd0172", + "metadata": {}, + "source": [ + "## 3. LD expansion\n", + "\n", + "- For FINNGEN, study table needs to be mocked." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1305f6c3", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T08:13:10.050554Z", + "start_time": "2023-10-06T08:13:05.901762Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 8, - "id": "1305f6c3", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T08:13:10.050554Z", - "start_time": "2023-10-06T08:13:05.901762Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 5:===============================================> (15 + 3) / 18]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+---------------------+---------+---------+---------------+\n", - "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", - "+--------------------+---------------------+---------+---------+---------------+\n", - "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_P16_IN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "| FINNGEN_R9_C_STROKE| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_G6_HER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_N14_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "| FINNGEN_R9_PAIN| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_D3_COA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_F5_UNSORG| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_APPEND...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_CD2_BE...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_F5_DIS...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_E4_DMN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_E4_FH_IHD| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "+--------------------+---------------------+---------+---------+---------------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "# Generating a \"fake\" study index, just for providing ld_population structure for each finngen study:\n", - "studies_df = (\n", - " session.spark.read.parquet('gs://ot-team/dsuveges/finngen_semi_indices_250kbp')\n", - " # Generating a list of study identifiers:\n", - " .select('studyId')\n", - " .distinct()\n", - " # Adding fabricated values required to parse as gwas catalog study:\n", - " .select(\n", - " 'studyId',\n", - " StudyIndex.aggregate_and_map_ancestries(\n", - " f.array(\n", - " f.struct(\n", - " f.lit('Finnish').alias('ancestry'),\n", - " f.lit(100).cast('long').alias('sampleSize')\n", - " )\n", - " )\n", - " ).alias('ldPopulationStructure'),\n", - " f.lit('FINNGEN').alias('projectId'),\n", - " f.lit('gwas').alias('studyType'),\n", - " f.lit('cicaful').alias('traitFromSource')\n", - " )\n", - ")\n", - "\n", - "study_index = (\n", - " StudyIndex(\n", - " _df=studies_df,\n", - " _schema=StudyIndex.get_schema()\n", - " )\n", - ")\n", - "\n", - "study_index.df.show()" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 5:===============================================> (15 + 3) / 18]\r" + ] }, { - "cell_type": "code", - "execution_count": 19, - "id": "cb2d5030", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T09:09:22.063715Z", - "start_time": "2023-10-06T09:09:21.359206Z" - } - }, - "outputs": [], - "source": [ - "# Loading ld index:\n", - "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", - "\n" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+---------------------+---------+---------+---------------+\n", + "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_P16_IN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_C_STROKE| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_G6_HER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_N14_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_PAIN| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_D3_COA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_F5_UNSORG| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_APPEND...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_CD2_BE...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_F5_DIS...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DMN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_FH_IHD| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "only showing top 20 rows\n", + "\n" + ] }, { - "cell_type": "markdown", - "id": "3d13ae41", - "metadata": {}, - "source": [ - "## 4. LD based clumping.\n", - "\n", - "- Persist resulting dataset.\n", - "- Save dataset." - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# Generating a \"fake\" study index, just for providing ld_population structure for each finngen study:\n", + "studies_df = (\n", + " session.spark.read.parquet(\"gs://ot-team/dsuveges/finngen_semi_indices_250kbp\")\n", + " # Generating a list of study identifiers:\n", + " .select(\"studyId\")\n", + " .distinct()\n", + " # Adding fabricated values required to parse as gwas catalog study:\n", + " .select(\n", + " \"studyId\",\n", + " StudyIndex.aggregate_and_map_ancestries(\n", + " f.array(\n", + " f.struct(\n", + " f.lit(\"Finnish\").alias(\"ancestry\"),\n", + " f.lit(100).cast(\"long\").alias(\"sampleSize\")\n", + " )\n", + " )\n", + " ).alias(\"ldPopulationStructure\"),\n", + " f.lit(\"FINNGEN\").alias(\"projectId\"),\n", + " f.lit(\"gwas\").alias(\"studyType\"),\n", + " f.lit(\"cicaful\").alias(\"traitFromSource\")\n", + " )\n", + ")\n", + "\n", + "study_index = (\n", + " StudyIndex(\n", + " _df=studies_df,\n", + " _schema=StudyIndex.get_schema()\n", + " )\n", + ")\n", + "\n", + "study_index.df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cb2d5030", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:09:22.063715Z", + "start_time": "2023-10-06T09:09:21.359206Z" + } + }, + "outputs": [], + "source": [ + "# Loading ld index:\n", + "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3d13ae41", + "metadata": {}, + "source": [ + "## 4. LD based clumping.\n", + "\n", + "- Persist resulting dataset.\n", + "- Save dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "20449e76", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:42:11.040193Z", + "start_time": "2023-10-06T09:09:52.968139Z" }, + "scrolled": false + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 20, - "id": "20449e76", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T09:42:11.040193Z", - "start_time": "2023-10-06T09:09:52.968139Z" - }, - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 09:11:42 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1312; previousMaxLatencyMs=1306; operationCount=59583672; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_N05C/chromosome=1/part-00012-a13aba14-79f4-45c0-9af0-937d599fa3f0.c000.snappy.parquet\n", - "23/10/06 09:11:43 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1316; previousMaxLatencyMs=1312; operationCount=59631953; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_CODEINE_TRAMADOL/chromosome=1/part-00012-36e099c5-3f60-4091-bf73-6fa15d48af6c.c000.snappy.parquet\n", - "23/10/06 09:16:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1489; previousMaxLatencyMs=1316; operationCount=76331604; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", - "23/10/06 09:16:21 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1735; previousMaxLatencyMs=1489; operationCount=76482674; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", - "23/10/06 09:16:23 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=460; previousMaxLatencyMs=337; operationCount=17471; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", - "23/10/06 09:27:35 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=1041; previousMaxLatencyMs=1034; operationCount=215062; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_M13_DORSOPATHYNAS/chromosome=19/part-00009-09e75b10-c64d-4b79-9c84-6b0ca039c439.c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=126; previousMaxLatencyMs=93; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552056325521918358154_0027_m_000008_57347/part-00008-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555844252084106444775_0027_m_000028_57367/part-00028-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=137; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553770650668910223592_0027_m_000020_57359/part-00020-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=136; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=140; previousMaxLatencyMs=139; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365/part-00026-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=141; previousMaxLatencyMs=140; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557648490159907156305_0027_m_000017_57356/part-00017-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352/part-00013-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=143; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955993438161489409499_0027_m_000016_57355/part-00016-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341/part-00002-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=146; previousMaxLatencyMs=145; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555640079838863826112_0027_m_000022_57361/part-00022-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=149; previousMaxLatencyMs=147; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=150; previousMaxLatencyMs=149; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=154; previousMaxLatencyMs=150; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344/part-00005-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=156; previousMaxLatencyMs=154; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556087040172921209608_0027_m_000018_57357/part-00018-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=160; previousMaxLatencyMs=156; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955995307818437095879_0027_m_000024_57363/part-00024-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=161; previousMaxLatencyMs=160; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552743075067405201713_0027_m_000014_57353/part-00014-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=106; previousMaxLatencyMs=95; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=138; previousMaxLatencyMs=106; operationCount=31; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=165; previousMaxLatencyMs=0; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=183; previousMaxLatencyMs=165; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=186; previousMaxLatencyMs=183; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=191; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=227; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=233; previousMaxLatencyMs=227; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=239; previousMaxLatencyMs=233; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=284; previousMaxLatencyMs=239; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=128; previousMaxLatencyMs=0; operationCount=28; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=318; previousMaxLatencyMs=284; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=150; previousMaxLatencyMs=128; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555920613268130744433_0027_m_000010_57349\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=190; previousMaxLatencyMs=150; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=226; previousMaxLatencyMs=190; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=172; previousMaxLatencyMs=161; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=146; previousMaxLatencyMs=138; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=150; previousMaxLatencyMs=146; operationCount=60; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551578112291921242039_0027_m_000054_57393/part-00054-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1259; previousMaxLatencyMs=226; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369\n", - "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1497; previousMaxLatencyMs=1259; operationCount=56; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557355876953011052025_0027_m_000019_57358\n", - "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=711; previousMaxLatencyMs=318; operationCount=75; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557693125728422191174_0027_m_000050_57389/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=157; previousMaxLatencyMs=150; operationCount=93; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551476648569527086024_0027_m_000080_57419/part-00080-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=752; previousMaxLatencyMs=711; operationCount=91; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554631887941475021153_0027_m_000057_57396/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=182; previousMaxLatencyMs=157; operationCount=96; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556932256815778386100_0027_m_000093_57432/part-00093-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:42:00 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=201; previousMaxLatencyMs=182; operationCount=128; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554714655772639032866_0027_m_000122_57461/part-00122-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:42:01 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=253; previousMaxLatencyMs=201; operationCount=187; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555299227751328654817_0027_m_000175_57513/part-00175-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=1159; previousMaxLatencyMs=752; operationCount=198; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556191692784728530413_0027_m_000172_57510/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", - "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1051; previousMaxLatencyMs=172; operationCount=200; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955452778920582844510_0027_m_000198_57536/part-00198-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", - "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11057; previousMaxLatencyMs=1497; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365\n", - "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11233; previousMaxLatencyMs=11057; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341\n", - "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11402; previousMaxLatencyMs=11233; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364\n", - "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11583; previousMaxLatencyMs=11402; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352\n", - "23/10/06 09:42:09 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=12651; previousMaxLatencyMs=11583; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553722108484298157195_0027_m_000023_57362\n", - "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13120; previousMaxLatencyMs=12651; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370\n", - "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13440; previousMaxLatencyMs=13120; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344\n", - " \r" - ] - } - ], - "source": [ - "(\n", - " # To annotate study/locus, study level info and ld panel is needed:\n", - " LDAnnotator.ld_annotate(\n", - " StudyLocus.from_parquet(session, window_based_clumped_output),\n", - " study_index, \n", - " ld_index\n", - " )\n", - " # Clumping linked study-loci together:\n", - " .clump()\n", - " .df.write.mode('overwrite').parquet(ld_clumped_output)\n", - ")\n", - "\n" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 09:11:42 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1312; previousMaxLatencyMs=1306; operationCount=59583672; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_N05C/chromosome=1/part-00012-a13aba14-79f4-45c0-9af0-937d599fa3f0.c000.snappy.parquet\n", + "23/10/06 09:11:43 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1316; previousMaxLatencyMs=1312; operationCount=59631953; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_RX_CODEINE_TRAMADOL/chromosome=1/part-00012-36e099c5-3f60-4091-bf73-6fa15d48af6c.c000.snappy.parquet\n", + "23/10/06 09:16:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1489; previousMaxLatencyMs=1316; operationCount=76331604; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/06 09:16:21 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1735; previousMaxLatencyMs=1489; operationCount=76482674; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=7/part-00010-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/06 09:16:23 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=460; previousMaxLatencyMs=337; operationCount=17471; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", + "23/10/06 09:27:35 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=1041; previousMaxLatencyMs=1034; operationCount=215062; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_M13_DORSOPATHYNAS/chromosome=19/part-00009-09e75b10-c64d-4b79-9c84-6b0ca039c439.c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=126; previousMaxLatencyMs=93; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552056325521918358154_0027_m_000008_57347/part-00008-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555844252084106444775_0027_m_000028_57367/part-00028-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=137; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553770650668910223592_0027_m_000020_57359/part-00020-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=134; previousMaxLatencyMs=126; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=136; previousMaxLatencyMs=134; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=139; previousMaxLatencyMs=136; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=140; previousMaxLatencyMs=139; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365/part-00026-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=141; previousMaxLatencyMs=140; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557648490159907156305_0027_m_000017_57356/part-00017-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352/part-00013-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=143; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955993438161489409499_0027_m_000016_57355/part-00016-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=144; previousMaxLatencyMs=141; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=145; previousMaxLatencyMs=144; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341/part-00002-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=146; previousMaxLatencyMs=145; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555640079838863826112_0027_m_000022_57361/part-00022-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=147; previousMaxLatencyMs=146; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=149; previousMaxLatencyMs=147; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=150; previousMaxLatencyMs=149; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=154; previousMaxLatencyMs=150; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344/part-00005-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=156; previousMaxLatencyMs=154; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556087040172921209608_0027_m_000018_57357/part-00018-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=160; previousMaxLatencyMs=156; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955995307818437095879_0027_m_000024_57363/part-00024-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=161; previousMaxLatencyMs=160; operationCount=32; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552743075067405201713_0027_m_000014_57353/part-00014-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:56 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=106; previousMaxLatencyMs=95; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551603246466691698658_0027_m_000001_57340/part-00001-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=138; previousMaxLatencyMs=106; operationCount=31; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364/part-00025-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=165; previousMaxLatencyMs=0; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00009-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=183; previousMaxLatencyMs=165; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955962380753726438814_0027_m_000000_57339/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00000-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=186; previousMaxLatencyMs=183; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552708616931813844767_0027_m_000006_57345/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00006-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=191; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00004-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=227; previousMaxLatencyMs=186; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00027-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=233; previousMaxLatencyMs=227; operationCount=30; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556216099889261123757_0027_m_000015_57354/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00015-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=239; previousMaxLatencyMs=233; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00031-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=284; previousMaxLatencyMs=239; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00030-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=128; previousMaxLatencyMs=0; operationCount=28; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555919710644676214353_0027_m_000004_57343\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=318; previousMaxLatencyMs=284; operationCount=31; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955146935648450954616_0027_m_000021_57360/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00021-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=150; previousMaxLatencyMs=128; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555920613268130744433_0027_m_000010_57349\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=190; previousMaxLatencyMs=150; operationCount=29; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955320032532820679068_0027_m_000009_57348\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=226; previousMaxLatencyMs=190; operationCount=30; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554079176040000118228_0027_m_000027_57366\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=172; previousMaxLatencyMs=161; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:57 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=146; previousMaxLatencyMs=138; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557479860471944928338_0027_m_000035_57374/part-00035-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=150; previousMaxLatencyMs=146; operationCount=60; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551578112291921242039_0027_m_000054_57393/part-00054-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1259; previousMaxLatencyMs=226; operationCount=53; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551853556311935071964_0027_m_000030_57369\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=1497; previousMaxLatencyMs=1259; operationCount=56; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557355876953011052025_0027_m_000019_57358\n", + "23/10/06 09:41:58 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=711; previousMaxLatencyMs=318; operationCount=75; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557693125728422191174_0027_m_000050_57389/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00050-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=157; previousMaxLatencyMs=150; operationCount=93; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551476648569527086024_0027_m_000080_57419/part-00080-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=752; previousMaxLatencyMs=711; operationCount=91; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554631887941475021153_0027_m_000057_57396/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00057-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:41:59 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=182; previousMaxLatencyMs=157; operationCount=96; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556932256815778386100_0027_m_000093_57432/part-00093-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:00 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=201; previousMaxLatencyMs=182; operationCount=128; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554714655772639032866_0027_m_000122_57461/part-00122-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:01 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=253; previousMaxLatencyMs=201; operationCount=187; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909555299227751328654817_0027_m_000175_57513/part-00175-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_rename. latencyMs=1159; previousMaxLatencyMs=752; operationCount=198; context=rename(gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556191692784728530413_0027_m_000172_57510/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet -> gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/part-00172-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet)\n", + "23/10/06 09:42:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1051; previousMaxLatencyMs=172; operationCount=200; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_20231006090955452778920582844510_0027_m_000198_57536/part-00198-a0adc7ff-71a9-4671-ad1e-0093f9d7d260-c000.snappy.parquet\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11057; previousMaxLatencyMs=1497; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909557457999139377546046_0027_m_000026_57365\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11233; previousMaxLatencyMs=11057; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909551292246187607294419_0027_m_000002_57341\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11402; previousMaxLatencyMs=11233; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909552371970894888794726_0027_m_000025_57364\n", + "23/10/06 09:42:08 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=11583; previousMaxLatencyMs=11402; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909556136722862237844168_0027_m_000013_57352\n", + "23/10/06 09:42:09 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=12651; previousMaxLatencyMs=11583; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553722108484298157195_0027_m_000023_57362\n", + "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13120; previousMaxLatencyMs=12651; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909554704118087127617221_0027_m_000031_57370\n", + "23/10/06 09:42:10 WARN GhfsStorageStatistics: Detected potential high latency for operation op_delete. latencyMs=13440; previousMaxLatencyMs=13120; operationCount=199; context=gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped/_temporary/0/_temporary/attempt_202310060909553545408253172771512_0027_m_000005_57344\n", + " \r" + ] + } + ], + "source": [ + "(\n", + " # To annotate study/locus, study level info and ld panel is needed:\n", + " LDAnnotator.ld_annotate(\n", + " StudyLocus.from_parquet(session, window_based_clumped_output),\n", + " study_index,\n", + " ld_index\n", + " )\n", + " # Clumping linked study-loci together:\n", + " .clump()\n", + " .df.write.mode(\"overwrite\").parquet(ld_clumped_output)\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3ec08141", + "metadata": {}, + "source": [ + "## 5. PICS - finemapping." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "aab9d72e", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T09:50:46.179833Z", + "start_time": "2023-10-06T09:49:25.408253Z" + } + }, + "outputs": [ { - "cell_type": "markdown", - "id": "3ec08141", - "metadata": {}, - "source": [ - "## 5. PICS - finemapping." - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 09:50:16 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1081; previousMaxLatencyMs=1051; operationCount=396; context=gs://ot-team/dsuveges/finngen/2023.10.06_PICSed/_temporary/0/_temporary/attempt_202310060949259143728196112407547_0033_m_000193_57732/part-00193-9d4ae5b4-a18c-4406-bd26-9387e62477de-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "(\n", + " # The previously generated LD clumped dataset is read as StudyLocus:\n", + " PICS.finemap(StudyLocus.from_parquet(session, ld_clumped_output))\n", + " .annotate_credible_sets()\n", + " .df.write.mode(\"overwrite\").parquet(picsed_output)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0bc2cb6e", + "metadata": {}, + "source": [ + "## QC results - Sumstats" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "7cbeab8b", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:40:53.295506Z", + "start_time": "2023-10-06T10:26:04.284592Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 21, - "id": "aab9d72e", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T09:50:46.179833Z", - "start_time": "2023-10-06T09:49:25.408253Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 09:50:16 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=1081; previousMaxLatencyMs=1051; operationCount=396; context=gs://ot-team/dsuveges/finngen/2023.10.06_PICSed/_temporary/0/_temporary/attempt_202310060949259143728196112407547_0033_m_000193_57732/part-00193-9d4ae5b4-a18c-4406-bd26-9387e62477de-c000.snappy.parquet\n", - " \r" - ] - } - ], - "source": [ - "(\n", - " # The previously generated LD clumped dataset is read as StudyLocus:\n", - " PICS.finemap(StudyLocus.from_parquet(session, ld_clumped_output))\n", - " .annotate_credible_sets()\n", - " .df.write.mode('overwrite').parquet(picsed_output)\n", - ")" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:26:41 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=572; previousMaxLatencyMs=460; operationCount=925353; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", + "[Stage 57:===========================================> (3 + 1) / 4]\r" + ] }, { - "cell_type": "markdown", - "id": "0bc2cb6e", - "metadata": {}, - "source": [ - "## QC results - Sumstats" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "In the Finngen dataset, there are 45,820,490,260 associations from 2,272 studies.\n" + ] }, { - "cell_type": "code", - "execution_count": 35, - "id": "7cbeab8b", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:40:53.295506Z", - "start_time": "2023-10-06T10:26:04.284592Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 10:26:41 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_operations. latencyMs=572; previousMaxLatencyMs=460; operationCount=925353; context=gs://dataproc-temp-europe-west1-426265110888-ymkbpaze/64dcfdf8-46d3-4b5c-aad4-0a12ee0ba91a/spark-job-history/local-1696579691428.inprogress\n", - "[Stage 57:===========================================> (3 + 1) / 4]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "In the Finngen dataset, there are 45,820,490,260 associations from 2,272 studies.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "assoc_count = finngen_sumstats.df.count()\n", - "study_count = finngen_sumstats.df.select('studyId').distinct().count()\n", - "\n", - "print(f'In the Finngen dataset, there are {assoc_count:,} associations from {study_count:,} studies.')" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "assoc_count = finngen_sumstats.df.count()\n", + "study_count = finngen_sumstats.df.select(\"studyId\").distinct().count()\n" + ] + }, + { + "cell_type": "markdown", + "id": "19f94399", + "metadata": {}, + "source": [ + "## QC results - Window based clumping" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "5ff794d4", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:41:39.724996Z", + "start_time": "2023-10-06T10:41:38.322389Z" + } + }, + "outputs": [ { - "cell_type": "markdown", - "id": "19f94399", - "metadata": {}, - "source": [ - "## QC results - Window based clumping" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "In the window based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" + ] + } + ], + "source": [ + "windowed_count = session.spark.read.parquet(window_based_clumped_output).count()\n", + "windowed_studies = session.spark.read.parquet(window_based_clumped_output).select(\"studyId\").distinct().count()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d88b0d87", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:08:22.129308Z", + "start_time": "2023-10-06T10:08:18.802493Z" + } + }, + "source": [ + "## QC results - LD clumping" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3cd88471", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:43:29.370733Z", + "start_time": "2023-10-06T10:43:26.646342Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 37, - "id": "5ff794d4", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:41:39.724996Z", - "start_time": "2023-10-06T10:41:38.322389Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "In the window based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" - ] - } - ], - "source": [ - "windowed_count = session.spark.read.parquet(window_based_clumped_output).count()\n", - "windowed_studies = session.spark.read.parquet(window_based_clumped_output).select('studyId').distinct().count()\n", - "\n", - "print(f'In the window based cluped dataset, there are {windowed_count:,} semi-indices, from {windowed_studies:,} studies.')\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 87:======================================================> (28 + 1) / 29]\r" + ] }, { - "cell_type": "markdown", - "id": "d88b0d87", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:08:22.129308Z", - "start_time": "2023-10-06T10:08:18.802493Z" - } - }, - "source": [ - "## QC results - LD clumping" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "In the LD based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" + ] }, { - "cell_type": "code", - "execution_count": 38, - "id": "3cd88471", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:43:29.370733Z", - "start_time": "2023-10-06T10:43:26.646342Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 87:======================================================> (28 + 1) / 29]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "In the LD based cluped dataset, there are 19,005 semi-indices, from 1,387 studies.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "ld_clumped_df = session.spark.read.parquet(ld_clumped_output)\n", - "\n", - "windowed_count = ld_clumped_df.count()\n", - "windowed_studies = ld_clumped_df.select('studyId').distinct().count()\n", - "\n", - "print(f'In the LD based cluped dataset, there are {windowed_count:,} semi-indices, from {windowed_studies:,} studies.')\n" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "ld_clumped_df = session.spark.read.parquet(ld_clumped_output)\n", + "\n", + "windowed_count = ld_clumped_df.count()\n", + "windowed_studies = ld_clumped_df.select(\"studyId\").distinct().count()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "d9d002d0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:44:36.008520Z", + "start_time": "2023-10-06T10:44:34.483964Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 40, - "id": "d9d002d0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:44:36.008520Z", - "start_time": "2023-10-06T10:44:34.483964Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 93:====================================================> (27 + 2) / 29]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------+-----+\n", - "|qualityControls |count|\n", - "+--------------------------------------------------------------+-----+\n", - "|[Variant not found in LD reference] |4706 |\n", - "|[] |13714|\n", - "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", - "+--------------------------------------------------------------+-----+\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "ld_clumped_df.groupBy('qualityControls').count().show(truncate=False)" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 93:====================================================> (27 + 2) / 29]\r" + ] }, { - "cell_type": "markdown", - "id": "7a3be915", - "metadata": {}, - "source": [ - "## QC results - PICS" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------+-----+\n", + "|qualityControls |count|\n", + "+--------------------------------------------------------------+-----+\n", + "|[Variant not found in LD reference] |4706 |\n", + "|[] |13714|\n", + "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", + "+--------------------------------------------------------------+-----+\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": 43, - "id": "b1ddd53c", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T10:59:16.339543Z", - "start_time": "2023-10-06T10:59:15.930105Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0-----------------------------------------------\n", - " variantId | 20_35437976_G_A \n", - " chromosome | 20 \n", - " studyId | FINNGEN_R9_HEIGHT... \n", - " position | 35437976 \n", - " pValueMantissa | 3.811 \n", - " pValueExponent | -193 \n", - " beta | -0.0551669 \n", - " standardError | 0.00186085 \n", - " effectAlleleFrequencyFromSource | 0.5599 \n", - " betaConfidenceIntervalLower | -0.05702774999999... \n", - " betaConfidenceIntervalUpper | -0.05330605 \n", - " studyLocusId | 5242723067793949472 \n", - " qualityControls | [Variant not foun... \n", - " ldSet | null \n", - " locus | null \n", - "only showing top 1 row\n", - "\n", - "root\n", - " |-- variantId: string (nullable = true)\n", - " |-- chromosome: string (nullable = true)\n", - " |-- studyId: string (nullable = true)\n", - " |-- position: integer (nullable = true)\n", - " |-- pValueMantissa: float (nullable = true)\n", - " |-- pValueExponent: integer (nullable = true)\n", - " |-- beta: double (nullable = true)\n", - " |-- standardError: double (nullable = true)\n", - " |-- effectAlleleFrequencyFromSource: float (nullable = true)\n", - " |-- betaConfidenceIntervalLower: double (nullable = true)\n", - " |-- betaConfidenceIntervalUpper: double (nullable = true)\n", - " |-- studyLocusId: long (nullable = true)\n", - " |-- qualityControls: array (nullable = true)\n", - " | |-- element: string (containsNull = true)\n", - " |-- ldSet: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- tagVariantId: string (nullable = true)\n", - " | | |-- r2Overall: double (nullable = true)\n", - " |-- locus: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- variantId: string (nullable = true)\n", - " | | |-- r2Overall: double (nullable = true)\n", - " | | |-- posteriorProbability: double (nullable = true)\n", - " | | |-- standardError: double (nullable = true)\n", - " | | |-- is95CredibleSet: boolean (nullable = true)\n", - " | | |-- is99CredibleSet: boolean (nullable = true)\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/06 10:59:16 WARN CacheManager: Asked to cache already cached data.\n" - ] - }, - { - "data": { - "text/plain": [ - "19005" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "picsed_df = session.spark.read.parquet(picsed_output).persist()\n", - "picsed_df.show(1, vertical=True)\n", - "picsed_df.printSchema()\n", - "picsed_df.count()\n" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "ld_clumped_df.groupBy(\"qualityControls\").count().show(truncate=False)" + ] + }, + { + "cell_type": "markdown", + "id": "7a3be915", + "metadata": {}, + "source": [ + "## QC results - PICS" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "b1ddd53c", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T10:59:16.339543Z", + "start_time": "2023-10-06T10:59:15.930105Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 59, - "id": "937e1eb0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-06T11:11:55.487431Z", - "start_time": "2023-10-06T11:11:54.898030Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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zZs317Rp02Sz2RQdHa1du3bp7bffNts8cOBApa6gTJkyRS+//LIef/xxSdLbb7+tdevWafr06frjH/9Y6XE7f/683n//fd1+++2SpBEjRuj111+XJNWvX18+Pj4qLS1VSEhIpdusiloViAAAqMsWLFigp59+Wrfeeqs8PDx0zz33KCkpSTt27JAkDRgwwKyNiYlRbGysIiIitGLFCvXr10+GYVzT98XGxpr//vrrr3Xu3DkzIF1UVlamu+++W9KPDytu3769y13WF8PTRZW5m7u4uFhHjx5Vx44dXfZ37NhRX3755TWdg6+vrxmGJCk0NFSFhYXX1IY7EIgAAHCT22+/XRs2bNDp06dVXFys0NBQDRgwQJGRkZetDw0NVUREhDkzdPEOsn//+98Vgsrl+Pn5mf++cOGCJGnFihW69dZbXersdrskVSpwRUVFae/evT9bJ1390Ti33HJLhe88f/58hTa8vLwqtHmtwdAdavxJ1QAA3Gz8/PwUGhqqoqIirVq16rLrcSTpxIkTOnz4sPl4mYSEBAUGBmry5MmXrb/as4Jat24tu92ub7/9Vi1atHDZLj42pnXr1hVu8b/0c1JSkvbv369PP/20wncYhiGn06kGDRooLCzMZW2UJG3atEmtWrWSJDVp0kSSzAXS0o+Lqq+Vt7e3y/tJbxQCEQAAbrJq1SplZmYqLy9PWVlZ6tKli6Kjo/XUU0+ppKREqamp2rx5sw4ePKj169froYceUmBgoB555BFJPwapP/3pT1qxYoUSExO1Zs0aHTx4UNu3b9e4ceM0fPjwK363v7+/UlNT9dJLL2n+/Pn65ptvtHPnTv3xj380n300fPhwffPNNxozZoz27dunxYsXa968eS7t9O/fXwMGDNATTzyh9PR0bd++XYcOHdJnn32m7t27a926dZKkX/3qV3r77bf18ccfa9++fXrllVeUm5ur0aNHS5IZxNLS0rR//36tWLFC77zzzjWP6W233aavvvpK+/bt0/fff3/ZWSZ3IBABAOAmTqdTL774ou644w4NGjRI9913n1avXi0vLy95eHho165d6tu3r6KiojR48GBFRUVp8+bNLndP9+3bV5s2bZKXl5eSkpJ0xx136IknnpDT6dTEiROv+v1vvPGG/u///k/p6elq1aqVevbsqb///e/mJbtmzZrpk08+0d///ne1bdtW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R1fPyQIAgFqr1q4hysvLU0FBgRISEsx9drtdnTp10qZNmyRJOTk5On/+vEtNWFiYYmJizJrNmzfL4XCYYUiS2rdvL4fDYdZcTmlpqYqLi102AABwc6q1gaigoECSFBwc7LI/ODjYPFZQUCBvb281atToqjVBQUEV2g8KCjJrLic9Pd1cc+RwOBQeHn5d5wMAAGqvWhuILrLZbC6fDcOosO9Sl9Zcrv7n2hk/frycTqe5HT58+Bp7DgAA6opaG4hCQkIkqcIsTmFhoTlrFBISorKyMhUVFV215tixYxXaP378eIXZp5+y2+1q0KCBywYAAG5OtTYQRUZGKiQkRFlZWea+srIybdiwQR06dJAktWvXTl5eXi41+fn52r17t1kTHx8vp9OprVu3mjVbtmyR0+k0awAAgLXV6F1mJSUl+s9//mN+zsvLU25urgICAtSsWTOlpKRo0qRJatmypVq2bKlJkybJ19dXSUlJkiSHw6GhQ4dq7Nixaty4sQICApSamqo2bdqYd521atVKvXr10rBhwzRr1ixJ0rPPPqs+ffpwhxkAAJBUw4Fo+/bt6tKli/l5zJgxkqTBgwdr3rx5GjdunM6ePasXXnhBRUVFiouL0+rVq+Xv72/+zLRp0+Tp6an+/fvr7Nmz6tatm+bNmycPDw+zZtGiRRo1apR5N1piYuIVn30EAACsx2YYhlHTnagLiouL5XA45HQ63b6eaPOcVLe2V1vED51S010AAFhcZf9+19o1RAAAANWFQAQAACyPQAQAACyvRhdV4+Y2LWu/W9p5qUeUW9oBAOBKmCECAACWRyACAACWRyACAACWxxoi3DDtv/3ATS3xPCMAwI3FDBEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8brtHreeuV4BIvAYEAHB5zBABAADLIxABAADLIxABAADLIxABAADLY1E1aj33vRNN4r1oAIDLYYYIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHneZwVLc9RoQXgECADcXZogAAIDlMUMES3HfM414nhEA3EyYIQIAAJZHIAIAAJZHIAIAAJZXqwNRWlqabDabyxYSEmIeNwxDaWlpCgsLk4+Pjzp37qw9e/a4tFFaWqqRI0cqMDBQfn5+SkxM1JEjR6r7VAAAQC1WqwORJN15553Kz883t127dpnHJk+erKlTp2rGjBnatm2bQkJC1KNHD506dcqsSUlJ0bJly5SRkaGNGzeqpKREffr0UXl5eU2cDgAAqIVq/V1mnp6eLrNCFxmGoenTp+vVV19Vv379JEnz589XcHCwFi9erOeee05Op1Nz5szRggUL1L17d0nSwoULFR4erjVr1qhnz57Vei4AAKB2qvWB6MCBAwoLC5PdbldcXJwmTZqk5s2bKy8vTwUFBUpISDBr7Xa7OnXqpE2bNum5555TTk6Ozp8/71ITFhammJgYbdq06aqBqLS0VKWlpebn4uLiG3OCqJN4wCMA3Fxq9SWzuLg4ffTRR1q1apVmz56tgoICdejQQSdOnFBBQYEkKTg42OVngoODzWMFBQXy9vZWo0aNrlhzJenp6XI4HOYWHh7uxjMDAAC1Sa0ORL1799ajjz6qNm3aqHv37lqxYoWkHy+NXWSz2Vx+xjCMCvsuVZma8ePHy+l0mtvhw4ereBYAAKC2q9WB6FJ+fn5q06aNDhw4YK4runSmp7Cw0Jw1CgkJUVlZmYqKiq5YcyV2u10NGjRw2QAAwM2pTgWi0tJS7d27V6GhoYqMjFRISIiysrLM42VlZdqwYYM6dOggSWrXrp28vLxcavLz87V7926zBgAAoFYvqk5NTdVDDz2kZs2aqbCwUBMnTlRxcbEGDx4sm82mlJQUTZo0SS1btlTLli01adIk+fr6KikpSZLkcDg0dOhQjR07Vo0bN1ZAQIBSU1PNS3AAAABSLQ9ER44c0RNPPKHvv/9eTZo0Ufv27ZWdna2IiAhJ0rhx43T27Fm98MILKioqUlxcnFavXi1/f3+zjWnTpsnT01P9+/fX2bNn1a1bN82bN08eHh41dVoAAKCWsRmGYdR0J+qC4uJiORwOOZ1Ot68n2jwn1a3t4cbLbvasW9rhtnsAuLEq+/e7Vs8QAbVV+28/cFNLU9zUDgDgehCIgBrEAx4BoHaoU3eZAQAA3AgEIgAAYHkEIgAAYHkEIgAAYHksqgZqkLvuVpuWxWMAAOB6MEMEAAAsj0AEAAAsj0AEAAAsjzVEwE2AtUgAcH2YIQIAAJZHIAIAAJbHJTMAbsc72gDUNQQiACZ3rUXKbuaetUgAUF24ZAYAACyPGSIAtRaX3gBUFwIRgFrLXZfwpCluagfAzYpLZgAAwPKYIQKASnLXJTx34VIg4D4EIgBu575LXe5R24KMu7DGCnAfAhEAVBKPJQBuXqwhAgAAlscMEQBUs9o208SlN4BABABwE4IV6jICEYCbXm1b5I2rI1hdHeNzYxCIAAA3pZv17kJ3IVi5IhABQB1V22a+uHsOdRmBCABQq9S2ReewBgIRAMAtatuMFarHzXLpjUAEALgpMdOEa2GpBzO+9957ioyMVL169dSuXTv985//rOkuAQCAWsAyM0Qff/yxUlJS9N5776ljx46aNWuWevfura+//lrNmjWr6e4BAGopZpqswTIzRFOnTtXQoUP1zDPPqFWrVpo+fbrCw8M1c+bMmu4aAACoYZaYISorK1NOTo5eeeUVl/0JCQnatGnTZX+mtLRUpaWl5men0ylJKi4udnv/Tp8t/fkiAECd1mbfH9zSzramT7mlndrmRvx9/Wm7hmFctc4Sgej7779XeXm5goODXfYHBweroKDgsj+Tnp6u3/72txX2h4eH35A+AgBQOTNqugM3xIQb3P6pU6fkcDiueNwSgegim83m8tkwjAr7Lho/frzGjBljfr5w4YL+97//qXHjxlf8mcooLi5WeHi4Dh8+rAYNGlS5HVQO4129GO/qxXhXL8a7erlrvA3D0KlTpxQWFnbVOksEosDAQHl4eFSYDSosLKwwa3SR3W6X3W532dewYUO39alBgwb8F6oaMd7Vi/GuXox39WK8q5c7xvtqM0MXWWJRtbe3t9q1a6esrCyX/VlZWerQoUMN9QoAANQWlpghkqQxY8YoOTlZsbGxio+P1wcffKBvv/1Ww4cPr+muAQCAGmaZQDRgwACdOHFCr7/+uvLz8xUTE6OVK1cqIiKiWvtht9v1m9/8psLlONwYjHf1YryrF+NdvRjv6lXd420zfu4+NAAAgJucJdYQAQAAXA2BCAAAWB6BCAAAWB6BCAAAWB6BqBq99957ioyMVL169dSuXTv985//rOku3RTS09N17733yt/fX0FBQXr44Ye1b98+lxrDMJSWlqawsDD5+Pioc+fO2rNnTw31+OaSnp4um82mlJQUcx/j7V7fffedBg4cqMaNG8vX11e/+MUvlJOTYx5nvN3nhx9+0K9//WtFRkbKx8dHzZs31+uvv64LFy6YNYx31X3xxRd66KGHFBYWJpvNpr/97W8uxysztqWlpRo5cqQCAwPl5+enxMREHTly5Po7Z6BaZGRk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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "(\n", - " picsed_df\n", - " .filter(f.col('locus').isNotNull())\n", - " .select(\n", - " 'studyId',\n", - " 'variantId',\n", - " f.aggregate(\n", - " f.transform(\n", - " f.col('locus'),\n", - " lambda locus: f.when(locus.is99CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", - " ),\n", - " f.lit(0.0),\n", - " lambda summa, value: summa + value\n", - " ).alias('99CredCount'),\n", - " f.aggregate(\n", - " f.transform(\n", - " f.col('locus'),\n", - " lambda locus: f.when(locus.is95CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", - " ),\n", - " f.lit(0.0),\n", - " lambda summa, value: summa + value\n", - " ).alias('95CredCount'),\n", - " )\n", - "# .orderBy(f.col('99CredCount').desc())\n", - "# .show()\n", - " .filter(f.col('99CredCount') < 100)\n", - "# .count()\n", - " .toPandas()\n", - " [['99CredCount', '95CredCount']]\n", - " .plot.hist(bins=25, alpha=0.5, label='Credible set size')\n", - ")" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-----------------------------------------------\n", + " variantId | 20_35437976_G_A \n", + " chromosome | 20 \n", + " studyId | FINNGEN_R9_HEIGHT... \n", + " position | 35437976 \n", + " pValueMantissa | 3.811 \n", + " pValueExponent | -193 \n", + " beta | -0.0551669 \n", + " standardError | 0.00186085 \n", + " effectAlleleFrequencyFromSource | 0.5599 \n", + " betaConfidenceIntervalLower | -0.05702774999999... \n", + " betaConfidenceIntervalUpper | -0.05330605 \n", + " studyLocusId | 5242723067793949472 \n", + " qualityControls | [Variant not foun... \n", + " ldSet | null \n", + " locus | null \n", + "only showing top 1 row\n", + "\n", + "root\n", + " |-- variantId: string (nullable = true)\n", + " |-- chromosome: string (nullable = true)\n", + " |-- studyId: string (nullable = true)\n", + " |-- position: integer (nullable = true)\n", + " |-- pValueMantissa: float (nullable = true)\n", + " |-- pValueExponent: integer (nullable = true)\n", + " |-- beta: double (nullable = true)\n", + " |-- standardError: double (nullable = true)\n", + " |-- effectAlleleFrequencyFromSource: float (nullable = true)\n", + " |-- betaConfidenceIntervalLower: double (nullable = true)\n", + " |-- betaConfidenceIntervalUpper: double (nullable = true)\n", + " |-- studyLocusId: long (nullable = true)\n", + " |-- qualityControls: array (nullable = true)\n", + " | |-- element: string (containsNull = true)\n", + " |-- ldSet: array (nullable = true)\n", + " | |-- element: struct (containsNull = true)\n", + " | | |-- tagVariantId: string (nullable = true)\n", + " | | |-- r2Overall: double (nullable = true)\n", + " |-- locus: array (nullable = true)\n", + " | |-- element: struct (containsNull = true)\n", + " | | |-- variantId: string (nullable = true)\n", + " | | |-- r2Overall: double (nullable = true)\n", + " | | |-- posteriorProbability: double (nullable = true)\n", + " | | |-- standardError: double (nullable = true)\n", + " | | |-- is95CredibleSet: boolean (nullable = true)\n", + " | | |-- is99CredibleSet: boolean (nullable = true)\n", + "\n" + ] }, { - "cell_type": "markdown", - "id": "a8b99c39", - "metadata": {}, - "source": [ - "## Finngen clumping with locus\n", - "\n", - "- Window width: 500kbp\n", - "- Locus width: 250kbp\n", - "- LD threshold: 0.5\n", - "\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/06 10:59:16 WARN CacheManager: Asked to cache already cached data.\n" + ] }, { - "cell_type": "code", - "execution_count": 2, - "id": "09f14d49", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T09:54:35.337711Z", - "start_time": "2023-10-13T09:54:34.446422Z" - } - }, - "outputs": [], - "source": [ - "# Import:\n", - "from pyspark.sql import functions as f, types as t\n", - "\n", - "from gentropy.common.session import Session\n", - "\n", - "from gentropy.dataset.summary_statistics import SummaryStatistics\n", - "from gentropy.dataset.study_locus import StudyLocus\n", - "from gentropy.dataset.study_index import StudyIndex\n", - "from gentropy.dataset.ld_index import LDIndex\n", - "from gentropy.method.ld import LDAnnotator\n", - "\n", - "from gentropy.method.pics import PICS\n", - "\n", - "# Initialize session:\n", - "session = Session()\n", - "\n", - "# Input:\n", - "sumstats = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*'\n", - "ld_index_path = 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/'\n", - "\n", - "# Output:\n", - "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped'\n", - "picsed_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_PICSed'\n", - "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped'" + "data": { + "text/plain": [ + "19005" ] - }, + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "picsed_df = session.spark.read.parquet(picsed_output).persist()\n", + "picsed_df.show(1, vertical=True)\n", + "picsed_df.printSchema()\n", + "picsed_df.count()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "937e1eb0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-06T11:11:55.487431Z", + "start_time": "2023-10-06T11:11:54.898030Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 16, - "id": "52861491", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T11:39:14.790777Z", - "start_time": "2023-10-13T10:47:20.349271Z" - }, - "code_folding": [], - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/13 10:47:53 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", - "23/10/13 10:47:53 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", - "23/10/13 10:48:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1248; previousMaxLatencyMs=1230; operationCount=59116581; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_OTHER_SYSTCON_FG/chromosome=2/part-00019-1d683f00-9247-401b-846c-8b2498bc68bf.c000.snappy.parquet\n", - "23/10/13 10:49:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1039; previousMaxLatencyMs=1037; operationCount=126124; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_SCISS_BITE_INCLAVO/chromosome=2/part-00018-e37f4a01-bdb4-442f-8dcd-681da303e876.c000.snappy.parquet\n", - "23/10/13 10:52:37 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1917; previousMaxLatencyMs=1039; operationCount=144264; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AUTOIMMUNE_NONTHYROID_STRICT/chromosome=5/part-00006-02537c5f-2dea-47c5-8655-b0d84827115a.c000.snappy.parquet\n", - "23/10/13 10:52:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1942; previousMaxLatencyMs=1248; operationCount=94444057; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_PULPITIS_1_ONLYAVO/chromosome=5/part-00006-de277609-305a-4cec-8bb1-5b37a70be48b.c000.snappy.parquet\n", - "23/10/13 11:07:41 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", - "23/10/13 11:12:32 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", - "23/10/13 11:12:48 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", - "23/10/13 11:21:40 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_H7_CONJUHAEMOR/chromosome=12/part-00016-03e2c019-d707-414b-b4e1-8b6474ccfb26.c000.snappy.parquet'. Sleeping...\n", - "java.net.SocketException: Connection reset\n", - "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", - "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", - "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", - "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", - "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", - "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", - "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", - "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", - "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", - "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", - "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", - "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", - "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:142) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", - "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", - "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", - "23/10/13 11:21:41 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AMN2/chromosome=12/part-00016-6c463da6-b063-495d-8b62-8ad766491cfb.c000.snappy.parquet'. Sleeping...\n", - "java.net.SocketException: Connection reset\n", - "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", - "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", - "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", - "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", - "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", - "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", - "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", - "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", - "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", - "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", - "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", - "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", - "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", - "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", - "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", - "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:170) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", - "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", - "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", - "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", - "23/10/13 11:36:03 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", - "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=202; previousMaxLatencyMs=190; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900962145652452525416_0067_m_000009_79286/part-00009-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=216; previousMaxLatencyMs=202; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003257422348970599913_0067_m_000028_79305/part-00028-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=218; previousMaxLatencyMs=216; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139006484121277706965747_0067_m_000003_79280/part-00003-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:01 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=243; previousMaxLatencyMs=218; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004953018478188900860_0067_m_000023_79300/part-00023-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=165; previousMaxLatencyMs=153; operationCount=92; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003598197994288369319_0067_m_000026_79303/part-00026-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=193; previousMaxLatencyMs=165; operationCount=99; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004279983947938826985_0067_m_000025_79302/part-00025-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=243; previousMaxLatencyMs=193; operationCount=103; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004602145763603687891_0067_m_000030_79307/part-00030-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=329; previousMaxLatencyMs=243; operationCount=104; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900353649088592248874_0067_m_000005_79282/part-00005-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", - " \r" - ] - } - ], - "source": [ - "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", - "\n", - "clump_window_length = 500_000\n", - "locus_window_length = 250_000\n", - "\n", - "(\n", - " SummaryStatistics(\n", - " _df=(\n", - " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", - " .withColumn(\n", - " 'chromosome',\n", - " f.split(f.col('variantId'), '_')[0]\n", - " )\n", - " ),\n", - " _schema=SummaryStatistics.get_schema()\n", - " )\n", - " .window_based_clumping(\n", - " distance=clump_window_length,\n", - " locus_collect_distance=locus_window_length,\n", - " with_locus=True\n", - " )\n", - " .df.write.mode('overwrite')\n", - " .parquet(window_based_clumped_output)\n", - ")\n" + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" }, { - "cell_type": "code", - "execution_count": 18, - "id": "6b234362", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T12:39:15.023402Z", - "start_time": "2023-10-13T11:50:42.603425Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+---------------------+---------+---------+---------------+\n", - "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", - "+--------------------+---------------------+---------+---------+---------------+\n", - "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_H8_EXT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_H7_RET...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_DO...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_PY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "| FINNGEN_R9_GOUT_NOS| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_G6_CER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_L12_UR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_I9_HYP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_M13_AR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "|FINNGEN_R9_K11_AP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", - "+--------------------+---------------------+---------+---------+---------------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "23/10/13 11:55:34 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=676; previousMaxLatencyMs=470; operationCount=333148; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=5/part-00076-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", - "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=279; previousMaxLatencyMs=243; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239103300432709600941830_0086_m_000000_80535/part-00000-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", - "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=335; previousMaxLatencyMs=279; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239106417331548307580589_0086_m_000027_80562/part-00027-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", - " \r" - ] - } - ], - "source": [ - "ld_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus'\n", - "\n", - "studies_df = (\n", - " session.spark.read.parquet(window_based_clumped_output)\n", - " # Generating a list of study identifiers:\n", - " .select('studyId')\n", - " .distinct()\n", - " # Adding fabricated values required to parse as gwas catalog study:\n", - " .select(\n", - " 'studyId',\n", - " StudyIndex.aggregate_and_map_ancestries(\n", - " f.array(\n", - " f.struct(\n", - " f.lit('Finnish').alias('ancestry'),\n", - " f.lit(100).cast('long').alias('sampleSize')\n", - " )\n", - " )\n", - " ).alias('ldPopulationStructure'),\n", - " f.lit('FINNGEN').alias('projectId'),\n", - " f.lit('gwas').alias('studyType'),\n", - " f.lit('cicaful').alias('traitFromSource')\n", - " )\n", - ")\n", - "\n", - "study_index = (\n", - " StudyIndex(\n", - " _df=studies_df,\n", - " _schema=StudyIndex.get_schema()\n", - " )\n", - ")\n", - "\n", - "study_index.df.show()\n", - "\n", - "# Loading ld index:\n", - "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", - "\n", - "(\n", - " # To annotate study/locus, study level info and ld panel is needed:\n", - " LDAnnotator.ld_annotate(\n", - " StudyLocus.from_parquet(session, window_based_clumped_output),\n", - " study_index, \n", - " ld_index\n", - " )\n", - " # Clumping linked study-loci together:\n", - " .clump()\n", - " .df.write.mode('overwrite').parquet(ld_clumped_output)\n", - ")\n", - "\n", - "\n" + "data": { + "image/png": "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zZs317Rp02Sz2RQdHa1du3bp7bffNts8cOBApa6gTJkyRS+//LIef/xxSdLbb7+tdevWafr06frjH/9Y6XE7f/683n//fd1+++2SpBEjRuj111+XJNWvX18+Pj4qLS1VSEhIpdusiloViAAAqMsWLFigp59+Wrfeeqs8PDx0zz33KCkpSTt27JAkDRgwwKyNiYlRbGysIiIitGLFCvXr10+GYVzT98XGxpr//vrrr3Xu3DkzIF1UVlamu+++W9KPDytu3769y13WF8PTRZW5m7u4uFhHjx5Vx44dXfZ37NhRX3755TWdg6+vrxmGJCk0NFSFhYXX1IY7EIgAAHCT22+/XRs2bNDp06dVXFys0NBQDRgwQJGRkZetDw0NVUREhDkzdPEOsn//+98Vgsrl+Pn5mf++cOGCJGnFihW69dZbXersdrskVSpwRUVFae/evT9bJ1390Ti33HJLhe88f/58hTa8vLwqtHmtwdAdavxJ1QAA3Gz8/PwUGhqqoqIirVq16rLrcSTpxIkTOnz4sPl4mYSEBAUGBmry5MmXrb/as4Jat24tu92ub7/9Vi1atHDZLj42pnXr1hVu8b/0c1JSkvbv369PP/20wncYhiGn06kGDRooLCzMZW2UJG3atEmtWrWSJDVp0kSSzAXS0o+Lqq+Vt7e3y/tJbxQCEQAAbrJq1SplZmYqLy9PWVlZ6tKli6Kjo/XUU0+ppKREqamp2rx5sw4ePKj169froYceUmBgoB555BFJPwapP/3pT1qxYoUSExO1Zs0aHTx4UNu3b9e4ceM0fPjwK363v7+/UlNT9dJLL2n+/Pn65ptvtHPnTv3xj380n300fPhwffPNNxozZoz27dunxYsXa968eS7t9O/fXwMGDNATTzyh9PR0bd++XYcOHdJnn32m7t27a926dZKkX/3qV3r77bf18ccfa9++fXrllVeUm5ur0aNHS5IZxNLS0rR//36tWLFC77zzzjWP6W233aavvvpK+/bt0/fff3/ZWSZ3IBABAOAmTqdTL774ou644w4NGjRI9913n1avXi0vLy95eHho165d6tu3r6KiojR48GBFRUVp8+bNLndP9+3bV5s2bZKXl5eSkpJ0xx136IknnpDT6dTEiROv+v1vvPGG/u///k/p6elq1aqVevbsqb///e/mJbtmzZrpk08+0d///ne1bdtW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R1fPyQIAgFqr1q4hysvLU0FBgRISEsx9drtdnTp10qZNmyRJOTk5On/+vEtNWFiYYmJizJrNmzfL4XCYYUiS2rdvL4fDYdZcTmlpqYqLi102AABwc6q1gaigoECSFBwc7LI/ODjYPFZQUCBvb281atToqjVBQUEV2g8KCjJrLic9Pd1cc+RwOBQeHn5d5wMAAGqvWhuILrLZbC6fDcOosO9Sl9Zcrv7n2hk/frycTqe5HT58+Bp7DgAA6opaG4hCQkIkqcIsTmFhoTlrFBISorKyMhUVFV215tixYxXaP378eIXZp5+y2+1q0KCBywYAAG5OtTYQRUZGKiQkRFlZWea+srIybdiwQR06dJAktWvXTl5eXi41+fn52r17t1kTHx8vp9OprVu3mjVbtmyR0+k0awAAgLXV6F1mJSUl+s9//mN+zsvLU25urgICAtSsWTOlpKRo0qRJatmypVq2bKlJkybJ19dXSUlJkiSHw6GhQ4dq7Nixaty4sQICApSamqo2bdqYd521atVKvXr10rBhwzRr1ixJ0rPPPqs+ffpwhxkAAJBUw4Fo+/bt6tKli/l5zJgxkqTBgwdr3rx5GjdunM6ePasXXnhBRUVFiouL0+rVq+Xv72/+zLRp0+Tp6an+/fvr7Nmz6tatm+bNmycPDw+zZtGiRRo1apR5N1piYuIVn30EAACsx2YYhlHTnagLiouL5XA45HQ63b6eaPOcVLe2V1vED51S010AAFhcZf9+19o1RAAAANWFQAQAACyPQAQAACyvRhdV4+Y2LWu/W9p5qUeUW9oBAOBKmCECAACWRyACAACWRyACAACWxxoi3DDtv/3ATS3xPCMAwI3FDBEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8AhEAALA8brtHreeuV4BIvAYEAHB5zBABAADLIxABAADLIxABAADLIxABAADLY1E1aj33vRNN4r1oAIDLYYYIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHneZwVLc9RoQXgECADcXZogAAIDlMUMES3HfM414nhEA3EyYIQIAAJZHIAIAAJZHIAIAAJZXqwNRWlqabDabyxYSEmIeNwxDaWlpCgsLk4+Pjzp37qw9e/a4tFFaWqqRI0cqMDBQfn5+SkxM1JEjR6r7VAAAQC1WqwORJN15553Kz883t127dpnHJk+erKlTp2rGjBnatm2bQkJC1KNHD506dcqsSUlJ0bJly5SRkaGNGzeqpKREffr0UXl5eU2cDgAAqIVq/V1mnp6eLrNCFxmGoenTp+vVV19Vv379JEnz589XcHCwFi9erOeee05Op1Nz5szRggUL1L17d0nSwoULFR4erjVr1qhnz57Vei4AAKB2qvWB6MCBAwoLC5PdbldcXJwmTZqk5s2bKy8vTwUFBUpISDBr7Xa7OnXqpE2bNum5555TTk6Ozp8/71ITFhammJgYbdq06aqBqLS0VKWlpebn4uLiG3OCqJN4wCMA3Fxq9SWzuLg4ffTRR1q1apVmz56tgoICdejQQSdOnFBBQYEkKTg42OVngoODzWMFBQXy9vZWo0aNrlhzJenp6XI4HOYWHh7uxjMDAAC1Sa0ORL1799ajjz6qNm3aqHv37lqxYoWkHy+NXWSz2Vx+xjCMCvsuVZma8ePHy+l0mtvhw4ereBYAAKC2q9WB6FJ+fn5q06aNDhw4YK4runSmp7Cw0Jw1CgkJUVlZmYqKiq5YcyV2u10NGjRw2QAAwM2pTgWi0tJS7d27V6GhoYqMjFRISIiysrLM42VlZdqwYYM6dOggSWrXrp28vLxcavLz87V7926zBgAAoFYvqk5NTdVDDz2kZs2aqbCwUBMnTlRxcbEGDx4sm82mlJQUTZo0SS1btlTLli01adIk+fr6KikpSZLkcDg0dOhQjR07Vo0bN1ZAQIBSU1PNS3AAAABSLQ9ER44c0RNPPKHvv/9eTZo0Ufv27ZWdna2IiAhJ0rhx43T27Fm98MILKioqUlxcnFavXi1/f3+zjWnTpsnT01P9+/fX2bNn1a1bN82bN08eHh41dVoAAKCWsRmGYdR0J+qC4uJiORwOOZ1Ot68n2jwn1a3t4cbLbvasW9rhtnsAuLEq+/e7Vs8QAbVV+28/cFNLU9zUDgDgehCIgBrEAx4BoHaoU3eZAQAA3AgEIgAAYHkEIgAAYHkEIgAAYHksqgZqkLvuVpuWxWMAAOB6MEMEAAAsj0AEAAAsj0AEAAAsjzVEwE2AtUgAcH2YIQIAAJZHIAIAAJbHJTMAbsc72gDUNQQiACZ3rUXKbuaetUgAUF24ZAYAACyPGSIAtRaX3gBUFwIRgFrLXZfwpCluagfAzYpLZgAAwPKYIQKASnLXJTx34VIg4D4EIgBu575LXe5R24KMu7DGCnAfAhEAVBKPJQBuXqwhAgAAlscMEQBUs9o208SlN4BABABwE4IV6jICEYCbXm1b5I2rI1hdHeNzYxCIAAA3pZv17kJ3IVi5IhABQB1V22a+uHsOdRmBCABQq9S2ReewBgIRAMAtatuMFarHzXLpjUAEALgpMdOEa2GpBzO+9957ioyMVL169dSuXTv985//rOkuAQCAWsAyM0Qff/yxUlJS9N5776ljx46aNWuWevfura+//lrNmjWr6e4BAGopZpqswTIzRFOnTtXQoUP1zDPPqFWrVpo+fbrCw8M1c+bMmu4aAACoYZaYISorK1NOTo5eeeUVl/0JCQnatGnTZX+mtLRUpaWl5men0ylJKi4udnv/Tp8t/fkiAECd1mbfH9zSzramT7mlndrmRvx9/Wm7hmFctc4Sgej7779XeXm5goODXfYHBweroKDgsj+Tnp6u3/72txX2h4eH35A+AgBQOTNqugM3xIQb3P6pU6fkcDiueNwSgegim83m8tkwjAr7Lho/frzGjBljfr5w4YL+97//qXHjxlf8mcooLi5WeHi4Dh8+rAYNGlS5HVQO4129GO/qxXhXL8a7erlrvA3D0KlTpxQWFnbVOksEosDAQHl4eFSYDSosLKwwa3SR3W6X3W532dewYUO39alBgwb8F6oaMd7Vi/GuXox39WK8q5c7xvtqM0MXWWJRtbe3t9q1a6esrCyX/VlZWerQoUMN9QoAANQWlpghkqQxY8YoOTlZsbGxio+P1wcffKBvv/1Ww4cPr+muAQCAGmaZQDRgwACdOHFCr7/+uvLz8xUTE6OVK1cqIiKiWvtht9v1m9/8psLlONwYjHf1YryrF+NdvRjv6lXd420zfu4+NAAAgJucJdYQAQAAXA2BCAAAWB6BCAAAWB6BCAAAWB6BqBq99957ioyMVL169dSuXTv985//rOku3RTS09N17733yt/fX0FBQXr44Ye1b98+lxrDMJSWlqawsDD5+Pioc+fO2rNnTw31+OaSnp4um82mlJQUcx/j7V7fffedBg4cqMaNG8vX11e/+MUvlJOTYx5nvN3nhx9+0K9//WtFRkbKx8dHzZs31+uvv64LFy6YNYx31X3xxRd66KGHFBYWJpvNpr/97W8uxysztqWlpRo5cqQCAwPl5+enxMREHTly5Po7Z6BaZGRk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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "(\n", + " picsed_df\n", + " .filter(f.col(\"locus\").isNotNull())\n", + " .select(\n", + " \"studyId\",\n", + " \"variantId\",\n", + " f.aggregate(\n", + " f.transform(\n", + " f.col(\"locus\"),\n", + " lambda locus: f.when(locus.is99CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", + " ),\n", + " f.lit(0.0),\n", + " lambda summa, value: summa + value\n", + " ).alias(\"99CredCount\"),\n", + " f.aggregate(\n", + " f.transform(\n", + " f.col(\"locus\"),\n", + " lambda locus: f.when(locus.is95CredibleSet, f.lit(1.0)).otherwise( f.lit(0.0))\n", + " ),\n", + " f.lit(0.0),\n", + " lambda summa, value: summa + value\n", + " ).alias(\"95CredCount\"),\n", + " )\n", + "# .orderBy(f.col('99CredCount').desc())\n", + "# .show()\n", + " .filter(f.col(\"99CredCount\") < 100)\n", + "# .count()\n", + " .toPandas()\n", + " [[\"99CredCount\", \"95CredCount\"]]\n", + " .plot.hist(bins=25, alpha=0.5, label=\"Credible set size\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a8b99c39", + "metadata": {}, + "source": [ + "## Finngen clumping with locus\n", + "\n", + "- Window width: 500kbp\n", + "- Locus width: 250kbp\n", + "- LD threshold: 0.5\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "09f14d49", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T09:54:35.337711Z", + "start_time": "2023-10-13T09:54:34.446422Z" + } + }, + "outputs": [], + "source": [ + "# Import:\n", + "from pyspark.sql import functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.dataset.ld_index import LDIndex\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "from gentropy.dataset.study_locus import StudyLocus\n", + "from gentropy.dataset.summary_statistics import SummaryStatistics\n", + "from gentropy.method.ld import LDAnnotator\n", + "from gentropy.method.pics import PICS\n", + "\n", + "# Initialize session:\n", + "session = Session()\n", + "\n", + "# Input:\n", + "sumstats = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/*\"\n", + "ld_index_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/\"\n", + "\n", + "# Output:\n", + "ld_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.06_LD_clumped\"\n", + "picsed_output = \"gs://ot-team/dsuveges/finngen/2023.10.06_PICSed\"\n", + "window_based_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.06_window_clumped\"" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "52861491", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T11:39:14.790777Z", + "start_time": "2023-10-13T10:47:20.349271Z" }, + "code_folding": [], + "scrolled": false + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 9, - "id": "f637e3c0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T10:43:26.766382Z", - "start_time": "2023-10-13T10:43:25.980232Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------+-----+\n", - "|qualityControls |count|\n", - "+--------------------------------------------------------------+-----+\n", - "|[Variant not found in LD reference] |4607 |\n", - "|[] |13813|\n", - "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", - "+--------------------------------------------------------------+-----+\n", - "\n" - ] - } - ], - "source": [ - "(\n", - " session.spark.read.parquet(ld_clumped_output)\n", - " .groupBy('qualityControls')\n", - " .count()\n", - "# .show(1, False, True)\n", - " .show(truncate=False)\n", - ")" - ] - }, + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/13 10:47:53 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 10:47:53 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "23/10/13 10:48:19 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1248; previousMaxLatencyMs=1230; operationCount=59116581; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_OTHER_SYSTCON_FG/chromosome=2/part-00019-1d683f00-9247-401b-846c-8b2498bc68bf.c000.snappy.parquet\n", + "23/10/13 10:49:02 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1039; previousMaxLatencyMs=1037; operationCount=126124; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_SCISS_BITE_INCLAVO/chromosome=2/part-00018-e37f4a01-bdb4-442f-8dcd-681da303e876.c000.snappy.parquet\n", + "23/10/13 10:52:37 WARN GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=1917; previousMaxLatencyMs=1039; operationCount=144264; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AUTOIMMUNE_NONTHYROID_STRICT/chromosome=5/part-00006-02537c5f-2dea-47c5-8655-b0d84827115a.c000.snappy.parquet\n", + "23/10/13 10:52:38 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_read_operations. latencyMs=1942; previousMaxLatencyMs=1248; operationCount=94444057; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_K11_PULPITIS_1_ONLYAVO/chromosome=5/part-00006-de277609-305a-4cec-8bb1-5b37a70be48b.c000.snappy.parquet\n", + "23/10/13 11:07:41 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:12:32 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:12:48 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:21:40 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_H7_CONJUHAEMOR/chromosome=12/part-00016-03e2c019-d707-414b-b4e1-8b6474ccfb26.c000.snappy.parquet'. Sleeping...\n", + "java.net.SocketException: Connection reset\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", + "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", + "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", + "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:142) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", + "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", + "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", + "23/10/13 11:21:41 WARN GoogleCloudStorageReadChannel: Failed read retry #1/10 for 'gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/preprocess/finngen/summary_stats/FINNGEN_R9_AMN2/chromosome=12/part-00016-6c463da6-b063-495d-8b62-8ad766491cfb.c000.snappy.parquet'. Sleeping...\n", + "java.net.SocketException: Connection reset\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:186) ~[?:?]\n", + "\tat java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:920) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:884) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:799) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:772) ~[conscrypt-openjdk-2.5.2-linux-x86_64.jar:2.5.2]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat sun.net.www.MeteredStream.read(MeteredStream.java:134) ~[?:?]\n", + "\tat java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:?]\n", + "\tat sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3529) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.api.client.http.javanet.NetHttpResponse$SizeValidatingInputStream.read(NetHttpResponse.java:164) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.BufferedInputStream.read1(BufferedInputStream.java:290) ~[?:?]\n", + "\tat java.io.BufferedInputStream.read(BufferedInputStream.java:351) ~[?:?]\n", + "\tat java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:388) ~[?:?]\n", + "\tat com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageReadChannel.read(GoogleCloudStorageReadChannel.java:315) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.lambda$read$1(GoogleHadoopFSInputStream.java:170) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics.trackDuration(GhfsStorageStatistics.java:77) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat com.google.cloud.hadoop.fs.gcs.GoogleHadoopFSInputStream.read(GoogleHadoopFSInputStream.java:159) ~[gcs-connector-hadoop3-2.2.16.jar:?]\n", + "\tat java.io.DataInputStream.read(DataInputStream.java:149) ~[?:?]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:102) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFullyHeapBuffer(DelegatingSeekableInputStream.java:127) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.io.DelegatingSeekableInputStream.readFully(DelegatingSeekableInputStream.java:91) ~[parquet-common-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader$ConsecutivePartList.readAll(ParquetFileReader.java:1704) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:925) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.parquet.hadoop.ParquetFileReader.readNextFilteredRowGroup(ParquetFileReader.java:972) ~[parquet-hadoop-1.12.2.jar:1.12.2]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.SpecificParquetRecordReaderBase$ParquetRowGroupReaderImpl.readNextRowGroup(SpecificParquetRecordReaderBase.java:320) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.checkEndOfRowGroup(VectorizedParquetRecordReader.java:403) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:324) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:227) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.nextIterator(FileScanRDD.scala:274) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:116) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.FileSourceScanExec$$anon$1.hasNext(DataSourceScanExec.scala:565) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.columnartorow_nextBatch_0$(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) ~[?:?]\n", + "\tat org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760) ~[spark-sql_2.12-3.3.0.jar:3.3.0]\n", + "\tat scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460) ~[scala-library-2.12.14.jar:?]\n", + "\tat org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:170) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.scheduler.Task.run(Task.scala:136) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551) ~[spark-core_2.12-3.3.0.jar:3.3.0]\n", + "\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]\n", + "\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]\n", + "\tat java.lang.Thread.run(Thread.java:829) ~[?:?]\n", + "23/10/13 11:36:03 WARN HintErrorLogger: Hint (strategy=broadcast) is not supported in the query: build right for right outer join.\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=202; previousMaxLatencyMs=190; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900962145652452525416_0067_m_000009_79286/part-00009-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=216; previousMaxLatencyMs=202; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003257422348970599913_0067_m_000028_79305/part-00028-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:00 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=218; previousMaxLatencyMs=216; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139006484121277706965747_0067_m_000003_79280/part-00003-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:01 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=243; previousMaxLatencyMs=218; operationCount=105; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004953018478188900860_0067_m_000023_79300/part-00023-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=165; previousMaxLatencyMs=153; operationCount=92; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139003598197994288369319_0067_m_000026_79303/part-00026-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=193; previousMaxLatencyMs=165; operationCount=99; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004279983947938826985_0067_m_000025_79302/part-00025-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=243; previousMaxLatencyMs=193; operationCount=103; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_202310131139004602145763603687891_0067_m_000030_79307/part-00030-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + "23/10/13 11:39:02 WARN GhfsStorageStatistics: Detected potential high latency for operation stream_write_close_operations. latencyMs=329; previousMaxLatencyMs=243; operationCount=104; context=gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus/_temporary/0/_temporary/attempt_20231013113900353649088592248874_0067_m_000005_79282/part-00005-65e9ae61-ec7d-4672-a525-8de91e583465-c000.snappy.parquet\n", + " \r" + ] + } + ], + "source": [ + "window_based_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus\"\n", + "\n", + "clump_window_length = 500_000\n", + "locus_window_length = 250_000\n", + "\n", + "(\n", + " SummaryStatistics(\n", + " _df=(\n", + " session.spark.read.parquet(sumstats, recursiveFileLookup=True)\n", + " .withColumn(\n", + " \"chromosome\",\n", + " f.split(f.col(\"variantId\"), \"_\")[0]\n", + " )\n", + " ),\n", + " _schema=SummaryStatistics.get_schema()\n", + " )\n", + " .window_based_clumping(\n", + " distance=clump_window_length,\n", + " locus_collect_distance=locus_window_length,\n", + " with_locus=True\n", + " )\n", + " .df.write.mode(\"overwrite\")\n", + " .parquet(window_based_clumped_output)\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6b234362", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T12:39:15.023402Z", + "start_time": "2023-10-13T11:50:42.603425Z" + } + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 29, - "id": "5bf42196", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-13T12:55:39.212186Z", - "start_time": "2023-10-13T12:55:38.131092Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "data": { - "text/plain": [ - "[Row(locus=[Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764322_T_C', pValueMantissa=2.3949999809265137, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0201963, standardError=0.00665169, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764860_G_A', pValueMantissa=1.0499999523162842, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813303, standardError=0.00248194, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765280_C_T', pValueMantissa=7.499000072479248, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147615, standardError=0.00437943, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765335_A_G', pValueMantissa=1.2640000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107816, standardError=0.00189456, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766311_C_T', pValueMantissa=1.0579999685287476, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010837, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766702_A_G', pValueMantissa=1.2059999704360962, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107966, standardError=0.00189453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766923_T_C', pValueMantissa=1.3300000429153442, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010765, standardError=0.00189451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99767090_TTTG_T', pValueMantissa=1.2740000486373901, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107778, standardError=0.00189432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768341_T_C', pValueMantissa=1.2289999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107887, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768718_A_G', pValueMantissa=1.2649999856948853, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107795, standardError=0.0018942, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768993_G_A', pValueMantissa=1.1629999876022339, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108066, standardError=0.00189423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769297_T_C', pValueMantissa=1.2929999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113037, standardError=0.00186275, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769386_C_T', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00670209, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769548_A_G', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0067021, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769607_C_T', pValueMantissa=1.2710000276565552, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107775, standardError=0.00189416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99770233_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108149, standardError=0.00189434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771038_C_A', pValueMantissa=1.1039999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108218, standardError=0.00189392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771332_T_C', pValueMantissa=1.284999966621399, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00972726, standardError=0.00390986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771548_C_T', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108168, standardError=0.00189473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774249_G_A', pValueMantissa=1.0410000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813435, standardError=0.00248058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774476_AT_A', pValueMantissa=1.1540000438690186, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108061, standardError=0.0018937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777761_G_A', pValueMantissa=2.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0857961, standardError=0.0393337, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777984_T_G', pValueMantissa=9.097999572753906, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108749, standardError=0.00189236, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778063_G_A', pValueMantissa=1.2730000019073486, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00887632, standardError=0.00203368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778821_G_A', pValueMantissa=1.6679999828338623, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00682868, standardError=0.00285271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99779613_C_G', pValueMantissa=7.630000114440918, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109299, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781296_A_G', pValueMantissa=8.560999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010892, standardError=0.00189195, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781822_G_A', pValueMantissa=1.4390000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00689344, standardError=0.00281655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781826_A_G', pValueMantissa=7.65500020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109284, standardError=0.00189207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99782821_C_T', pValueMantissa=1.3680000305175781, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00573303, standardError=0.00232523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783206_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783290_A_C', pValueMantissa=8.821999549865723, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108841, standardError=0.00189224, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784269_C_T', pValueMantissa=9.149999618530273, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108721, standardError=0.00189218, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784331_G_A', pValueMantissa=4.435999870300293, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0327234, standardError=0.0162747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784751_C_A', pValueMantissa=3.0409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.149822, standardError=0.0692119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99785581_A_G', pValueMantissa=7.164000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113888, standardError=0.00423514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99786875_C_T', pValueMantissa=5.257999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110515, standardError=0.00189278, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787050_C_G', pValueMantissa=6.671999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109731, standardError=0.00189226, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787264_C_A', pValueMantissa=7.834000110626221, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109198, standardError=0.00189186, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787285_C_T', pValueMantissa=9.189000129699707, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108723, standardError=0.00189246, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787359_T_G', pValueMantissa=7.504000186920166, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109356, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787460_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787461_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787483_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787568_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787571_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787694_A_AT', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787855_C_T', pValueMantissa=8.937999725341797, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108798, standardError=0.00189223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787860_C_T', pValueMantissa=7.64300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0231471, standardError=0.0086776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787890_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787906_T_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787915_T_G', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788026_C_T', pValueMantissa=7.7870001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.00189252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788420_A_C', pValueMantissa=7.001999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109573, standardError=0.00189216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788711_G_A', pValueMantissa=1.0420000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108302, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788859_C_T', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788952_C_T', pValueMantissa=9.12399959564209, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108727, standardError=0.00189214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789038_A_G', pValueMantissa=7.164000034332275, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109498, standardError=0.00189212, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789217_G_C', pValueMantissa=7.72599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109277, standardError=0.00189247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789506_G_C', pValueMantissa=7.671000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109278, standardError=0.00189209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789829_T_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790008_G_A', pValueMantissa=7.603000164031982, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109305, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790154_G_A', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790319_T_G', pValueMantissa=7.857999801635742, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109213, standardError=0.00189229, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791174_G_A', pValueMantissa=7.623000144958496, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0276216, standardError=0.00820577, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791224_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793129_A_T', pValueMantissa=9.17300033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108711, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793502_C_T', pValueMantissa=1.0099999904632568, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108395, standardError=0.00189201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793829_C_CGTAT', pValueMantissa=3.756999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.201946, standardError=0.0971122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794292_T_A', pValueMantissa=1.8420000076293945, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0427514, standardError=0.0181376, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794803_C_G', pValueMantissa=3.76200008392334, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0754336, standardError=0.0362844, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797363_G_A', pValueMantissa=2.696000099182129, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0451691, standardError=0.0204184, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797572_A_C', pValueMantissa=7.729000091552734, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.0018921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798877_A_T', pValueMantissa=5.47599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111187, standardError=0.0019065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798989_G_T', pValueMantissa=4.708000183105469, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00645552, standardError=0.00184611, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99799669_G_A', pValueMantissa=1.3769999742507935, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0283588, standardError=0.0115134, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801055_G_A', pValueMantissa=5.751999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0863438, standardError=0.0312661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801648_T_C', pValueMantissa=5.201000213623047, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.35431, standardError=0.126797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99802216_C_T', pValueMantissa=8.795999526977539, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312825, standardError=0.00584722, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99803737_A_G', pValueMantissa=4.105000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0838538, standardError=0.0410448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804058_G_A', pValueMantissa=9.253999710083008, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00819335, standardError=0.00247362, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804255_C_G', pValueMantissa=8.798999786376953, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312823, standardError=0.00584723, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804875_C_T', pValueMantissa=2.2079999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0532293, standardError=0.023254, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805400_A_G', pValueMantissa=5.626999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0215236, standardError=0.00777382, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805994_G_A', pValueMantissa=1.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125221, standardError=0.00522031, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806253_C_T', pValueMantissa=1.2120000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00800751, standardError=0.00247451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806469_CAT_C', pValueMantissa=1.996999979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01596, standardError=0.00685871, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807109_T_A', pValueMantissa=3.994999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0097045, standardError=0.00274107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807669_A_G', pValueMantissa=4.577000141143799, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111561, standardError=0.00190316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807962_A_G', pValueMantissa=3.7709999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0677375, standardError=0.0325981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809156_C_A', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696552, standardError=0.0028632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809726_T_C', pValueMantissa=4.446000099182129, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111654, standardError=0.00190318, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809873_G_A', pValueMantissa=4.642000198364258, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.122379, standardError=0.0614495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811236_C_A', pValueMantissa=7.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110215, standardError=0.00190371, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811771_C_T', pValueMantissa=4.526000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111597, standardError=0.00190317, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815174_G_C', pValueMantissa=6.111000061035156, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110649, standardError=0.00190324, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815628_A_G', pValueMantissa=9.194999694824219, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211397, standardError=0.00637879, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815640_A_G', pValueMantissa=8.413999557495117, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0902758, standardError=0.0342605, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816387_G_A', pValueMantissa=4.604000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0346061, standardError=0.0173466, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816562_G_A', pValueMantissa=3.677000045776367, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00976812, standardError=0.00274214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816570_G_A', pValueMantissa=1.152999997138977, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804666, standardError=0.00247569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99817203_T_C', pValueMantissa=7.421999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110057, standardError=0.00190374, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99818525_T_C', pValueMantissa=1.4880000352859497, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0186574, standardError=0.0076615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99819195_T_G', pValueMantissa=6.382999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124767, standardError=0.0045745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99820908_A_G', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696602, standardError=0.0028633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821086_GA_G', pValueMantissa=3.259999990463257, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113261, standardError=0.00272622, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821094_C_T', pValueMantissa=4.098999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112471, standardError=0.00191273, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821955_T_G', pValueMantissa=4.670000076293945, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112087, standardError=0.00191323, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822427_T_C', pValueMantissa=2.058000087738037, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115151, standardError=0.00192136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822696_T_C', pValueMantissa=7.763000011444092, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.162918, standardError=0.0611962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823047_A_G', pValueMantissa=7.198999881744385, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110742, standardError=0.0019139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823280_T_C', pValueMantissa=1.1619999408721924, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804213, standardError=0.00247592, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825419_A_G', pValueMantissa=1.2710000276565552, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0826158, standardError=0.0331567, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825752_T_C', pValueMantissa=6.0370001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111297, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825835_C_T', pValueMantissa=6.0320000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111299, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99827260_C_T', pValueMantissa=3.6500000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0489284, standardError=0.0233964, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828083_C_T', pValueMantissa=3.938999891281128, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0959414, standardError=0.0465714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828402_T_A', pValueMantissa=9.142000198364258, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211518, standardError=0.00637931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828407_A_T', pValueMantissa=9.133999824523926, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211533, standardError=0.0063793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829453_A_AT', pValueMantissa=6.083000183105469, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111253, standardError=0.00191338, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829545_ATATTT_A', pValueMantissa=4.810999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112061, standardError=0.00191441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830168_G_A', pValueMantissa=1.218999981880188, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00801018, standardError=0.00247653, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830263_G_A', pValueMantissa=1.6970000267028809, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0179959, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832187_T_C', pValueMantissa=4.421000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112213, standardError=0.0019124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832400_AAC_A', pValueMantissa=6.706999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110021, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832402_C_CTGTGTGT', pValueMantissa=6.710999965667725, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110019, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832563_A_G', pValueMantissa=1.4479999542236328, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0090241, standardError=0.00187287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832865_A_G', pValueMantissa=4.169000148773193, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0105412, standardError=0.00192234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834145_G_C', pValueMantissa=6.802999973297119, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.260334, standardError=0.0961939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834214_T_C', pValueMantissa=1.784000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0474718, standardError=0.0200386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99835361_G_A', pValueMantissa=2.0769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0595141, standardError=0.0257408, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99841479_C_T', pValueMantissa=6.188000202178955, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104861, standardError=0.00193711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99842816_A_G', pValueMantissa=8.645000457763672, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00723726, standardError=0.00184352, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844024_C_G', pValueMantissa=2.3450000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107969, standardError=0.00193341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844450_C_T', pValueMantissa=2.874000072479248, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107269, standardError=0.00193316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845178_C_T', pValueMantissa=4.0320000648498535, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0656125, standardError=0.0319983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845936_A_G', pValueMantissa=3.069999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00675859, standardError=0.00312767, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99848765_C_G', pValueMantissa=2.8910000324249268, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114511, standardError=0.00192855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99850966_A_G', pValueMantissa=8.373000144958496, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101864, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99852563_C_T', pValueMantissa=4.5329999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113089, standardError=0.0019287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99853411_T_TG', pValueMantissa=9.414999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00193121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856822_A_G', pValueMantissa=2.7119998931884766, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114876, standardError=0.00193129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856987_G_C', pValueMantissa=5.239999771118164, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010358, standardError=0.001903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857429_C_T', pValueMantissa=1.718000054359436, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116617, standardError=0.00193637, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857502_A_G', pValueMantissa=6.296000003814697, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010296, standardError=0.00190308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857670_G_A', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857979_C_T', pValueMantissa=2.5840001106262207, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00775769, standardError=0.00184386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858035_C_T', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858181_G_C', pValueMantissa=2.7920000553131104, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114783, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858624_T_C', pValueMantissa=6.314000129699707, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103011, standardError=0.0019042, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859267_C_A', pValueMantissa=1.5019999742507935, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0239274, standardError=0.00753783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859558_G_A', pValueMantissa=6.2779998779296875, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0321283, standardError=0.00593792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859674_G_A', pValueMantissa=1.1050000190734863, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100907, standardError=0.00190082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861014_C_G', pValueMantissa=1.350000023841858, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080568, standardError=0.00185135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861191_A_G', pValueMantissa=2.062000036239624, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00788332, standardError=0.00185141, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861743_A_C', pValueMantissa=1.621999979019165, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00893977, standardError=0.00186417, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861975_TTGG_T', pValueMantissa=1.5509999990463257, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00895366, standardError=0.00186357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99862766_C_T', pValueMantissa=1.7289999723434448, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00993376, standardError=0.0019007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863009_T_C', pValueMantissa=1.3009999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0535743, standardError=0.0215732, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863999_T_C', pValueMantissa=1.4730000495910645, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0137073, standardError=0.00361145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864093_A_C', pValueMantissa=5.741000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322238, standardError=0.00593803, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864115_G_T', pValueMantissa=7.295000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.150642, standardError=0.0445916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865012_T_C', pValueMantissa=2.450000047683716, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00781456, standardError=0.00185205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865013_G_A', pValueMantissa=1.7259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159887, standardError=0.00510203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865261_T_C', pValueMantissa=1.4459999799728394, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999453, standardError=0.00190036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865337_G_GAAGA', pValueMantissa=1.3170000314712524, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00806712, standardError=0.00185143, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865513_C_G', pValueMantissa=1.3250000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080656, standardError=0.00185165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99866792_C_T', pValueMantissa=1.4500000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00803164, standardError=0.00185225, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867170_C_T', pValueMantissa=8.121000289916992, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00192825, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867197_T_C', pValueMantissa=2.680999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0171717, standardError=0.00775509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867487_C_G', pValueMantissa=2.8310000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.359987, standardError=0.164156, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867528_G_T', pValueMantissa=2.8389999866485596, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0077156, standardError=0.0018432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868259_G_A', pValueMantissa=2.265000104904175, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.119984, standardError=0.0392983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868412_T_G', pValueMantissa=1.6779999732971191, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994383, standardError=0.00190064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868443_A_G', pValueMantissa=1.4809999465942383, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00801978, standardError=0.0018515, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868585_TC_T', pValueMantissa=1.437999963760376, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080333, standardError=0.00185188, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868691_T_G', pValueMantissa=1.4730000495910645, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00802444, standardError=0.00185208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99869742_G_A', pValueMantissa=4.677000045776367, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101608, standardError=0.00185986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870037_G_A', pValueMantissa=3.996999979019165, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0939625, standardError=0.0326443, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870234_G_A', pValueMantissa=2.5759999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0270256, standardError=0.00896575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871164_A_T', pValueMantissa=9.444999694824219, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101485, standardError=0.0019015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871248_A_C', pValueMantissa=4.265999794006348, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011332, standardError=0.00192934, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871256_C_T', pValueMantissa=1.0980000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100932, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871596_T_C', pValueMantissa=1.097000002861023, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871838_G_C', pValueMantissa=4.270999908447266, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113316, standardError=0.00192933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871912_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872008_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100927, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872112_C_T', pValueMantissa=1.093000054359436, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100944, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872802_A_G', pValueMantissa=2.828000068664551, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103237, standardError=0.00185953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873074_C_T', pValueMantissa=4.716000080108643, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112996, standardError=0.00192927, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873158_C_T', pValueMantissa=1.1759999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010069, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873263_C_T', pValueMantissa=1.1440000534057617, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010071, standardError=0.00189938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873471_G_A', pValueMantissa=6.283999919891357, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0723658, standardError=0.0264824, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873553_C_T', pValueMantissa=1.8109999895095825, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122764, standardError=0.00286365, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873602_C_T', pValueMantissa=3.7880001068115234, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185958, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874022_C_T', pValueMantissa=3.7920000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874186_C_CT', pValueMantissa=1.2230000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100561, standardError=0.00190097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875195_T_C', pValueMantissa=4.964000225067139, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112867, standardError=0.00192988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875202_G_T', pValueMantissa=1.312999963760376, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100339, standardError=0.00190142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875320_C_A', pValueMantissa=1.2369999885559082, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100535, standardError=0.00190119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875381_T_C', pValueMantissa=1.2410000562667847, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100525, standardError=0.00190121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875452_C_T', pValueMantissa=2.5290000438690186, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0135056, standardError=0.00447237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875704_T_A', pValueMantissa=2.9600000381469727, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00410906, standardError=0.00188882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875760_A_AG', pValueMantissa=1.2430000305175781, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010052, standardError=0.00190125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876031_G_GT', pValueMantissa=1.3940000534057617, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0240895, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876891_T_C', pValueMantissa=3.986999988555908, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102146, standardError=0.0018601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878758_G_A', pValueMantissa=2.763000011444092, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.151851, standardError=0.0689453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878850_C_G', pValueMantissa=4.1519999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102024, standardError=0.0018603, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880039_G_A', pValueMantissa=4.0960001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102077, standardError=0.00186045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880120_A_C', pValueMantissa=4.75, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113026, standardError=0.00193019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880736_G_C', pValueMantissa=2.4639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.11912, standardError=0.039343, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99882938_G_A', pValueMantissa=4.218999862670898, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102002, standardError=0.00186086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99883489_C_T', pValueMantissa=7.486000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140267, standardError=0.00524475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99884754_C_T', pValueMantissa=2.5510001182556152, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011665, standardError=0.00195783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885306_C_T', pValueMantissa=7.618000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122854, standardError=0.00460381, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885741_T_C', pValueMantissa=4.251999855041504, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101963, standardError=0.00186062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887218_A_G', pValueMantissa=1.3589999675750732, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100249, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887854_C_T', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010025, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99888103_G_A', pValueMantissa=3.808000087738037, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0456176, standardError=0.0219955, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99889239_G_C', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100256, standardError=0.00190207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99890983_C_T', pValueMantissa=1.3830000162124634, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01002, standardError=0.00190223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891336_A_G', pValueMantissa=3.815000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102374, standardError=0.00186162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891408_C_T', pValueMantissa=1.6360000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996155, standardError=0.00190233, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891590_G_A', pValueMantissa=6.8420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114132, standardError=0.00422021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891697_T_C', pValueMantissa=4.46999979019165, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010205, standardError=0.00186523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99892983_T_C', pValueMantissa=3.4000000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.177641, standardError=0.083791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893179_G_C', pValueMantissa=5.1570000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112781, standardError=0.00193051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893428_C_T', pValueMantissa=4.14300012588501, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102059, standardError=0.00186081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894094_G_C', pValueMantissa=4.321000099182129, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249459, standardError=0.00708754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894492_G_T', pValueMantissa=8.531999588012695, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101123, standardError=0.00188821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894565_A_G', pValueMantissa=4.785999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00954874, standardError=0.00273411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894939_T_C', pValueMantissa=8.916999816894531, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988844, standardError=0.00184916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895167_T_C', pValueMantissa=4.169000148773193, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00948941, standardError=0.00187497, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895555_C_T', pValueMantissa=4.659999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0340557, standardError=0.0120355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896225_G_A', pValueMantissa=1.0920000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110344, standardError=0.0019305, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896692_A_G', pValueMantissa=3.4130001068115234, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110917, standardError=0.00187665, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896979_T_G', pValueMantissa=3.2119998931884766, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0401381, standardError=0.0187308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99897831_T_C', pValueMantissa=1.9040000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.14616, standardError=0.0623359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898123_G_A', pValueMantissa=1.1069999933242798, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110304, standardError=0.00193059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898484_T_A', pValueMantissa=1.1139999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110285, standardError=0.00193061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898828_T_C', pValueMantissa=3.2699999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111045, standardError=0.00187657, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99899677_C_CTTGT', pValueMantissa=3.51200008392334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110858, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900290_T_G', pValueMantissa=7.426000118255615, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109405, standardError=0.00189249, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900292_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988613, standardError=0.00390553, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900500_A_C', pValueMantissa=2.2009999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0412365, standardError=0.0180062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901642_T_C', pValueMantissa=5.086999893188477, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113465, standardError=0.0405014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901731_C_T', pValueMantissa=1.5379999876022339, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0140283, standardError=0.00442901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902496_G_A', pValueMantissa=1.2289999723434448, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0224604, standardError=0.00897057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902603_C_T', pValueMantissa=4.140999794006348, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0854585, standardError=0.0419028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902712_G_C', pValueMantissa=1.1929999589920044, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110082, standardError=0.00193099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902720_C_G', pValueMantissa=3.492000102996826, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902757_G_A', pValueMantissa=4.366000175476074, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110198, standardError=0.00187741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903008_A_C', pValueMantissa=3.4590001106262207, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01109, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903292_G_A', pValueMantissa=3.4660000801086426, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110895, standardError=0.00187709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903681_G_T', pValueMantissa=6.072000026702881, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110979, standardError=0.00190858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904413_A_G', pValueMantissa=3.4719998836517334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110894, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904499_G_A', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110237, standardError=0.00193097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904588_G_A', pValueMantissa=9.54800033569336, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142134, standardError=0.00430252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905340_C_T', pValueMantissa=1.184000015258789, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110128, standardError=0.00193138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905534_G_C', pValueMantissa=1.2209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0379664, standardError=0.0151507, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905541_A_G', pValueMantissa=3.575000047683716, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110805, standardError=0.00187717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905693_A_G', pValueMantissa=3.490999937057495, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110881, standardError=0.00187721, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906210_T_C', pValueMantissa=3.5, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110874, standardError=0.00187724, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906644_G_A', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110495, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906718_T_C', pValueMantissa=3.4709999561309814, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110901, standardError=0.00187726, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908035_C_T', pValueMantissa=7.296000003814697, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148557, standardError=0.00439751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908057_A_G', pValueMantissa=7.160999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0149937, standardError=0.00443164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908221_T_C', pValueMantissa=3.878000020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110578, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908813_T_C', pValueMantissa=5.124000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112768, standardError=0.00192994, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909229_T_C', pValueMantissa=8.24899959564209, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998922, standardError=0.0018631, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909454_A_C', pValueMantissa=7.598999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109359, standardError=0.00189297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910263_C_T', pValueMantissa=5.330999851226807, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111417, standardError=0.00190898, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910368_T_C', pValueMantissa=3.302999973297119, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011106, standardError=0.00187736, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910580_T_G', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110251, standardError=0.00193122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911338_T_C', pValueMantissa=3.4579999446868896, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011092, standardError=0.00187738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911811_G_A', pValueMantissa=2.575000047683716, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.118741, standardError=0.0393917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912354_A_G', pValueMantissa=5.099999904632568, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112784, standardError=0.00192997, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912584_A_G', pValueMantissa=3.447999954223633, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011093, standardError=0.00187739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913097_C_G', pValueMantissa=3.181999921798706, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913702_T_C', pValueMantissa=1.0369999408721924, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108274, standardError=0.00422404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99914373_T_G', pValueMantissa=3.0360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.248118, standardError=0.114583, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915372_A_G', pValueMantissa=3.250999927520752, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111123, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915373_G_A', pValueMantissa=3.3289999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111042, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915884_T_C', pValueMantissa=5.684999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109318, standardError=0.00187645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915918_T_G', pValueMantissa=1.281000018119812, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00983696, standardError=0.00186253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916127_T_C', pValueMantissa=5.081999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112798, standardError=0.00193, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916503_A_T', pValueMantissa=6.974999904632568, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00734427, standardError=0.00184662, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916552_T_C', pValueMantissa=2.9839999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122137, standardError=0.00562257, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99917731_C_T', pValueMantissa=5.0289998054504395, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112837, standardError=0.0019301, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99919106_C_T', pValueMantissa=2.8299999237060547, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131403, standardError=0.00440112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99920364_C_T', pValueMantissa=4.159999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0219416, standardError=0.0076565, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99921641_GC_G', pValueMantissa=5.14900016784668, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112777, standardError=0.00193036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922010_GAAGA_G', pValueMantissa=3.134999990463257, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255599, standardError=0.00709237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922205_A_G', pValueMantissa=8.65999984741211, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997687, standardError=0.00186386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922419_C_T', pValueMantissa=5.785999774932861, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112417, standardError=0.00193063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99923392_A_AAAT', pValueMantissa=7.868000030517578, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010012, standardError=0.00186439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924208_C_T', pValueMantissa=6.610000133514404, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112121, standardError=0.00193293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924251_CACGGTGAA_C', pValueMantissa=5.901000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112486, standardError=0.0019329, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924611_T_C', pValueMantissa=3.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.028521, standardError=0.0135863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924854_A_G', pValueMantissa=4.103000164031982, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.135756, standardError=0.0664409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925030_G_A', pValueMantissa=7.132999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123943, standardError=0.00460661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925171_T_C', pValueMantissa=2.7660000324249268, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131669, standardError=0.00439981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925527_C_T', pValueMantissa=3.3429999351501465, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011112, standardError=0.00187899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926307_T_C', pValueMantissa=1.2309999465942383, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00985993, standardError=0.0018643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926344_G_A', pValueMantissa=7.146999835968018, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123917, standardError=0.00460668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928121_C_T', pValueMantissa=2.6080000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0237748, standardError=0.0106854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928961_T_A', pValueMantissa=7.409999847412109, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0092492, standardError=0.00274137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99929621_G_C', pValueMantissa=2.4159998893737793, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00965232, standardError=0.00186913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930293_C_T', pValueMantissa=2.371000051498413, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00891412, standardError=0.00188903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930622_A_G', pValueMantissa=2.9200000762939453, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122713, standardError=0.0019469, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930880_C_G', pValueMantissa=6.189000129699707, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126631, standardError=0.00193652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99931871_G_T', pValueMantissa=1.0870000123977661, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132779, standardError=0.00195421, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932501_G_T', pValueMantissa=7.144999980926514, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130514, standardError=0.0020025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932525_C_G', pValueMantissa=3.86299991607666, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132541, standardError=0.00190924, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932591_G_A', pValueMantissa=3.625999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0057824, standardError=0.00276148, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933095_G_A', pValueMantissa=6.820000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.041325, standardError=0.0152743, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933333_G_A', pValueMantissa=7.736000061035156, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130529, standardError=0.00190738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933398_T_G', pValueMantissa=1.1490000486373901, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132623, standardError=0.00195424, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933499_T_C', pValueMantissa=7.710999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130536, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933515_AG_A', pValueMantissa=6.0929999351501465, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130982, standardError=0.00200234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933811_A_C', pValueMantissa=3.0450000762939453, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0271544, standardError=0.009164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933841_A_G', pValueMantissa=7.820000171661377, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130497, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935601_G_A', pValueMantissa=6.01200008392334, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131034, standardError=0.00200253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935839_G_A', pValueMantissa=1.9040000438690186, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0088457, standardError=0.00185702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99936985_A_C', pValueMantissa=8.661999702453613, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130204, standardError=0.00190715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99937543_C_A', pValueMantissa=6.139999866485596, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130966, standardError=0.00200245, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99938738_G_A', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132869, standardError=0.00195344, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939547_T_C', pValueMantissa=6.979000091552734, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130948, standardError=0.00190939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939652_G_A', pValueMantissa=4.034999847412109, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132546, standardError=0.00191099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99940864_C_T', pValueMantissa=5.973999977111816, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131208, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941429_ACCTCAGGGTTACC_A', pValueMantissa=4.370999813079834, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.187402, standardError=0.0929166, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941625_T_C', pValueMantissa=7.7729997634887695, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942056_T_C', pValueMantissa=4.118000030517578, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832392, standardError=0.0407701, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942622_C_G', pValueMantissa=4.414999961853027, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132329, standardError=0.00191137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942695_T_C', pValueMantissa=5.933000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131229, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942879_G_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943051_G_T', pValueMantissa=5.098999977111816, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0153013, standardError=0.00335503, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943272_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943700_G_A', pValueMantissa=1.340000033378601, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0629333, standardError=0.0254482, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943766_A_G', pValueMantissa=3.8440001010894775, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0136334, standardError=0.00196368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944281_T_C', pValueMantissa=7.932000160217285, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130606, standardError=0.00190951, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944562_A_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944721_TC_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99945215_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946139_G_A', pValueMantissa=1.3140000104904175, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00899244, standardError=0.00185887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946260_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946307_A_C', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946514_A_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946634_G_A', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947232_A_G', pValueMantissa=5.947999954223633, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131222, standardError=0.00200491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947807_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947876_G_A', pValueMantissa=4.059000015258789, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132552, standardError=0.00191131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99948681_A_G', pValueMantissa=7.769999980926514, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99949062_G_A', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99950056_G_A', pValueMantissa=4.761000156402588, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.107573, standardError=0.0543081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99952120_T_C', pValueMantissa=1.062000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0236237, standardError=0.00721645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953194_G_A', pValueMantissa=5.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131262, standardError=0.00200494, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953842_C_T', pValueMantissa=4.118000030517578, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132617, standardError=0.00191282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953915_A_G', pValueMantissa=3.8420000076293945, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132682, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954520_G_A', pValueMantissa=6.242000102996826, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131087, standardError=0.00200505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954533_T_G', pValueMantissa=4.175000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132459, standardError=0.00191108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956142_G_A', pValueMantissa=4.054999828338623, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132533, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956727_G_A', pValueMantissa=2.9579999446868896, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0132311, standardError=0.00445185, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99958027_A_G', pValueMantissa=7.925000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130596, standardError=0.00190933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959825_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163596, standardError=0.00803454, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959911_G_A', pValueMantissa=2.3239998817443848, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134674, standardError=0.00201484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962154_T_G', pValueMantissa=6.442999839782715, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130988, standardError=0.002005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962896_A_G', pValueMantissa=4.985000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.018755, standardError=0.00956281, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963747_T_C', pValueMantissa=3.8350000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.10415, standardError=0.0360205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963755_G_A', pValueMantissa=4.4070000648498535, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132354, standardError=0.00191167, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963792_C_T', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133147, standardError=0.0019575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963855_G_A', pValueMantissa=6.202000141143799, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131113, standardError=0.00200516, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963858_G_C', pValueMantissa=4.052000045776367, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132537, standardError=0.00191104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964474_C_A', pValueMantissa=1.5709999799728394, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013808, standardError=0.0020483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964716_C_T', pValueMantissa=3.6579999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.022367, standardError=0.00769613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965353_C_T', pValueMantissa=4.11899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832401, standardError=0.0407717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965381_C_T', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0154555, standardError=0.00728972, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965782_C_T', pValueMantissa=1.2259999513626099, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312055, standardError=0.00547846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966311_G_A', pValueMantissa=4.085000038146973, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132514, standardError=0.00191102, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966874_G_A', pValueMantissa=9.85099983215332, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133219, standardError=0.00195661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99967655_A_C', pValueMantissa=4.085999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132548, standardError=0.00191151, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99968174_T_C', pValueMantissa=6.03000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131184, standardError=0.00200495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99970196_C_T', pValueMantissa=1.940999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134874, standardError=0.00191619, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99971874_A_G', pValueMantissa=4.980999946594238, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132011, standardError=0.0019115, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_C_CATTT', pValueMantissa=9.527999877929688, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00936982, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_CATTT_C', pValueMantissa=3.311000108718872, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013347, standardError=0.00191661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973360_A_G', pValueMantissa=1.6030000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0940323, standardError=0.0390452, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973664_T_C', pValueMantissa=4.126999855041504, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013249, standardError=0.00191107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973694_T_C', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973733_A_G', pValueMantissa=4.34499979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132363, standardError=0.00191125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99974260_C_T', pValueMantissa=2.316999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0316527, standardError=0.0139405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975197_T_C', pValueMantissa=2.117000102996826, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134651, standardError=0.00191633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975489_C_G', pValueMantissa=5.743000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0354502, standardError=0.0128345, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99976504_G_A', pValueMantissa=8.508999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0819298, standardError=0.031138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977161_A_G', pValueMantissa=4.061999797821045, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132532, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977721_G_A', pValueMantissa=6.2829999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0246959, standardError=0.00903733, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979375_G_A', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979565_C_T', pValueMantissa=4.479000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0275515, standardError=0.0137302, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979592_G_A', pValueMantissa=3.3989999294281006, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133022, standardError=0.00191119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980479_A_C', pValueMantissa=7.7230000495910645, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0930047, standardError=0.0349125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980767_T_TG', pValueMantissa=3.1600000858306885, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133205, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99981303_T_C', pValueMantissa=1.0260000228881836, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129016, standardError=0.0019962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982408_C_T', pValueMantissa=4.807000160217285, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131845, standardError=0.00200471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982941_G_A', pValueMantissa=3.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133135, standardError=0.00191092, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983547_G_T', pValueMantissa=1.378000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138444, standardError=0.00204793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983965_C_T', pValueMantissa=1.3339999914169312, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.276188, standardError=0.0722979, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984671_A_G', pValueMantissa=1.090999960899353, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012885, standardError=0.00199651, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984912_C_T', pValueMantissa=3.328000068664551, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133085, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99986015_T_C', pValueMantissa=1.0609999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012891, standardError=0.00199615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988026_G_T', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122774, standardError=0.0046077, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988174_G_A', pValueMantissa=3.121999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133243, standardError=0.0019111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988593_A_C', pValueMantissa=4.09499979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0833533, standardError=0.0407789, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988730_T_C', pValueMantissa=3.1760001182556152, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133191, standardError=0.00191101, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988731_G_A', pValueMantissa=5.669000148773193, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144037, standardError=0.00520681, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988980_A_G', pValueMantissa=4.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131807, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989148_T_C', pValueMantissa=4.875, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131806, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989685_T_C', pValueMantissa=4.556000232696533, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132006, standardError=0.00200472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989906_C_T', pValueMantissa=3.2639999389648438, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133133, standardError=0.00191121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990445_G_A', pValueMantissa=6.452000141143799, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.090219, standardError=0.0331213, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990521_G_A', pValueMantissa=2.9019999504089355, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013345, standardError=0.00191124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990640_T_A', pValueMantissa=1.5579999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0139907, standardError=0.00442234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992006_G_GA', pValueMantissa=3.0260000228881836, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133329, standardError=0.00191111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992015_T_C', pValueMantissa=3.5850000381469727, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013291, standardError=0.00191165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992806_A_G', pValueMantissa=3.0290000438690186, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00191112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993453_A_G', pValueMantissa=3.0329999923706055, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133323, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993852_T_C', pValueMantissa=3.0360000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133322, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994177_C_T', pValueMantissa=4.533999919891357, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132032, standardError=0.00200489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994349_A_T', pValueMantissa=1.0379999876022339, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0287633, standardError=0.00422921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995001_T_C', pValueMantissa=3.2860000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133152, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995032_G_C', pValueMantissa=4.89900016784668, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131854, standardError=0.00200569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995714_T_C', pValueMantissa=3.374000072479248, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133048, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995753_C_CTT', pValueMantissa=3.372999906539917, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133049, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99996207_C_G', pValueMantissa=3.384000062942505, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133041, standardError=0.00191129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997268_A_G', pValueMantissa=3.378999948501587, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133047, standardError=0.00191132, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997438_CCA_C', pValueMantissa=6.603000164031982, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.109829, standardError=0.0404341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997720_A_G', pValueMantissa=2.815999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133548, standardError=0.00191149, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998079_C_CA', pValueMantissa=4.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0922906, standardError=0.0462786, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998104_G_A', pValueMantissa=1.2979999780654907, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00911911, standardError=0.0018841, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99999971_A_G', pValueMantissa=2.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.030431, standardError=0.0102384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000235_C_T', pValueMantissa=5.6519999504089355, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014492, standardError=0.00201036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000486_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.305198, standardError=0.149885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002038_G_A', pValueMantissa=3.7739999294281006, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0211624, standardError=0.0073064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002628_A_C', pValueMantissa=2.953000068664551, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138093, standardError=0.00189258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004140_G_A', pValueMantissa=2.6459999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0994314, standardError=0.0448022, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004827_A_C', pValueMantissa=6.945000171661377, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142296, standardError=0.0019001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005233_T_C', pValueMantissa=3.111999988555908, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216712, standardError=0.00733013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005358_G_C', pValueMantissa=4.872000217437744, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145472, standardError=0.00201239, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005438_A_G', pValueMantissa=1.093000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0533162, standardError=0.02095, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100006780_C_T', pValueMantissa=5.067999839782715, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145408, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007241_C_T', pValueMantissa=6.783999919891357, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142505, standardError=0.0019021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007404_G_GC', pValueMantissa=1.3420000076293945, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0198944, standardError=0.00377285, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100008640_A_G', pValueMantissa=5.019999980926514, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145435, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009013_G_A', pValueMantissa=6.611999988555908, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142475, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009635_T_G', pValueMantissa=1.0549999475479126, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134968, standardError=0.0018948, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011477_C_G', pValueMantissa=2.444999933242798, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148805, standardError=0.00203232, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011685_CAAAT_C', pValueMantissa=4.139999866485596, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101715, standardError=0.00185449, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011812_A_T', pValueMantissa=1.2029999494552612, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0141145, standardError=0.00190314, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013275_A_T', pValueMantissa=2.174999952316284, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145924, standardError=0.00191005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013744_G_A', pValueMantissa=4.76800012588501, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.51719, standardError=0.261177, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014566_A_G', pValueMantissa=8.550999641418457, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119513, standardError=0.00358432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014970_T_C', pValueMantissa=3.993000030517578, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0146099, standardError=0.00201355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015400_G_A', pValueMantissa=5.646999835968018, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160357, standardError=0.00222448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015645_T_C', pValueMantissa=2.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145559, standardError=0.00207384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015854_C_T', pValueMantissa=6.158999919891357, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160044, standardError=0.0022238, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016635_T_G', pValueMantissa=1.718999981880188, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147181, standardError=0.00218755, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016645_C_T', pValueMantissa=4.622000217437744, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0256776, standardError=0.00906606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017027_A_T', pValueMantissa=6.242000102996826, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160069, standardError=0.0022247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017624_A_G', pValueMantissa=1.7170000076293945, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147203, standardError=0.00218782, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018116_C_T', pValueMantissa=2.197000026702881, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145668, standardError=0.00207465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018135_G_C', pValueMantissa=1.4559999704360962, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.275534, standardError=0.0725377, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018265_A_T', pValueMantissa=2.7190001010894775, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00874366, standardError=0.00186392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100020857_T_C', pValueMantissa=9.112000465393066, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0156784, standardError=0.00210358, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021675_C_A', pValueMantissa=3.066999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0233385, standardError=0.0107983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021907_C_T', pValueMantissa=7.229000091552734, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159723, standardError=0.00222609, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100022313_C_CT', pValueMantissa=6.171999931335449, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0504229, standardError=0.0184125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100023134_T_G', pValueMantissa=1.3980000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0268617, standardError=0.0109298, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024168_G_A', pValueMantissa=2.3359999656677246, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00880598, standardError=0.00186491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024869_C_T', pValueMantissa=3.556999921798706, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162101, standardError=0.00222929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100025927_T_TA', pValueMantissa=3.621999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014426, standardError=0.00207534, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100026878_C_T', pValueMantissa=9.258999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0185461, standardError=0.00712673, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027354_G_A', pValueMantissa=1.968000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103617, standardError=0.0444235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027592_G_C', pValueMantissa=1.965999960899353, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103629, standardError=0.0444216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027903_T_C', pValueMantissa=2.75600004196167, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0384662, standardError=0.0128487, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100028049_C_T', pValueMantissa=4.144000053405762, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.130023, standardError=0.0637634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100029663_A_G', pValueMantissa=8.883999824523926, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147895, standardError=0.00206939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030853_G_A', pValueMantissa=7.5980000495910645, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0158245, standardError=0.00220759, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030993_G_A', pValueMantissa=3.437000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0224965, standardError=0.00768921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100031808_C_T', pValueMantissa=5.959000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212214, standardError=0.00771671, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100032684_A_C', pValueMantissa=5.459000110626221, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014926, standardError=0.00206922, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033239_T_A', pValueMantissa=1.3669999837875366, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0463194, standardError=0.0187842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033337_C_T', pValueMantissa=9.138999938964844, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0165264, standardError=0.00221749, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033635_G_GT', pValueMantissa=1.0110000371932983, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164902, standardError=0.00221658, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100035604_T_A', pValueMantissa=3.4110000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01433, standardError=0.002059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037190_G_A', pValueMantissa=3.2070000171661377, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120692, standardError=0.00203849, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037544_C_T', pValueMantissa=1.6990000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996527, standardError=0.00417483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037655_A_G', pValueMantissa=6.13100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127317, standardError=0.00219016, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038188_C_T', pValueMantissa=7.738999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126728, standardError=0.00219478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038589_T_C', pValueMantissa=3.734999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010628, standardError=0.00193133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038648_G_A', pValueMantissa=1.7230000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994355, standardError=0.00417478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039544_T_C', pValueMantissa=5.021999835968018, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126227, standardError=0.00202988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039545_G_T', pValueMantissa=1.5509999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130939, standardError=0.00204582, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039976_C_T', pValueMantissa=1.7209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994495, standardError=0.00417473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039997_T_C', pValueMantissa=5.01800012588501, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126197, standardError=0.00202937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100040770_T_G', pValueMantissa=3.059999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.120454, standardError=0.0557085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042338_T_C', pValueMantissa=2.61899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.189007, standardError=0.085007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042505_G_A', pValueMantissa=3.4860000610351562, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101879, standardError=0.00482832, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042848_C_CT', pValueMantissa=4.413000106811523, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0093599, standardError=0.00185336, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100043308_C_T', pValueMantissa=5.076000213623047, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126162, standardError=0.00202939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044357_C_T', pValueMantissa=5.36299991607666, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127797, standardError=0.00218999, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044501_A_G', pValueMantissa=1.7130000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00995148, standardError=0.00417441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044818_C_T', pValueMantissa=4.927000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204248, standardError=0.00726406, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044839_G_T', pValueMantissa=4.875, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126274, standardError=0.00202913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045047_A_C', pValueMantissa=4.922999858856201, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204266, standardError=0.00726404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045603_T_A', pValueMantissa=1.6740000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998325, standardError=0.00417297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045685_C_T', pValueMantissa=1.3309999704360962, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131383, standardError=0.00204533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045864_G_A', pValueMantissa=1.6770000457763672, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998092, standardError=0.00417295, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046495_A_G', pValueMantissa=4.683000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133938, standardError=0.00203532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046569_C_T', pValueMantissa=1.6740000247955322, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129058, standardError=0.00202014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100047823_TA_T', pValueMantissa=1.5670000314712524, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129238, standardError=0.00201974, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049106_G_A', pValueMantissa=1.690000057220459, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130999, standardError=0.00217423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049236_C_T', pValueMantissa=1.690000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996986, standardError=0.00417357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049902_G_A', pValueMantissa=1.8940000534057617, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130591, standardError=0.00217409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050211_A_T', pValueMantissa=2.1419999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0633556, standardError=0.0275398, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050359_GAACA_G', pValueMantissa=1.6019999980926514, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129195, standardError=0.00202015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051409_C_G', pValueMantissa=1.7120000123977661, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130944, standardError=0.00217407, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051504_G_A', pValueMantissa=1.7549999952316284, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00990516, standardError=0.00417051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052545_C_G', pValueMantissa=1.5299999713897705, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129286, standardError=0.00201936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052742_T_C', pValueMantissa=1.687000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997036, standardError=0.00417237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054045_C_T', pValueMantissa=1.3009999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129769, standardError=0.0020191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054117_T_C', pValueMantissa=4.938000202178955, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0716183, standardError=0.0364414, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054574_T_G', pValueMantissa=1.6629999876022339, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999072, standardError=0.00417196, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055122_T_C', pValueMantissa=6.368000030517578, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124774, standardError=0.00214876, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055153_G_A', pValueMantissa=1.6540000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999801, standardError=0.0041714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055199_C_G', pValueMantissa=1.8609999418258667, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130598, standardError=0.00217319, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055816_G_A', pValueMantissa=3.3589999675750732, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126847, standardError=0.00201947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055862_T_G', pValueMantissa=4.1529998779296875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0446939, standardError=0.0219282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056323_C_T', pValueMantissa=4.943999767303467, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0267439, standardError=0.0136118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056440_C_T', pValueMantissa=4.486999988555908, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00779499, standardError=0.00388601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057584_A_G', pValueMantissa=5.919000148773193, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011644, standardError=0.00200103, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057785_T_C', pValueMantissa=4.816999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128495, standardError=0.00219523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057800_C_T', pValueMantissa=1.0049999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122603, standardError=0.00200707, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059207_A_C', pValueMantissa=3.622999906539917, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0143322, standardError=0.00401899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAAC', pValueMantissa=3.5920000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00695612, standardError=0.00194938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAACAAC', pValueMantissa=3.884999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133237, standardError=0.00644961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059657_G_A', pValueMantissa=3.880000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133275, standardError=0.00645004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060102_G_C', pValueMantissa=3.874000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00645048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060272_A_G', pValueMantissa=4.5370001792907715, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0594699, standardError=0.0297173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060908_A_G', pValueMantissa=2.742000102996826, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113896, standardError=0.00204953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061298_C_T', pValueMantissa=2.503000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0150616, standardError=0.00672123, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061574_G_C', pValueMantissa=2.7809998989105225, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113862, standardError=0.00204983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061627_C_T', pValueMantissa=1.6690000295639038, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0323984, standardError=0.00537545, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061926_T_C', pValueMantissa=1.1759999990463257, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122155, standardError=0.00200796, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062022_C_T', pValueMantissa=9.611000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212829, standardError=0.00821882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062212_C_T', pValueMantissa=3.7899999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133927, standardError=0.00645157, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062744_C_A', pValueMantissa=3.752000093460083, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134223, standardError=0.00645282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062935_C_T', pValueMantissa=3.7669999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134118, standardError=0.00645294, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063173_T_G', pValueMantissa=2.7899999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011387, standardError=0.00205019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063265_C_T', pValueMantissa=2.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142012, standardError=0.00638472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063639_C_T', pValueMantissa=2.7750000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276973, standardError=0.0125851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063786_T_C', pValueMantissa=2.9630000591278076, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011365, standardError=0.00205011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064214_T_C', pValueMantissa=5.559999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128066, standardError=0.00219686, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064301_T_C', pValueMantissa=2.427999973297119, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0540203, standardError=0.0239811, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064486_T_C', pValueMantissa=2.484999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0271265, standardError=0.00428678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064533_A_G', pValueMantissa=8.324000358581543, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771332, standardError=0.00196024, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064544_T_C', pValueMantissa=8.236000061035156, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771787, standardError=0.00196013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100065403_C_G', pValueMantissa=1.7259999513626099, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00799338, standardError=0.00185995, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066509_T_C', pValueMantissa=3.444999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925747, standardError=0.0437751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066929_C_A', pValueMantissa=4.581999778747559, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0250808, standardError=0.012559, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067656_G_A', pValueMantissa=2.6489999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143151, standardError=0.00645107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067862_G_A', pValueMantissa=7.921999931335449, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119879, standardError=0.00195036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068504_C_T', pValueMantissa=6.7170000076293945, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00746427, standardError=0.00187258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068843_C_A', pValueMantissa=1.2430000305175781, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115969, standardError=0.00203679, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068866_G_GT', pValueMantissa=1.312000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115787, standardError=0.00203689, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069305_A_T', pValueMantissa=2.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143181, standardError=0.00645098, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069570_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151566, standardError=0.00504359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069757_C_T', pValueMantissa=2.5869998931884766, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145205, standardError=0.00481941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100070175_A_G', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0130301, standardError=0.00421666, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100072279_G_C', pValueMantissa=1.2419999837875366, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115973, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073428_G_T', pValueMantissa=2.609999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143509, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073963_C_T', pValueMantissa=1.0750000476837158, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074034_T_TC', pValueMantissa=2.005000114440918, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113741, standardError=0.0020269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074335_C_T', pValueMantissa=1.0729999542236328, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074511_G_A', pValueMantissa=4.894000053405762, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0166749, standardError=0.00478271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074712_C_T', pValueMantissa=1.2990000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0487079, standardError=0.0196078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075164_G_A', pValueMantissa=1.2369999885559082, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115989, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075228_C_T', pValueMantissa=2.6029999256134033, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143577, standardError=0.00645054, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075751_C_A', pValueMantissa=1.7940000295639038, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0172016, standardError=0.00726754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100076243_C_A', pValueMantissa=2.6019999980926514, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143585, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077499_A_G', pValueMantissa=4.675000190734863, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00753971, standardError=0.00185191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077617_C_A', pValueMantissa=8.185999870300293, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013965, standardError=0.00417311, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078024_G_A', pValueMantissa=4.400000095367432, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0760544, standardError=0.0267049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078160_G_A', pValueMantissa=2.5989999771118164, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143609, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078351_A_T', pValueMantissa=5.255000114440918, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0358513, standardError=0.0103395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078510_A_C', pValueMantissa=8.102999687194824, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119828, standardError=0.00195067, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078923_G_A', pValueMantissa=1.805999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171834, standardError=0.00726738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100079042_G_A', pValueMantissa=2.5889999866485596, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143712, standardError=0.00645058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080295_T_C', pValueMantissa=5.934000015258789, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121315, standardError=0.00195916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080362_T_A', pValueMantissa=9.142000198364258, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117746, standardError=0.00204921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100081203_A_G', pValueMantissa=7.883999824523926, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119901, standardError=0.00195049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100082411_T_C', pValueMantissa=2.5829999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143766, standardError=0.00645057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083012_C_A', pValueMantissa=3.0209999084472656, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125696, standardError=0.0019959, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083306_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143789, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083442_A_T', pValueMantissa=4.665999889373779, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00754005, standardError=0.0018518, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083679_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143785, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083851_G_A', pValueMantissa=7.6570000648498535, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119987, standardError=0.00195041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083869_GTGGA_G', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143832, standardError=0.00645065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100084120_A_G', pValueMantissa=2.5739998817443848, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143853, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085028_A_G', pValueMantissa=1.2200000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116042, standardError=0.00203692, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085123_T_C', pValueMantissa=2.569999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143893, standardError=0.00645068, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085191_A_C', pValueMantissa=1.0609999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116492, standardError=0.00203632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085317_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151555, standardError=0.00504327, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085356_CT_C', pValueMantissa=2.989000082015991, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199591, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085677_T_C', pValueMantissa=7.4720001220703125, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120068, standardError=0.0019505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085790_C_T', pValueMantissa=9.621999740600586, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119266, standardError=0.0019502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085791_G_A', pValueMantissa=6.89300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0076585, standardError=0.00283442, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100086416_A_C', pValueMantissa=4.2779998779296875, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757727, standardError=0.00185176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100087170_C_T', pValueMantissa=4.797999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249466, standardError=0.0126147, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088100_T_C', pValueMantissa=1.2690000534057617, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115908, standardError=0.00203699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088206_G_A', pValueMantissa=1.8480000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171185, standardError=0.00726652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088307_G_A', pValueMantissa=8.534000396728516, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0258604, standardError=0.00421546, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088565_A_AGAG', pValueMantissa=2.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01438, standardError=0.00645071, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088687_C_T', pValueMantissa=4.041999816894531, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124937, standardError=0.00199821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088994_G_C', pValueMantissa=4.744999885559082, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.26271, standardError=0.13253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100089654_C_A', pValueMantissa=1.2940000295639038, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115954, standardError=0.00203897, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100090029_G_T', pValueMantissa=3.2170000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322465, standardError=0.00583203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100093119_C_T', pValueMantissa=3.0880000591278076, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.379152, standardError=0.0909911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095173_CA_C', pValueMantissa=1.1920000314712524, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116127, standardError=0.00203702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095421_C_T', pValueMantissa=4.376999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00756736, standardError=0.00185174, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095474_G_C', pValueMantissa=1.0429999828338623, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011657, standardError=0.00203668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095491_G_A', pValueMantissa=2.575000047683716, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143845, standardError=0.00645073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095666_A_G', pValueMantissa=2.997999906539917, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125726, standardError=0.001996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095766_C_T', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143829, standardError=0.00645074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096097_G_A', pValueMantissa=4.854000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.159194, standardError=0.0807015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096882_A_T', pValueMantissa=1.875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0170779, standardError=0.00726586, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097204_C_G', pValueMantissa=4.326000213623047, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757235, standardError=0.00185173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097630_G_A', pValueMantissa=6.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0183017, standardError=0.0067411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097685_G_A', pValueMantissa=2.1630001068115234, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00784104, standardError=0.00341393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100098591_G_A', pValueMantissa=7.1529998779296875, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00762397, standardError=0.00283455, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100099448_G_A', pValueMantissa=2.5399999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110489, standardError=0.00198346, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100113_A_G', pValueMantissa=2.996000051498413, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199604, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100236_G_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143946, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101678_G_A', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116505, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101681_G_A', pValueMantissa=2.572999954223633, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143872, standardError=0.00645085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101734_C_T', pValueMantissa=2.805000066757202, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388904, standardError=0.0177047, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101865_T_C', pValueMantissa=7.827000141143799, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00939164, standardError=0.0021011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101978_T_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143954, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102891_G_A', pValueMantissa=3.0280001163482666, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125699, standardError=0.00199607, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102937_T_C', pValueMantissa=1.0709999799728394, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116485, standardError=0.00203677, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103034_T_C', pValueMantissa=1.062000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116512, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103075_C_T', pValueMantissa=2.5480000972747803, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144117, standardError=0.0064509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103232_C_T', pValueMantissa=1.059999942779541, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116519, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103284_T_C', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115998, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103427_G_A', pValueMantissa=2.5409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144177, standardError=0.0064504, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103653_C_A', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104060_G_C', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011653, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104416_A_G', pValueMantissa=1.062999963760376, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116511, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104538_T_A', pValueMantissa=3.0250000953674316, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125704, standardError=0.0019961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104974_T_C', pValueMantissa=2.5460000038146973, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144144, standardError=0.00645109, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105358_T_A', pValueMantissa=1.246000051498413, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115981, standardError=0.00203714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105587_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116489, standardError=0.0020368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105759_A_T', pValueMantissa=1.253000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115962, standardError=0.00203715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106124_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106127_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106157_C_A', pValueMantissa=2.5399999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01442, standardError=0.00645108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106705_G_GGCAGAGTAA', pValueMantissa=3.0460000038146973, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125685, standardError=0.00199613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107060_CG_C', pValueMantissa=1.2519999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115965, standardError=0.00203718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107246_C_T', pValueMantissa=1.8339999914169312, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148529, standardError=0.0629731, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107759_T_C', pValueMantissa=3.5490000247955322, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00765844, standardError=0.00185209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107761_A_G', pValueMantissa=5.459000110626221, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.272006, standardError=0.0786791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108013_C_T', pValueMantissa=2.561000108718872, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0243527, standardError=0.00807438, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108920_T_G', pValueMantissa=9.07699966430664, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011727, standardError=0.00204049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100109874_G_A', pValueMantissa=4.85099983215332, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0248793, standardError=0.0126104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110231_C_T', pValueMantissa=7.883999824523926, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117687, standardError=0.00203931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110702_T_G', pValueMantissa=3.5929999351501465, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0606656, standardError=0.0289201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110795_TTA_T', pValueMantissa=6.190999984741211, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118518, standardError=0.00203936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111161_G_A', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0497915, standardError=0.0161136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111179_C_T', pValueMantissa=6.201000213623047, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118489, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111991_C_A', pValueMantissa=6.7820000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118202, standardError=0.00203929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112419_TA_T', pValueMantissa=5.803999900817871, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118714, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112828_C_T', pValueMantissa=2.8289999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388309, standardError=0.0177045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112930_A_C', pValueMantissa=6.804999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118191, standardError=0.0020393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100114067_A_G', pValueMantissa=1.0110000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104825, standardError=0.00196864, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115072_C_T', pValueMantissa=1.034999966621399, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104694, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115087_C_T', pValueMantissa=5.876999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118682, standardError=0.00203912, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115453_T_C', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104692, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116179_G_C', pValueMantissa=5.88100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118679, standardError=0.00203913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116494_A_T', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010469, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116607_C_T', pValueMantissa=1.0160000324249268, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104762, standardError=0.00196781, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116979_C_G', pValueMantissa=1.0180000066757202, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104755, standardError=0.0019678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100117013_G_A', pValueMantissa=1.0379999876022339, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104684, standardError=0.00196777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118204_T_G', pValueMantissa=1.0509999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104641, standardError=0.00196778, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118462_G_A', pValueMantissa=5.9079999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118664, standardError=0.00203914, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118652_C_T', pValueMantissa=1.128999948501587, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104375, standardError=0.00196763, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100119929_C_G', pValueMantissa=8.840999603271484, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121944, standardError=0.0019896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100120722_G_A', pValueMantissa=5.441999912261963, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106837, standardError=0.00196527, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100121497_C_T', pValueMantissa=1.5360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.573298, standardError=0.23652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100124748_T_C', pValueMantissa=2.8399999141693115, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388018, standardError=0.0177043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125143_C_CA', pValueMantissa=3.8269999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0260846, standardError=0.0125892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125152_C_A', pValueMantissa=7.866000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105533, standardError=0.00196517, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125180_C_T', pValueMantissa=7.633999824523926, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105635, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125779_A_G', pValueMantissa=7.78000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105568, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126618_A_C', pValueMantissa=4.631999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133295, standardError=0.0668985, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126748_A_G', pValueMantissa=7.800000190734863, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105558, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100127494_A_T', pValueMantissa=1.8029999732971191, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082724, standardError=0.00349777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128204_G_GAGAGAA', pValueMantissa=5.4019999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107556, standardError=0.00197804, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128221_A_G', pValueMantissa=6.446000099182129, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106227, standardError=0.001965, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128550_G_A', pValueMantissa=8.194000244140625, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105396, standardError=0.00196532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128651_T_C', pValueMantissa=7.315000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105796, standardError=0.00196528, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128763_C_T', pValueMantissa=7.829999923706055, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105544, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128883_C_T', pValueMantissa=8.057000160217285, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105443, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128958_G_A', pValueMantissa=2.124000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680841, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129035_C_A', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925999, standardError=0.043676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129320_C_T', pValueMantissa=2.13100004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680465, standardError=0.00295531, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129629_A_C', pValueMantissa=1.8580000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148278, standardError=0.0629939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129660_T_C', pValueMantissa=8.699000358581543, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115118, standardError=0.00200055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129776_G_A', pValueMantissa=1.690000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884659, standardError=0.0281741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130207_C_T', pValueMantissa=3.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140895, standardError=0.00483524, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130573_C_G', pValueMantissa=2.9149999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00674022, standardError=0.00186053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130860_A_G', pValueMantissa=9.043999671936035, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114981, standardError=0.00200046, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131042_G_A', pValueMantissa=3.619999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.179459, standardError=0.0503203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131063_C_G', pValueMantissa=2.2909998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00671867, standardError=0.00295325, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131465_G_T', pValueMantissa=8.934000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115031, standardError=0.00200061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132172_C_G', pValueMantissa=2.128000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680593, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAA', pValueMantissa=4.828000068664551, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00431663, standardError=0.00218576, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAATAAA', pValueMantissa=4.5980000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0519863, standardError=0.0260513, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_TTAAATAAATAAA_T', pValueMantissa=7.363999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116156, standardError=0.00200877, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133539_G_T', pValueMantissa=2.6610000133514404, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678474, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133661_G_A', pValueMantissa=2.6619999408721924, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678444, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134226_T_TAAAC', pValueMantissa=9.397000312805176, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114918, standardError=0.00200162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134368_G_T', pValueMantissa=2.305999994277954, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00685323, standardError=0.0018608, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134849_C_G', pValueMantissa=2.5420000553131104, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00680611, standardError=0.00186063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100136849_G_A', pValueMantissa=2.4240000247955322, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00682879, standardError=0.00186061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100137626_G_C', pValueMantissa=4.564000129699707, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133964, standardError=0.067025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100139939_C_T', pValueMantissa=2.2850000858306885, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0168361, standardError=0.00739727, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140109_A_G', pValueMantissa=8.161999702453613, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116036, standardError=0.00201274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140433_T_C', pValueMantissa=8.460000038146973, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00745523, standardError=0.00283129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140822_C_T', pValueMantissa=4.0370001792907715, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00653853, standardError=0.00184827, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140993_C_T', pValueMantissa=8.553999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00744479, standardError=0.00283137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100141769_G_C', pValueMantissa=4.497000217437744, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.134653, standardError=0.0671606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142018_C_T', pValueMantissa=8.651000022888184, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00615783, standardError=0.00184859, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142970_A_T', pValueMantissa=3.749000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0279115, standardError=0.00962947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143128_C_A', pValueMantissa=2.7290000915527344, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151084, standardError=0.0050416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143200_T_G', pValueMantissa=8.8100004196167, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751992, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143201_T_C', pValueMantissa=8.812999725341797, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751979, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143322_A_G', pValueMantissa=8.62600040435791, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0074353, standardError=0.00283084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143412_T_C', pValueMantissa=3.306999921798706, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0244099, standardError=0.00588015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143655_T_C', pValueMantissa=5.8420000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0063633, standardError=0.00185041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144149_T_G', pValueMantissa=5.2210001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106098, standardError=0.00194903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144392_A_ACGTG', pValueMantissa=1.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122106, standardError=0.00200172, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144587_G_A', pValueMantissa=4.710000038146973, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106442, standardError=0.00194881, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144738_C_T', pValueMantissa=3.628999948501587, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00387717, standardError=0.00185181, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145180_CA_C', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00754349, standardError=0.00283104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145446_T_C', pValueMantissa=4.289000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00722839, standardError=0.0025309, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145462_G_A', pValueMantissa=1.184999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00704211, standardError=0.00279842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145533_C_T', pValueMantissa=6.809999942779541, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0688508, standardError=0.0254439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145864_T_C', pValueMantissa=2.5959999561309814, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00556169, standardError=0.00184654, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100146576_G_A', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102862, standardError=0.0027873, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100147206_C_G', pValueMantissa=2.24399995803833, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102847, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148436_A_G', pValueMantissa=7.232999801635742, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01072, standardError=0.00317104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148745_A_G', pValueMantissa=9.111000061035156, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011124, standardError=0.00335401, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100150256_TG_T', pValueMantissa=1.621000051498413, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0058237, standardError=0.00184761, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151385_A_G', pValueMantissa=2.200000047683716, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102977, standardError=0.002787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151760_T_G', pValueMantissa=1.680999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116223, standardError=0.00369954, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151918_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152307_T_C', pValueMantissa=9.949999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108402, standardError=0.00189131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152437_C_T', pValueMantissa=1.0140000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108394, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100153963_AT_A', pValueMantissa=3.984999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00551895, standardError=0.00191674, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155294_C_T', pValueMantissa=5.695000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0370698, standardError=0.0134074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155300_C_A', pValueMantissa=3.9560000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013611, standardError=0.0066127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155337_G_C', pValueMantissa=9.121999740600586, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0129497, standardError=0.00390489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155409_G_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155608_A_G', pValueMantissa=2.359999895095825, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102538, standardError=0.00278865, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157105_C_T', pValueMantissa=1.9290000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114702, standardError=0.00369896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157116_T_A', pValueMantissa=1.4279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00588326, standardError=0.00184495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157609_G_A', pValueMantissa=2.1989998817443848, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103034, standardError=0.00278846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157763_C_T', pValueMantissa=3.859999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00711467, standardError=0.00343966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158037_G_A', pValueMantissa=4.420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0259169, standardError=0.00910471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158360_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158691_C_T', pValueMantissa=6.251999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131114, standardError=0.00327532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159080_T_C', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159144_G_A', pValueMantissa=1.3380000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00857697, standardError=0.00346768, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159600_GAAATCAACAATAA_G', pValueMantissa=1.7860000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115575, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159706_T_TTTAAA', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102922, standardError=0.00278886, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161011_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161641_G_T', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162586_C_T', pValueMantissa=1.5570000410079956, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117095, standardError=0.00370097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162599_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164449_A_T', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164555_T_C', pValueMantissa=1.8140000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162269, standardError=0.00686797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164661_T_C', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108199, standardError=0.00189161, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100166335_G_A', pValueMantissa=1.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167234_TA_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114517, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167290_A_G', pValueMantissa=1.9539999961853027, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114514, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167685_C_T', pValueMantissa=3.9630000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0526946, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167711_G_A', pValueMantissa=1.3270000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011893, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100168884_G_A', pValueMantissa=1.815000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01154, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100169073_T_A', pValueMantissa=1.659000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164986, standardError=0.00688708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170367_T_A', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115361, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170447_T_C', pValueMantissa=1.8200000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011537, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170652_A_G', pValueMantissa=8.133000373840332, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162704, standardError=0.00614785, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170743_T_C', pValueMantissa=1.819000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115379, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171278_T_G', pValueMantissa=1.965999960899353, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114445, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171408_C_CTATT', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115357, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171892_C_A', pValueMantissa=4.783999919891357, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0290312, standardError=0.0146713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171937_A_T', pValueMantissa=3.7090001106262207, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264529, standardError=0.0126887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172580_C_A', pValueMantissa=1.8209999799728394, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115368, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172766_C_T', pValueMantissa=1.3320000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118891, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173406_G_C', pValueMantissa=3.993000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276948, standardError=0.00962055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173454_A_G', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011536, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174322_A_AT', pValueMantissa=1.9670000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114438, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174478_C_T', pValueMantissa=5.164999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114058, standardError=0.00195247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175179_A_G', pValueMantissa=1.968000054359436, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114433, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175211_T_C', pValueMantissa=9.72700023651123, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0910994, standardError=0.02762, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175305_C_T', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175350_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100176550_CAAAAGACCGTTTTTA_C', pValueMantissa=1.8869999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115298, standardError=0.00371041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177021_C_G', pValueMantissa=1.8309999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115307, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177437_T_C', pValueMantissa=4.168000221252441, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00536168, standardError=0.00187135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177850_C_T', pValueMantissa=7.14300012588501, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216516, standardError=0.00545178, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178264_G_A', pValueMantissa=1.8339999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011529, standardError=0.00370002, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178377_T_A', pValueMantissa=3.9769999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277079, standardError=0.00962096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178824_A_C', pValueMantissa=1.1480000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0273359, standardError=0.0108138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178873_G_C', pValueMantissa=3.313999891281128, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00845972, standardError=0.00288043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178957_A_G', pValueMantissa=1.8370000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011527, standardError=0.00370001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100181244_T_A', pValueMantissa=9.291000366210938, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116765, standardError=0.00352639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182158_GT_G', pValueMantissa=1.440999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118051, standardError=0.00370502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182496_T_C', pValueMantissa=2.2899999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102733, standardError=0.00278807, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182799_A_G', pValueMantissa=2.365000009536743, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102471, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183196_T_C', pValueMantissa=1.8519999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011518, standardError=0.00369996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183255_G_A', pValueMantissa=1.3580000400543213, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118679, standardError=0.0037048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183966_G_A', pValueMantissa=1.8609999418258667, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115126, standardError=0.00369993, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184256_T_C', pValueMantissa=4.7220001220703125, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.029124, standardError=0.0146772, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184474_G_A', pValueMantissa=3.7109999656677246, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00543283, standardError=0.00187227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184568_G_A', pValueMantissa=2.1500000953674316, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103173, standardError=0.00278792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186257_C_G', pValueMantissa=1.2259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00596993, standardError=0.00184663, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186688_C_T', pValueMantissa=1.9229999780654907, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114751, standardError=0.00369939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100187980_C_T', pValueMantissa=4.630000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813035, standardError=0.00287118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100189674_T_G', pValueMantissa=9.279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.126539, standardError=0.0486397, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190351_G_A', pValueMantissa=4.619999885559082, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813223, standardError=0.00287113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190395_G_A', pValueMantissa=2.0, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0760922, standardError=0.024623, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100192759_T_C', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114555, standardError=0.00369915, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193524_C_T', pValueMantissa=9.555000305175781, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122529, standardError=0.0037093, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193948_A_C', pValueMantissa=3.0179998874664307, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115477, standardError=0.00194714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195245_A_T', pValueMantissa=4.635000228881836, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0081285, standardError=0.00287091, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195684_C_CA', pValueMantissa=4.2270002365112305, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.137066, standardError=0.0674911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195855_G_A', pValueMantissa=4.870999813079834, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00807719, standardError=0.00286889, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197192_T_C', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136954, standardError=0.067486, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197458_C_A', pValueMantissa=4.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00812979, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197612_C_G', pValueMantissa=4.498000144958496, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815595, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197640_T_C', pValueMantissa=1.965000033378601, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114501, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197675_G_A', pValueMantissa=2.75600004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0386379, standardError=0.0175348, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197920_A_G', pValueMantissa=2.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0167093, standardError=0.00739523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100198475_T_C', pValueMantissa=1.9639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114509, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199282_C_G', pValueMantissa=1.1059999465942383, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127328, standardError=0.00390313, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199476_G_A', pValueMantissa=1.319000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118973, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100200167_G_A', pValueMantissa=3.1589999198913574, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0376207, standardError=0.012745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201209_C_T', pValueMantissa=1.097000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00602792, standardError=0.0018465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201414_G_A', pValueMantissa=4.788000106811523, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0068162, standardError=0.00344526, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201633_T_A', pValueMantissa=1.3179999589920044, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118983, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202455_T_C', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202467_G_A', pValueMantissa=3.875999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277856, standardError=0.00962082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202772_A_T', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203494_T_C', pValueMantissa=1.9589999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114534, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203542_G_T', pValueMantissa=1.6130000352859497, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697446, standardError=0.00184854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203788_C_A', pValueMantissa=4.110000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113144, standardError=0.0394286, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100204779_C_A', pValueMantissa=4.3379998207092285, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101425, standardError=0.00502088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100205801_A_G', pValueMantissa=4.5329999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814881, standardError=0.00287085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206194_A_T', pValueMantissa=1.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114546, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206333_A_G', pValueMantissa=4.160999774932861, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0263098, standardError=0.0129133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206660_A_G', pValueMantissa=2.4539999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.113651, standardError=0.0505422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206733_C_T', pValueMantissa=1.315999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119003, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207009_TA_T', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114549, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207455_C_G', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593547, standardError=0.00184639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207653_G_A', pValueMantissa=3.6470000743865967, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114874, standardError=0.00194719, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207898_CAAGTT_C', pValueMantissa=3.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921644, standardError=0.0434369, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100208164_G_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277875, standardError=0.0096208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100209200_T_C', pValueMantissa=1.315000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119009, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100210277_C_T', pValueMantissa=1.3040000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119097, standardError=0.00370434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211064_G_A', pValueMantissa=1.9550000429153442, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114558, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211240_A_G', pValueMantissa=7.230000019073486, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00932586, standardError=0.00188208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212531_T_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277872, standardError=0.00962078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212621_T_C', pValueMantissa=1.6109999418258667, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697491, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213072_C_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114567, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213340_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697479, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213631_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697476, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100214977_G_T', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136966, standardError=0.0674913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215512_G_A', pValueMantissa=4.473999977111816, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00816059, standardError=0.0028708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215525_C_CA', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114578, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215535_T_A', pValueMantissa=9.406000137329102, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122847, standardError=0.00371395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215669_A_G', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011458, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216129_G_T', pValueMantissa=1.312000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119034, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216744_G_C', pValueMantissa=2.9519999027252197, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115543, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100217073_T_TCATA', pValueMantissa=4.507999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815394, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218126_C_T', pValueMantissa=1.055999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604851, standardError=0.00184672, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218867_A_G', pValueMantissa=3.3550000190734863, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.205837, standardError=0.0968422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218929_A_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219439_G_A', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219496_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219653_G_A', pValueMantissa=8.52400016784668, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0210222, standardError=0.00799145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219661_T_C', pValueMantissa=7.915999889373779, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163115, standardError=0.00614227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220164_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220814_T_TA', pValueMantissa=4.504000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815468, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220831_C_A', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221396_C_T', pValueMantissa=2.944000005722046, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115551, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221486_T_G', pValueMantissa=1.3890000581741333, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0160699, standardError=0.00653242, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221517_C_A', pValueMantissa=2.5439999103546143, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00413576, standardError=0.00185074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221594_C_G', pValueMantissa=2.0799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0779801, standardError=0.0337333, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223656_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223788_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224059_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACT', pValueMantissa=1.0759999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00473991, standardError=0.00185855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACTCTCTCT', pValueMantissa=9.140999794006348, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0123865, standardError=0.00373569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224729_G_A', pValueMantissa=9.512999534606934, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122608, standardError=0.00371028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224788_C_T', pValueMantissa=4.552000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814496, standardError=0.00287083, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224846_CA_C', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225330_C_T', pValueMantissa=4.679999828338623, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00811972, standardError=0.0028709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225460_G_A', pValueMantissa=1.4520000219345093, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0138989, standardError=0.00568655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227298_T_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227436_A_C', pValueMantissa=2.1089999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204774, standardError=0.00887858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227710_T_C', pValueMantissa=2.624000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115932, standardError=0.00194728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228161_T_C', pValueMantissa=1.1180000305175781, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127208, standardError=0.00390316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228188_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228581_G_GGGA', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228620_A_G', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229692_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229731_G_C', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230118_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230958_C_A', pValueMantissa=3.694000005722046, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264656, standardError=0.0126847, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231193_T_TTTG', pValueMantissa=2.11299991607666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113217, standardError=0.00368321, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231368_T_A', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231561_G_GT', pValueMantissa=4.546000003814697, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815129, standardError=0.00287266, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231791_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100233804_CAG_C', pValueMantissa=3.674999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114848, standardError=0.00194718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100235720_T_G', pValueMantissa=4.255000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0683751, standardError=0.0337137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236254_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236529_C_T', pValueMantissa=1.5670000314712524, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698791, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236538_A_G', pValueMantissa=1.5640000104904175, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698861, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236603_C_T', pValueMantissa=3.1489999294281006, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115356, standardError=0.00194738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237030_C_T', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237733_G_A', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237772_G_A', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237893_A_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238295_A_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238581_A_G', pValueMantissa=6.859000205993652, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255013, standardError=0.00751108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238657_T_C', pValueMantissa=2.809000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01157, standardError=0.00194702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239610_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239637_A_G', pValueMantissa=1.1369999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600877, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239850_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239989_G_A', pValueMantissa=3.2009999752044678, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011529, standardError=0.00194715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240726_T_G', pValueMantissa=4.000999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0525952, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240944_C_T', pValueMantissa=2.8889999389648438, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115616, standardError=0.00194713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242014_C_T', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242478_A_G', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242630_C_T', pValueMantissa=1.253999948501587, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011921, standardError=0.00369498, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242920_TGA_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100243390_G_A', pValueMantissa=8.79800033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0252612, standardError=0.00439142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244149_G_C', pValueMantissa=3.316999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011525, standardError=0.0019484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244398_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244540_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244650_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244773_C_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244991_G_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245546_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245863_C_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246645_C_T', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246672_T_C', pValueMantissa=1.1399999856948853, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600727, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246924_C_T', pValueMantissa=3.4030001163482666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0281666, standardError=0.00961714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100247616_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834089, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248412_C_G', pValueMantissa=1.4470000267028809, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00702484, standardError=0.00184863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248726_A_G', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249239_A_C', pValueMantissa=2.0339999198913574, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0353474, standardError=0.0152353, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249267_A_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249476_T_TC', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249705_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250941_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250976_T_A', pValueMantissa=6.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0690304, standardError=0.0254633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251390_T_A', pValueMantissa=2.9049999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0055723, standardError=0.00187139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251454_A_G', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00712036, standardError=0.00184919, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251790_C_T', pValueMantissa=3.497999906539917, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593413, standardError=0.00281426, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252662_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252768_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252920_T_G', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254207_CCAGA_C', pValueMantissa=3.382999897003174, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921782, standardError=0.0434383, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254700_T_C', pValueMantissa=1.3079999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884636, standardError=0.0275222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254749_C_A', pValueMantissa=3.940999984741211, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00710422, standardError=0.00344885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255058_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255162_C_T', pValueMantissa=3.9679999351501465, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00827516, standardError=0.00287265, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256000_C_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256287_C_T', pValueMantissa=4.053999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00825485, standardError=0.00287235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256511_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604016, standardError=0.00184634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100257612_C_T', pValueMantissa=1.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082026, standardError=0.00350204, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258083_A_G', pValueMantissa=2.7039999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0635849, standardError=0.0287601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258094_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258332_C_T', pValueMantissa=3.9760000705718994, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082729, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260000_A_G', pValueMantissa=1.6239999532699585, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116706, standardError=0.00370306, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260586_A_G', pValueMantissa=3.8919999599456787, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00829222, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260869_C_T', pValueMantissa=4.205999851226807, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082302, standardError=0.00287541, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100262992_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263055_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263140_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263249_C_T', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00711917, standardError=0.00184892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None)], size=1001)]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "window_based_clumped_output = 'gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus'\n", - "\n", - "(\n", - " session.spark.read.parquet(ld_clumped_output)\n", - " .filter(f.size(f.col('qualityControls')) == 0)\n", - "# .show(1, False, True)\n", - " .select('locus', f.size(f.col('locus')).alias('size'))\n", - " .limit(1)\n", - " .collect()\n", - ")" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+---------------------+---------+---------+---------------+\n", + "| studyId|ldPopulationStructure|projectId|studyType|traitFromSource|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "|FINNGEN_R9_K11_EN...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H8_EXT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_RET...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_RHEUMA...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_H7_KER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_HEIGHT...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_SY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_DO...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_PY...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "| FINNGEN_R9_GOUT_NOS| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_FI...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_ALLERG...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_E4_DM2...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_G6_CER...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_L12_UR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_AUTOIM...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_I9_HYP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_M13_AR...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "|FINNGEN_R9_K11_AP...| [{fin, 1.0}]| FINNGEN| gwas| cicaful|\n", + "+--------------------+---------------------+---------+---------+---------------+\n", + "only showing top 20 rows\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": null, - "id": "e242acdd", - "metadata": {}, - "outputs": [], - "source": [] + "name": "stderr", + "output_type": "stream", + "text": [ + "23/10/13 11:55:34 WARN GhfsStorageStatistics: Detected potential high latency for operation op_open. latencyMs=676; previousMaxLatencyMs=470; operationCount=333148; context=gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/ld_index/chromosome=5/part-00076-ff42773a-494c-46d2-bc22-322062b5e715.c000.snappy.parquet\n", + "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=279; previousMaxLatencyMs=243; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239103300432709600941830_0086_m_000000_80535/part-00000-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", + "23/10/13 12:39:11 WARN GhfsStorageStatistics: Detected potential high latency for operation op_create. latencyMs=335; previousMaxLatencyMs=279; operationCount=140; context=gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus/_temporary/0/_temporary/attempt_202310131239106417331548307580589_0086_m_000027_80562/part-00027-17d449c4-f0c3-4617-b378-b74b864ab64a-c000.snappy.parquet\n", + " \r" + ] } - ], - "metadata": { - "gist": { - "data": { - "description": "GCS/dsuveges/PICS/2023.10.06 - PICS FINNGEN from top to bottom.ipynb", - "public": false - }, - "id": "" - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + ], + "source": [ + "ld_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.13_ld_clumped_w_locus\"\n", + "\n", + "studies_df = (\n", + " session.spark.read.parquet(window_based_clumped_output)\n", + " # Generating a list of study identifiers:\n", + " .select(\"studyId\")\n", + " .distinct()\n", + " # Adding fabricated values required to parse as gwas catalog study:\n", + " .select(\n", + " \"studyId\",\n", + " StudyIndex.aggregate_and_map_ancestries(\n", + " f.array(\n", + " f.struct(\n", + " f.lit(\"Finnish\").alias(\"ancestry\"),\n", + " f.lit(100).cast(\"long\").alias(\"sampleSize\")\n", + " )\n", + " )\n", + " ).alias(\"ldPopulationStructure\"),\n", + " f.lit(\"FINNGEN\").alias(\"projectId\"),\n", + " f.lit(\"gwas\").alias(\"studyType\"),\n", + " f.lit(\"cicaful\").alias(\"traitFromSource\")\n", + " )\n", + ")\n", + "\n", + "study_index = (\n", + " StudyIndex(\n", + " _df=studies_df,\n", + " _schema=StudyIndex.get_schema()\n", + " )\n", + ")\n", + "\n", + "study_index.df.show()\n", + "\n", + "# Loading ld index:\n", + "ld_index = LDIndex.from_parquet(session, ld_index_path)\n", + "\n", + "(\n", + " # To annotate study/locus, study level info and ld panel is needed:\n", + " LDAnnotator.ld_annotate(\n", + " StudyLocus.from_parquet(session, window_based_clumped_output),\n", + " study_index,\n", + " ld_index\n", + " )\n", + " # Clumping linked study-loci together:\n", + " .clump()\n", + " .df.write.mode(\"overwrite\").parquet(ld_clumped_output)\n", + ")\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f637e3c0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T10:43:26.766382Z", + "start_time": "2023-10-13T10:43:25.980232Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------+-----+\n", + "|qualityControls |count|\n", + "+--------------------------------------------------------------+-----+\n", + "|[Variant not found in LD reference] |4607 |\n", + "|[] |13813|\n", + "|[Explained by a more significant variant in high LD (clumped)]|585 |\n", + "+--------------------------------------------------------------+-----+\n", + "\n" + ] + } + ], + "source": [ + "(\n", + " session.spark.read.parquet(ld_clumped_output)\n", + " .groupBy(\"qualityControls\")\n", + " .count()\n", + "# .show(1, False, True)\n", + " .show(truncate=False)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "5bf42196", + "metadata": { + "ExecuteTime": { + "end_time": "2023-10-13T12:55:39.212186Z", + "start_time": "2023-10-13T12:55:38.131092Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" + { + "data": { + "text/plain": [ + "[Row(locus=[Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764322_T_C', pValueMantissa=2.3949999809265137, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0201963, standardError=0.00665169, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99764860_G_A', pValueMantissa=1.0499999523162842, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813303, standardError=0.00248194, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765280_C_T', pValueMantissa=7.499000072479248, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147615, standardError=0.00437943, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99765335_A_G', pValueMantissa=1.2640000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107816, standardError=0.00189456, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766311_C_T', pValueMantissa=1.0579999685287476, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010837, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766702_A_G', pValueMantissa=1.2059999704360962, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107966, standardError=0.00189453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99766923_T_C', pValueMantissa=1.3300000429153442, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010765, standardError=0.00189451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99767090_TTTG_T', pValueMantissa=1.2740000486373901, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107778, standardError=0.00189432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768341_T_C', pValueMantissa=1.2289999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107887, standardError=0.00189422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768718_A_G', pValueMantissa=1.2649999856948853, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107795, standardError=0.0018942, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99768993_G_A', pValueMantissa=1.1629999876022339, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108066, standardError=0.00189423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769297_T_C', pValueMantissa=1.2929999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113037, standardError=0.00186275, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769386_C_T', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00670209, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769548_A_G', pValueMantissa=1.7280000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0067021, standardError=0.00281514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99769607_C_T', pValueMantissa=1.2710000276565552, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107775, standardError=0.00189416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99770233_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108149, standardError=0.00189434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771038_C_A', pValueMantissa=1.1039999723434448, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108218, standardError=0.00189392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771332_T_C', pValueMantissa=1.284999966621399, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00972726, standardError=0.00390986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99771548_C_T', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108168, standardError=0.00189473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774249_G_A', pValueMantissa=1.0410000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813435, standardError=0.00248058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99774476_AT_A', pValueMantissa=1.1540000438690186, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108061, standardError=0.0018937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777761_G_A', pValueMantissa=2.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0857961, standardError=0.0393337, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99777984_T_G', pValueMantissa=9.097999572753906, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108749, standardError=0.00189236, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778063_G_A', pValueMantissa=1.2730000019073486, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00887632, standardError=0.00203368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99778821_G_A', pValueMantissa=1.6679999828338623, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00682868, standardError=0.00285271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99779613_C_G', pValueMantissa=7.630000114440918, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109299, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781296_A_G', pValueMantissa=8.560999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010892, standardError=0.00189195, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781822_G_A', pValueMantissa=1.4390000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00689344, standardError=0.00281655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99781826_A_G', pValueMantissa=7.65500020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109284, standardError=0.00189207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99782821_C_T', pValueMantissa=1.3680000305175781, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00573303, standardError=0.00232523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783206_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99783290_A_C', pValueMantissa=8.821999549865723, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108841, standardError=0.00189224, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784269_C_T', pValueMantissa=9.149999618530273, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108721, standardError=0.00189218, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784331_G_A', pValueMantissa=4.435999870300293, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0327234, standardError=0.0162747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99784751_C_A', pValueMantissa=3.0409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.149822, standardError=0.0692119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99785581_A_G', pValueMantissa=7.164000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113888, standardError=0.00423514, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99786875_C_T', pValueMantissa=5.257999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110515, standardError=0.00189278, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787050_C_G', pValueMantissa=6.671999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109731, standardError=0.00189226, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787264_C_A', pValueMantissa=7.834000110626221, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109198, standardError=0.00189186, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787285_C_T', pValueMantissa=9.189000129699707, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108723, standardError=0.00189246, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787359_T_G', pValueMantissa=7.504000186920166, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109356, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787460_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787461_G_T', pValueMantissa=6.499000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.010984, standardError=0.00189269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787483_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787568_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787571_C_T', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787694_A_AT', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787855_C_T', pValueMantissa=8.937999725341797, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108798, standardError=0.00189223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787860_C_T', pValueMantissa=7.64300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0231471, standardError=0.0086776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787890_G_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787906_T_A', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99787915_T_G', pValueMantissa=7.631999969482422, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788026_C_T', pValueMantissa=7.7870001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.00189252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788420_A_C', pValueMantissa=7.001999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109573, standardError=0.00189216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788711_G_A', pValueMantissa=1.0420000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108302, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788859_C_T', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99788952_C_T', pValueMantissa=9.12399959564209, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108727, standardError=0.00189214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789038_A_G', pValueMantissa=7.164000034332275, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109498, standardError=0.00189212, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789217_G_C', pValueMantissa=7.72599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109277, standardError=0.00189247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789506_G_C', pValueMantissa=7.671000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109278, standardError=0.00189209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99789829_T_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790008_G_A', pValueMantissa=7.603000164031982, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109305, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790154_G_A', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99790319_T_G', pValueMantissa=7.857999801635742, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109213, standardError=0.00189229, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791174_G_A', pValueMantissa=7.623000144958496, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0276216, standardError=0.00820577, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99791224_A_G', pValueMantissa=7.632999897003174, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109293, standardError=0.00189206, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793129_A_T', pValueMantissa=9.17300033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108711, standardError=0.00189215, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793502_C_T', pValueMantissa=1.0099999904632568, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108395, standardError=0.00189201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99793829_C_CGTAT', pValueMantissa=3.756999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.201946, standardError=0.0971122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794292_T_A', pValueMantissa=1.8420000076293945, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0427514, standardError=0.0181376, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99794803_C_G', pValueMantissa=3.76200008392334, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0754336, standardError=0.0362844, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797363_G_A', pValueMantissa=2.696000099182129, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0451691, standardError=0.0204184, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99797572_A_C', pValueMantissa=7.729000091552734, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0109255, standardError=0.0018921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798877_A_T', pValueMantissa=5.47599983215332, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111187, standardError=0.0019065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99798989_G_T', pValueMantissa=4.708000183105469, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00645552, standardError=0.00184611, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99799669_G_A', pValueMantissa=1.3769999742507935, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0283588, standardError=0.0115134, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801055_G_A', pValueMantissa=5.751999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0863438, standardError=0.0312661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99801648_T_C', pValueMantissa=5.201000213623047, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.35431, standardError=0.126797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99802216_C_T', pValueMantissa=8.795999526977539, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312825, standardError=0.00584722, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99803737_A_G', pValueMantissa=4.105000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0838538, standardError=0.0410448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804058_G_A', pValueMantissa=9.253999710083008, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00819335, standardError=0.00247362, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804255_C_G', pValueMantissa=8.798999786376953, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312823, standardError=0.00584723, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99804875_C_T', pValueMantissa=2.2079999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0532293, standardError=0.023254, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805400_A_G', pValueMantissa=5.626999855041504, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0215236, standardError=0.00777382, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99805994_G_A', pValueMantissa=1.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125221, standardError=0.00522031, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806253_C_T', pValueMantissa=1.2120000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00800751, standardError=0.00247451, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99806469_CAT_C', pValueMantissa=1.996999979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01596, standardError=0.00685871, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807109_T_A', pValueMantissa=3.994999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0097045, standardError=0.00274107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807669_A_G', pValueMantissa=4.577000141143799, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111561, standardError=0.00190316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99807962_A_G', pValueMantissa=3.7709999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0677375, standardError=0.0325981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809156_C_A', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696552, standardError=0.0028632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809726_T_C', pValueMantissa=4.446000099182129, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111654, standardError=0.00190318, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99809873_G_A', pValueMantissa=4.642000198364258, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.122379, standardError=0.0614495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811236_C_A', pValueMantissa=7.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110215, standardError=0.00190371, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99811771_C_T', pValueMantissa=4.526000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111597, standardError=0.00190317, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815174_G_C', pValueMantissa=6.111000061035156, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110649, standardError=0.00190324, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815628_A_G', pValueMantissa=9.194999694824219, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211397, standardError=0.00637879, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99815640_A_G', pValueMantissa=8.413999557495117, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0902758, standardError=0.0342605, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816387_G_A', pValueMantissa=4.604000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0346061, standardError=0.0173466, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816562_G_A', pValueMantissa=3.677000045776367, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00976812, standardError=0.00274214, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99816570_G_A', pValueMantissa=1.152999997138977, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804666, standardError=0.00247569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99817203_T_C', pValueMantissa=7.421999931335449, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110057, standardError=0.00190374, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99818525_T_C', pValueMantissa=1.4880000352859497, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0186574, standardError=0.0076615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99819195_T_G', pValueMantissa=6.382999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124767, standardError=0.0045745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99820908_A_G', pValueMantissa=1.4980000257492065, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00696602, standardError=0.0028633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821086_GA_G', pValueMantissa=3.259999990463257, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113261, standardError=0.00272622, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821094_C_T', pValueMantissa=4.098999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112471, standardError=0.00191273, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99821955_T_G', pValueMantissa=4.670000076293945, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112087, standardError=0.00191323, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822427_T_C', pValueMantissa=2.058000087738037, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115151, standardError=0.00192136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99822696_T_C', pValueMantissa=7.763000011444092, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.162918, standardError=0.0611962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823047_A_G', pValueMantissa=7.198999881744385, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110742, standardError=0.0019139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99823280_T_C', pValueMantissa=1.1619999408721924, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00804213, standardError=0.00247592, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825419_A_G', pValueMantissa=1.2710000276565552, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0826158, standardError=0.0331567, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825752_T_C', pValueMantissa=6.0370001792907715, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111297, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99825835_C_T', pValueMantissa=6.0320000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111299, standardError=0.00191372, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99827260_C_T', pValueMantissa=3.6500000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0489284, standardError=0.0233964, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828083_C_T', pValueMantissa=3.938999891281128, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0959414, standardError=0.0465714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828402_T_A', pValueMantissa=9.142000198364258, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211518, standardError=0.00637931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99828407_A_T', pValueMantissa=9.133999824523926, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0211533, standardError=0.0063793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829453_A_AT', pValueMantissa=6.083000183105469, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0111253, standardError=0.00191338, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99829545_ATATTT_A', pValueMantissa=4.810999870300293, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112061, standardError=0.00191441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830168_G_A', pValueMantissa=1.218999981880188, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00801018, standardError=0.00247653, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99830263_G_A', pValueMantissa=1.6970000267028809, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0179959, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832187_T_C', pValueMantissa=4.421000003814697, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0112213, standardError=0.0019124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832400_AAC_A', pValueMantissa=6.706999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110021, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832402_C_CTGTGTGT', pValueMantissa=6.710999965667725, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0110019, standardError=0.00189753, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832563_A_G', pValueMantissa=1.4479999542236328, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0090241, standardError=0.00187287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99832865_A_G', pValueMantissa=4.169000148773193, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0105412, standardError=0.00192234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834145_G_C', pValueMantissa=6.802999973297119, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.260334, standardError=0.0961939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99834214_T_C', pValueMantissa=1.784000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0474718, standardError=0.0200386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99835361_G_A', pValueMantissa=2.0769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0595141, standardError=0.0257408, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99841479_C_T', pValueMantissa=6.188000202178955, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104861, standardError=0.00193711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99842816_A_G', pValueMantissa=8.645000457763672, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00723726, standardError=0.00184352, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844024_C_G', pValueMantissa=2.3450000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107969, standardError=0.00193341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99844450_C_T', pValueMantissa=2.874000072479248, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107269, standardError=0.00193316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845178_C_T', pValueMantissa=4.0320000648498535, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0656125, standardError=0.0319983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99845936_A_G', pValueMantissa=3.069999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00675859, standardError=0.00312767, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99848765_C_G', pValueMantissa=2.8910000324249268, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114511, standardError=0.00192855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99850966_A_G', pValueMantissa=8.373000144958496, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101864, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99852563_C_T', pValueMantissa=4.5329999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113089, standardError=0.0019287, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99853411_T_TG', pValueMantissa=9.414999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00193121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856822_A_G', pValueMantissa=2.7119998931884766, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114876, standardError=0.00193129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99856987_G_C', pValueMantissa=5.239999771118164, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010358, standardError=0.001903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857429_C_T', pValueMantissa=1.718000054359436, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116617, standardError=0.00193637, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857502_A_G', pValueMantissa=6.296000003814697, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010296, standardError=0.00190308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857670_G_A', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99857979_C_T', pValueMantissa=2.5840001106262207, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00775769, standardError=0.00184386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858035_C_T', pValueMantissa=2.7939999103546143, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011478, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858181_G_C', pValueMantissa=2.7920000553131104, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114783, standardError=0.00193127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99858624_T_C', pValueMantissa=6.314000129699707, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103011, standardError=0.0019042, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859267_C_A', pValueMantissa=1.5019999742507935, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0239274, standardError=0.00753783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859558_G_A', pValueMantissa=6.2779998779296875, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0321283, standardError=0.00593792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99859674_G_A', pValueMantissa=1.1050000190734863, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100907, standardError=0.00190082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861014_C_G', pValueMantissa=1.350000023841858, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080568, standardError=0.00185135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861191_A_G', pValueMantissa=2.062000036239624, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00788332, standardError=0.00185141, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861743_A_C', pValueMantissa=1.621999979019165, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00893977, standardError=0.00186417, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99861975_TTGG_T', pValueMantissa=1.5509999990463257, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00895366, standardError=0.00186357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99862766_C_T', pValueMantissa=1.7289999723434448, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00993376, standardError=0.0019007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863009_T_C', pValueMantissa=1.3009999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0535743, standardError=0.0215732, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99863999_T_C', pValueMantissa=1.4730000495910645, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0137073, standardError=0.00361145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864093_A_C', pValueMantissa=5.741000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322238, standardError=0.00593803, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99864115_G_T', pValueMantissa=7.295000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.150642, standardError=0.0445916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865012_T_C', pValueMantissa=2.450000047683716, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00781456, standardError=0.00185205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865013_G_A', pValueMantissa=1.7259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159887, standardError=0.00510203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865261_T_C', pValueMantissa=1.4459999799728394, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999453, standardError=0.00190036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865337_G_GAAGA', pValueMantissa=1.3170000314712524, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00806712, standardError=0.00185143, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99865513_C_G', pValueMantissa=1.3250000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080656, standardError=0.00185165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99866792_C_T', pValueMantissa=1.4500000476837158, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00803164, standardError=0.00185225, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867170_C_T', pValueMantissa=8.121000289916992, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00192825, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867197_T_C', pValueMantissa=2.680999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0171717, standardError=0.00775509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867487_C_G', pValueMantissa=2.8310000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.359987, standardError=0.164156, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99867528_G_T', pValueMantissa=2.8389999866485596, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0077156, standardError=0.0018432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868259_G_A', pValueMantissa=2.265000104904175, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.119984, standardError=0.0392983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868412_T_G', pValueMantissa=1.6779999732971191, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994383, standardError=0.00190064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868443_A_G', pValueMantissa=1.4809999465942383, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00801978, standardError=0.0018515, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868585_TC_T', pValueMantissa=1.437999963760376, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0080333, standardError=0.00185188, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99868691_T_G', pValueMantissa=1.4730000495910645, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00802444, standardError=0.00185208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99869742_G_A', pValueMantissa=4.677000045776367, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101608, standardError=0.00185986, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870037_G_A', pValueMantissa=3.996999979019165, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0939625, standardError=0.0326443, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99870234_G_A', pValueMantissa=2.5759999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0270256, standardError=0.00896575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871164_A_T', pValueMantissa=9.444999694824219, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101485, standardError=0.0019015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871248_A_C', pValueMantissa=4.265999794006348, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011332, standardError=0.00192934, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871256_C_T', pValueMantissa=1.0980000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100932, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871596_T_C', pValueMantissa=1.097000002861023, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871838_G_C', pValueMantissa=4.270999908447266, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113316, standardError=0.00192933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99871912_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100928, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872008_T_C', pValueMantissa=1.0989999771118164, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100927, standardError=0.00190087, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872112_C_T', pValueMantissa=1.093000054359436, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100944, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99872802_A_G', pValueMantissa=2.828000068664551, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0103237, standardError=0.00185953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873074_C_T', pValueMantissa=4.716000080108643, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112996, standardError=0.00192927, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873158_C_T', pValueMantissa=1.1759999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010069, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873263_C_T', pValueMantissa=1.1440000534057617, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010071, standardError=0.00189938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873471_G_A', pValueMantissa=6.283999919891357, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0723658, standardError=0.0264824, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873553_C_T', pValueMantissa=1.8109999895095825, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122764, standardError=0.00286365, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99873602_C_T', pValueMantissa=3.7880001068115234, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185958, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874022_C_T', pValueMantissa=3.7920000553131104, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102286, standardError=0.00185966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99874186_C_CT', pValueMantissa=1.2230000495910645, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100561, standardError=0.00190097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875195_T_C', pValueMantissa=4.964000225067139, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112867, standardError=0.00192988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875202_G_T', pValueMantissa=1.312999963760376, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100339, standardError=0.00190142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875320_C_A', pValueMantissa=1.2369999885559082, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100535, standardError=0.00190119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875381_T_C', pValueMantissa=1.2410000562667847, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100525, standardError=0.00190121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875452_C_T', pValueMantissa=2.5290000438690186, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0135056, standardError=0.00447237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875704_T_A', pValueMantissa=2.9600000381469727, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00410906, standardError=0.00188882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99875760_A_AG', pValueMantissa=1.2430000305175781, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010052, standardError=0.00190125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876031_G_GT', pValueMantissa=1.3940000534057617, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0240895, standardError=0.00753787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99876891_T_C', pValueMantissa=3.986999988555908, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102146, standardError=0.0018601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878758_G_A', pValueMantissa=2.763000011444092, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.151851, standardError=0.0689453, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99878850_C_G', pValueMantissa=4.1519999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102024, standardError=0.0018603, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880039_G_A', pValueMantissa=4.0960001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102077, standardError=0.00186045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880120_A_C', pValueMantissa=4.75, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113026, standardError=0.00193019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99880736_G_C', pValueMantissa=2.4639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.11912, standardError=0.039343, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99882938_G_A', pValueMantissa=4.218999862670898, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102002, standardError=0.00186086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99883489_C_T', pValueMantissa=7.486000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140267, standardError=0.00524475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99884754_C_T', pValueMantissa=2.5510001182556152, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011665, standardError=0.00195783, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885306_C_T', pValueMantissa=7.618000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122854, standardError=0.00460381, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99885741_T_C', pValueMantissa=4.251999855041504, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101963, standardError=0.00186062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887218_A_G', pValueMantissa=1.3589999675750732, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100249, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99887854_C_T', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010025, standardError=0.00190197, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99888103_G_A', pValueMantissa=3.808000087738037, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0456176, standardError=0.0219955, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99889239_G_C', pValueMantissa=1.3580000400543213, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0100256, standardError=0.00190207, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99890983_C_T', pValueMantissa=1.3830000162124634, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01002, standardError=0.00190223, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891336_A_G', pValueMantissa=3.815000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102374, standardError=0.00186162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891408_C_T', pValueMantissa=1.6360000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996155, standardError=0.00190233, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891590_G_A', pValueMantissa=6.8420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114132, standardError=0.00422021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99891697_T_C', pValueMantissa=4.46999979019165, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010205, standardError=0.00186523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99892983_T_C', pValueMantissa=3.4000000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.177641, standardError=0.083791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893179_G_C', pValueMantissa=5.1570000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112781, standardError=0.00193051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99893428_C_T', pValueMantissa=4.14300012588501, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0102059, standardError=0.00186081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894094_G_C', pValueMantissa=4.321000099182129, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249459, standardError=0.00708754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894492_G_T', pValueMantissa=8.531999588012695, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101123, standardError=0.00188821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894565_A_G', pValueMantissa=4.785999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00954874, standardError=0.00273411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99894939_T_C', pValueMantissa=8.916999816894531, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988844, standardError=0.00184916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895167_T_C', pValueMantissa=4.169000148773193, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00948941, standardError=0.00187497, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99895555_C_T', pValueMantissa=4.659999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0340557, standardError=0.0120355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896225_G_A', pValueMantissa=1.0920000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110344, standardError=0.0019305, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896692_A_G', pValueMantissa=3.4130001068115234, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110917, standardError=0.00187665, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99896979_T_G', pValueMantissa=3.2119998931884766, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0401381, standardError=0.0187308, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99897831_T_C', pValueMantissa=1.9040000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.14616, standardError=0.0623359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898123_G_A', pValueMantissa=1.1069999933242798, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110304, standardError=0.00193059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898484_T_A', pValueMantissa=1.1139999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110285, standardError=0.00193061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99898828_T_C', pValueMantissa=3.2699999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111045, standardError=0.00187657, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99899677_C_CTTGT', pValueMantissa=3.51200008392334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110858, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900290_T_G', pValueMantissa=7.426000118255615, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109405, standardError=0.00189249, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900292_A_AT', pValueMantissa=1.1360000371932983, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00988613, standardError=0.00390553, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99900500_A_C', pValueMantissa=2.2009999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0412365, standardError=0.0180062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901642_T_C', pValueMantissa=5.086999893188477, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113465, standardError=0.0405014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99901731_C_T', pValueMantissa=1.5379999876022339, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0140283, standardError=0.00442901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902496_G_A', pValueMantissa=1.2289999723434448, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0224604, standardError=0.00897057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902603_C_T', pValueMantissa=4.140999794006348, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0854585, standardError=0.0419028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902712_G_C', pValueMantissa=1.1929999589920044, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110082, standardError=0.00193099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902720_C_G', pValueMantissa=3.492000102996826, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011087, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99902757_G_A', pValueMantissa=4.366000175476074, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110198, standardError=0.00187741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903008_A_C', pValueMantissa=3.4590001106262207, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01109, standardError=0.00187705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903292_G_A', pValueMantissa=3.4660000801086426, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110895, standardError=0.00187709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99903681_G_T', pValueMantissa=6.072000026702881, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110979, standardError=0.00190858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904413_A_G', pValueMantissa=3.4719998836517334, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110894, standardError=0.00187714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904499_G_A', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110237, standardError=0.00193097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99904588_G_A', pValueMantissa=9.54800033569336, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142134, standardError=0.00430252, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905340_C_T', pValueMantissa=1.184000015258789, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110128, standardError=0.00193138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905534_G_C', pValueMantissa=1.2209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0379664, standardError=0.0151507, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905541_A_G', pValueMantissa=3.575000047683716, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110805, standardError=0.00187717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99905693_A_G', pValueMantissa=3.490999937057495, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110881, standardError=0.00187721, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906210_T_C', pValueMantissa=3.5, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110874, standardError=0.00187724, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906644_G_A', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110495, standardError=0.00193126, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99906718_T_C', pValueMantissa=3.4709999561309814, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110901, standardError=0.00187726, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908035_C_T', pValueMantissa=7.296000003814697, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148557, standardError=0.00439751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908057_A_G', pValueMantissa=7.160999774932861, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0149937, standardError=0.00443164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908221_T_C', pValueMantissa=3.878000020980835, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110578, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99908813_T_C', pValueMantissa=5.124000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112768, standardError=0.00192994, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909229_T_C', pValueMantissa=8.24899959564209, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998922, standardError=0.0018631, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99909454_A_C', pValueMantissa=7.598999977111816, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109359, standardError=0.00189297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910263_C_T', pValueMantissa=5.330999851226807, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111417, standardError=0.00190898, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910368_T_C', pValueMantissa=3.302999973297119, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011106, standardError=0.00187736, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99910580_T_G', pValueMantissa=1.1369999647140503, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110251, standardError=0.00193122, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911338_T_C', pValueMantissa=3.4579999446868896, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011092, standardError=0.00187738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99911811_G_A', pValueMantissa=2.575000047683716, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.118741, standardError=0.0393917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912354_A_G', pValueMantissa=5.099999904632568, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112784, standardError=0.00192997, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99912584_A_G', pValueMantissa=3.447999954223633, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011093, standardError=0.00187739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913097_C_G', pValueMantissa=3.181999921798706, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111182, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99913702_T_C', pValueMantissa=1.0369999408721924, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0108274, standardError=0.00422404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99914373_T_G', pValueMantissa=3.0360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.248118, standardError=0.114583, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915372_A_G', pValueMantissa=3.250999927520752, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111123, standardError=0.0018776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915373_G_A', pValueMantissa=3.3289999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0111042, standardError=0.00187747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915884_T_C', pValueMantissa=5.684999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0109318, standardError=0.00187645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99915918_T_G', pValueMantissa=1.281000018119812, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00983696, standardError=0.00186253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916127_T_C', pValueMantissa=5.081999778747559, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112798, standardError=0.00193, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916503_A_T', pValueMantissa=6.974999904632568, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00734427, standardError=0.00184662, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99916552_T_C', pValueMantissa=2.9839999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122137, standardError=0.00562257, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99917731_C_T', pValueMantissa=5.0289998054504395, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112837, standardError=0.0019301, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99919106_C_T', pValueMantissa=2.8299999237060547, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131403, standardError=0.00440112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99920364_C_T', pValueMantissa=4.159999847412109, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0219416, standardError=0.0076565, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99921641_GC_G', pValueMantissa=5.14900016784668, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112777, standardError=0.00193036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922010_GAAGA_G', pValueMantissa=3.134999990463257, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255599, standardError=0.00709237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922205_A_G', pValueMantissa=8.65999984741211, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997687, standardError=0.00186386, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99922419_C_T', pValueMantissa=5.785999774932861, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112417, standardError=0.00193063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99923392_A_AAAT', pValueMantissa=7.868000030517578, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010012, standardError=0.00186439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924208_C_T', pValueMantissa=6.610000133514404, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112121, standardError=0.00193293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924251_CACGGTGAA_C', pValueMantissa=5.901000022888184, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0112486, standardError=0.0019329, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924611_T_C', pValueMantissa=3.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.028521, standardError=0.0135863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99924854_A_G', pValueMantissa=4.103000164031982, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.135756, standardError=0.0664409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925030_G_A', pValueMantissa=7.132999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123943, standardError=0.00460661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925171_T_C', pValueMantissa=2.7660000324249268, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131669, standardError=0.00439981, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99925527_C_T', pValueMantissa=3.3429999351501465, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011112, standardError=0.00187899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926307_T_C', pValueMantissa=1.2309999465942383, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00985993, standardError=0.0018643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99926344_G_A', pValueMantissa=7.146999835968018, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0123917, standardError=0.00460668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928121_C_T', pValueMantissa=2.6080000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0237748, standardError=0.0106854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99928961_T_A', pValueMantissa=7.409999847412109, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0092492, standardError=0.00274137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99929621_G_C', pValueMantissa=2.4159998893737793, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00965232, standardError=0.00186913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930293_C_T', pValueMantissa=2.371000051498413, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00891412, standardError=0.00188903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930622_A_G', pValueMantissa=2.9200000762939453, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122713, standardError=0.0019469, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99930880_C_G', pValueMantissa=6.189000129699707, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126631, standardError=0.00193652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99931871_G_T', pValueMantissa=1.0870000123977661, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132779, standardError=0.00195421, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932501_G_T', pValueMantissa=7.144999980926514, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130514, standardError=0.0020025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932525_C_G', pValueMantissa=3.86299991607666, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132541, standardError=0.00190924, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99932591_G_A', pValueMantissa=3.625999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0057824, standardError=0.00276148, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933095_G_A', pValueMantissa=6.820000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.041325, standardError=0.0152743, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933333_G_A', pValueMantissa=7.736000061035156, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130529, standardError=0.00190738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933398_T_G', pValueMantissa=1.1490000486373901, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132623, standardError=0.00195424, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933499_T_C', pValueMantissa=7.710999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130536, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933515_AG_A', pValueMantissa=6.0929999351501465, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130982, standardError=0.00200234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933811_A_C', pValueMantissa=3.0450000762939453, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0271544, standardError=0.009164, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99933841_A_G', pValueMantissa=7.820000171661377, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130497, standardError=0.00190735, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935601_G_A', pValueMantissa=6.01200008392334, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131034, standardError=0.00200253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99935839_G_A', pValueMantissa=1.9040000438690186, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0088457, standardError=0.00185702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99936985_A_C', pValueMantissa=8.661999702453613, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130204, standardError=0.00190715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99937543_C_A', pValueMantissa=6.139999866485596, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130966, standardError=0.00200245, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99938738_G_A', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132869, standardError=0.00195344, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939547_T_C', pValueMantissa=6.979000091552734, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130948, standardError=0.00190939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99939652_G_A', pValueMantissa=4.034999847412109, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132546, standardError=0.00191099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99940864_C_T', pValueMantissa=5.973999977111816, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131208, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941429_ACCTCAGGGTTACC_A', pValueMantissa=4.370999813079834, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.187402, standardError=0.0929166, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99941625_T_C', pValueMantissa=7.7729997634887695, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942056_T_C', pValueMantissa=4.118000030517578, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832392, standardError=0.0407701, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942622_C_G', pValueMantissa=4.414999961853027, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132329, standardError=0.00191137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942695_T_C', pValueMantissa=5.933000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131229, standardError=0.0020049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99942879_G_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943051_G_T', pValueMantissa=5.098999977111816, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0153013, standardError=0.00335503, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943272_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943700_G_A', pValueMantissa=1.340000033378601, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0629333, standardError=0.0254482, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99943766_A_G', pValueMantissa=3.8440001010894775, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0136334, standardError=0.00196368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944281_T_C', pValueMantissa=7.932000160217285, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130606, standardError=0.00190951, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944562_A_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99944721_TC_T', pValueMantissa=4.39300012588501, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0135957, standardError=0.0019636, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99945215_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946139_G_A', pValueMantissa=1.3140000104904175, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00899244, standardError=0.00185887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946260_A_G', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946307_A_C', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946514_A_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99946634_G_A', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947232_A_G', pValueMantissa=5.947999954223633, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131222, standardError=0.00200491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947807_T_C', pValueMantissa=4.004000186920166, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132567, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99947876_G_A', pValueMantissa=4.059000015258789, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132552, standardError=0.00191131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99948681_A_G', pValueMantissa=7.769999980926514, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130649, standardError=0.00190932, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99949062_G_A', pValueMantissa=4.873000144958496, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.12509, standardError=0.063468, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99950056_G_A', pValueMantissa=4.761000156402588, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.107573, standardError=0.0543081, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99952120_T_C', pValueMantissa=1.062000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0236237, standardError=0.00721645, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953194_G_A', pValueMantissa=5.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131262, standardError=0.00200494, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953842_C_T', pValueMantissa=4.118000030517578, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132617, standardError=0.00191282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99953915_A_G', pValueMantissa=3.8420000076293945, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132682, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954520_G_A', pValueMantissa=6.242000102996826, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131087, standardError=0.00200505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99954533_T_G', pValueMantissa=4.175000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132459, standardError=0.00191108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956142_G_A', pValueMantissa=4.054999828338623, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132533, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99956727_G_A', pValueMantissa=2.9579999446868896, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0132311, standardError=0.00445185, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99958027_A_G', pValueMantissa=7.925000190734863, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130596, standardError=0.00190933, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959825_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163596, standardError=0.00803454, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99959911_G_A', pValueMantissa=2.3239998817443848, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134674, standardError=0.00201484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962154_T_G', pValueMantissa=6.442999839782715, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130988, standardError=0.002005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99962896_A_G', pValueMantissa=4.985000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.018755, standardError=0.00956281, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963747_T_C', pValueMantissa=3.8350000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.10415, standardError=0.0360205, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963755_G_A', pValueMantissa=4.4070000648498535, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132354, standardError=0.00191167, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963792_C_T', pValueMantissa=1.0329999923706055, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133147, standardError=0.0019575, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963855_G_A', pValueMantissa=6.202000141143799, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131113, standardError=0.00200516, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99963858_G_C', pValueMantissa=4.052000045776367, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132537, standardError=0.00191104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964474_C_A', pValueMantissa=1.5709999799728394, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013808, standardError=0.0020483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99964716_C_T', pValueMantissa=3.6579999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.022367, standardError=0.00769613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965353_C_T', pValueMantissa=4.11899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0832401, standardError=0.0407717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965381_C_T', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0154555, standardError=0.00728972, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99965782_C_T', pValueMantissa=1.2259999513626099, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0312055, standardError=0.00547846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966311_G_A', pValueMantissa=4.085000038146973, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132514, standardError=0.00191102, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99966874_G_A', pValueMantissa=9.85099983215332, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133219, standardError=0.00195661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99967655_A_C', pValueMantissa=4.085999965667725, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132548, standardError=0.00191151, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99968174_T_C', pValueMantissa=6.03000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131184, standardError=0.00200495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99970196_C_T', pValueMantissa=1.940999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134874, standardError=0.00191619, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99971874_A_G', pValueMantissa=4.980999946594238, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132011, standardError=0.0019115, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_C_CATTT', pValueMantissa=9.527999877929688, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00936982, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973080_CATTT_C', pValueMantissa=3.311000108718872, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013347, standardError=0.00191661, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973360_A_G', pValueMantissa=1.6030000448226929, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0940323, standardError=0.0390452, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973664_T_C', pValueMantissa=4.126999855041504, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013249, standardError=0.00191107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973694_T_C', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99973733_A_G', pValueMantissa=4.34499979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132363, standardError=0.00191125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99974260_C_T', pValueMantissa=2.316999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0316527, standardError=0.0139405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975197_T_C', pValueMantissa=2.117000102996826, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134651, standardError=0.00191633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99975489_C_G', pValueMantissa=5.743000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0354502, standardError=0.0128345, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99976504_G_A', pValueMantissa=8.508999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0819298, standardError=0.031138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977161_A_G', pValueMantissa=4.061999797821045, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132532, standardError=0.00191106, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99977721_G_A', pValueMantissa=6.2829999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0246959, standardError=0.00903733, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979375_G_A', pValueMantissa=3.937000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.13666, standardError=0.0663293, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979565_C_T', pValueMantissa=4.479000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0275515, standardError=0.0137302, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99979592_G_A', pValueMantissa=3.3989999294281006, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133022, standardError=0.00191119, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980479_A_C', pValueMantissa=7.7230000495910645, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0930047, standardError=0.0349125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99980767_T_TG', pValueMantissa=3.1600000858306885, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133205, standardError=0.001911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99981303_T_C', pValueMantissa=1.0260000228881836, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129016, standardError=0.0019962, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982408_C_T', pValueMantissa=4.807000160217285, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131845, standardError=0.00200471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99982941_G_A', pValueMantissa=3.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133135, standardError=0.00191092, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983547_G_T', pValueMantissa=1.378000020980835, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138444, standardError=0.00204793, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99983965_C_T', pValueMantissa=1.3339999914169312, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.276188, standardError=0.0722979, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984671_A_G', pValueMantissa=1.090999960899353, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012885, standardError=0.00199651, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99984912_C_T', pValueMantissa=3.328000068664551, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133085, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99986015_T_C', pValueMantissa=1.0609999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012891, standardError=0.00199615, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988026_G_T', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122774, standardError=0.0046077, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988174_G_A', pValueMantissa=3.121999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133243, standardError=0.0019111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988593_A_C', pValueMantissa=4.09499979019165, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0833533, standardError=0.0407789, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988730_T_C', pValueMantissa=3.1760001182556152, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133191, standardError=0.00191101, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988731_G_A', pValueMantissa=5.669000148773193, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144037, standardError=0.00520681, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99988980_A_G', pValueMantissa=4.874000072479248, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131807, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989148_T_C', pValueMantissa=4.875, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131806, standardError=0.00200475, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989685_T_C', pValueMantissa=4.556000232696533, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132006, standardError=0.00200472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99989906_C_T', pValueMantissa=3.2639999389648438, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133133, standardError=0.00191121, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990445_G_A', pValueMantissa=6.452000141143799, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.090219, standardError=0.0331213, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990521_G_A', pValueMantissa=2.9019999504089355, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013345, standardError=0.00191124, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99990640_T_A', pValueMantissa=1.5579999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0139907, standardError=0.00442234, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992006_G_GA', pValueMantissa=3.0260000228881836, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133329, standardError=0.00191111, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992015_T_C', pValueMantissa=3.5850000381469727, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013291, standardError=0.00191165, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99992806_A_G', pValueMantissa=3.0290000438690186, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00191112, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993453_A_G', pValueMantissa=3.0329999923706055, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133323, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99993852_T_C', pValueMantissa=3.0360000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133322, standardError=0.00191113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994177_C_T', pValueMantissa=4.533999919891357, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0132032, standardError=0.00200489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99994349_A_T', pValueMantissa=1.0379999876022339, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0287633, standardError=0.00422921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995001_T_C', pValueMantissa=3.2860000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133152, standardError=0.00191176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995032_G_C', pValueMantissa=4.89900016784668, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131854, standardError=0.00200569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995714_T_C', pValueMantissa=3.374000072479248, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133048, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99995753_C_CTT', pValueMantissa=3.372999906539917, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133049, standardError=0.00191128, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99996207_C_G', pValueMantissa=3.384000062942505, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133041, standardError=0.00191129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997268_A_G', pValueMantissa=3.378999948501587, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133047, standardError=0.00191132, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997438_CCA_C', pValueMantissa=6.603000164031982, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.109829, standardError=0.0404341, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99997720_A_G', pValueMantissa=2.815999984741211, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133548, standardError=0.00191149, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998079_C_CA', pValueMantissa=4.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0922906, standardError=0.0462786, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99998104_G_A', pValueMantissa=1.2979999780654907, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00911911, standardError=0.0018841, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_99999971_A_G', pValueMantissa=2.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.030431, standardError=0.0102384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000235_C_T', pValueMantissa=5.6519999504089355, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014492, standardError=0.00201036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100000486_G_A', pValueMantissa=4.172999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.305198, standardError=0.149885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002038_G_A', pValueMantissa=3.7739999294281006, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0211624, standardError=0.0073064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100002628_A_C', pValueMantissa=2.953000068664551, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0138093, standardError=0.00189258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004140_G_A', pValueMantissa=2.6459999084472656, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0994314, standardError=0.0448022, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100004827_A_C', pValueMantissa=6.945000171661377, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142296, standardError=0.0019001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005233_T_C', pValueMantissa=3.111999988555908, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216712, standardError=0.00733013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005358_G_C', pValueMantissa=4.872000217437744, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145472, standardError=0.00201239, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100005438_A_G', pValueMantissa=1.093000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0533162, standardError=0.02095, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100006780_C_T', pValueMantissa=5.067999839782715, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145408, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007241_C_T', pValueMantissa=6.783999919891357, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142505, standardError=0.0019021, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100007404_G_GC', pValueMantissa=1.3420000076293945, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0198944, standardError=0.00377285, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100008640_A_G', pValueMantissa=5.019999980926514, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145435, standardError=0.002013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009013_G_A', pValueMantissa=6.611999988555908, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142475, standardError=0.00190084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100009635_T_G', pValueMantissa=1.0549999475479126, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134968, standardError=0.0018948, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011477_C_G', pValueMantissa=2.444999933242798, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0148805, standardError=0.00203232, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011685_CAAAT_C', pValueMantissa=4.139999866485596, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101715, standardError=0.00185449, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100011812_A_T', pValueMantissa=1.2029999494552612, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0141145, standardError=0.00190314, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013275_A_T', pValueMantissa=2.174999952316284, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145924, standardError=0.00191005, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100013744_G_A', pValueMantissa=4.76800012588501, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.51719, standardError=0.261177, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014566_A_G', pValueMantissa=8.550999641418457, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119513, standardError=0.00358432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100014970_T_C', pValueMantissa=3.993000030517578, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0146099, standardError=0.00201355, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015400_G_A', pValueMantissa=5.646999835968018, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160357, standardError=0.00222448, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015645_T_C', pValueMantissa=2.236999988555908, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145559, standardError=0.00207384, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100015854_C_T', pValueMantissa=6.158999919891357, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160044, standardError=0.0022238, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016635_T_G', pValueMantissa=1.718999981880188, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147181, standardError=0.00218755, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100016645_C_T', pValueMantissa=4.622000217437744, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0256776, standardError=0.00906606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017027_A_T', pValueMantissa=6.242000102996826, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0160069, standardError=0.0022247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100017624_A_G', pValueMantissa=1.7170000076293945, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147203, standardError=0.00218782, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018116_C_T', pValueMantissa=2.197000026702881, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145668, standardError=0.00207465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018135_G_C', pValueMantissa=1.4559999704360962, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.275534, standardError=0.0725377, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100018265_A_T', pValueMantissa=2.7190001010894775, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00874366, standardError=0.00186392, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100020857_T_C', pValueMantissa=9.112000465393066, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0156784, standardError=0.00210358, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021675_C_A', pValueMantissa=3.066999912261963, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0233385, standardError=0.0107983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100021907_C_T', pValueMantissa=7.229000091552734, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0159723, standardError=0.00222609, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100022313_C_CT', pValueMantissa=6.171999931335449, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0504229, standardError=0.0184125, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100023134_T_G', pValueMantissa=1.3980000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0268617, standardError=0.0109298, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024168_G_A', pValueMantissa=2.3359999656677246, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00880598, standardError=0.00186491, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100024869_C_T', pValueMantissa=3.556999921798706, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162101, standardError=0.00222929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100025927_T_TA', pValueMantissa=3.621999979019165, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014426, standardError=0.00207534, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100026878_C_T', pValueMantissa=9.258999824523926, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0185461, standardError=0.00712673, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027354_G_A', pValueMantissa=1.968000054359436, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103617, standardError=0.0444235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027592_G_C', pValueMantissa=1.965999960899353, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.103629, standardError=0.0444216, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100027903_T_C', pValueMantissa=2.75600004196167, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0384662, standardError=0.0128487, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100028049_C_T', pValueMantissa=4.144000053405762, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.130023, standardError=0.0637634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100029663_A_G', pValueMantissa=8.883999824523926, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0147895, standardError=0.00206939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030853_G_A', pValueMantissa=7.5980000495910645, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0158245, standardError=0.00220759, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100030993_G_A', pValueMantissa=3.437000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0224965, standardError=0.00768921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100031808_C_T', pValueMantissa=5.959000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212214, standardError=0.00771671, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100032684_A_C', pValueMantissa=5.459000110626221, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.014926, standardError=0.00206922, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033239_T_A', pValueMantissa=1.3669999837875366, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0463194, standardError=0.0187842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033337_C_T', pValueMantissa=9.138999938964844, pValueExponent=-14, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0165264, standardError=0.00221749, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100033635_G_GT', pValueMantissa=1.0110000371932983, pValueExponent=-13, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164902, standardError=0.00221658, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100035604_T_A', pValueMantissa=3.4110000133514404, pValueExponent=-12, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01433, standardError=0.002059, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037190_G_A', pValueMantissa=3.2070000171661377, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120692, standardError=0.00203849, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037544_C_T', pValueMantissa=1.6990000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996527, standardError=0.00417483, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100037655_A_G', pValueMantissa=6.13100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127317, standardError=0.00219016, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038188_C_T', pValueMantissa=7.738999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126728, standardError=0.00219478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038589_T_C', pValueMantissa=3.734999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010628, standardError=0.00193133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100038648_G_A', pValueMantissa=1.7230000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994355, standardError=0.00417478, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039544_T_C', pValueMantissa=5.021999835968018, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126227, standardError=0.00202988, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039545_G_T', pValueMantissa=1.5509999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130939, standardError=0.00204582, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039976_C_T', pValueMantissa=1.7209999561309814, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00994495, standardError=0.00417473, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100039997_T_C', pValueMantissa=5.01800012588501, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126197, standardError=0.00202937, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100040770_T_G', pValueMantissa=3.059999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.120454, standardError=0.0557085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042338_T_C', pValueMantissa=2.61899995803833, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.189007, standardError=0.085007, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042505_G_A', pValueMantissa=3.4860000610351562, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101879, standardError=0.00482832, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100042848_C_CT', pValueMantissa=4.413000106811523, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0093599, standardError=0.00185336, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100043308_C_T', pValueMantissa=5.076000213623047, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126162, standardError=0.00202939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044357_C_T', pValueMantissa=5.36299991607666, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0127797, standardError=0.00218999, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044501_A_G', pValueMantissa=1.7130000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00995148, standardError=0.00417441, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044818_C_T', pValueMantissa=4.927000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204248, standardError=0.00726406, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100044839_G_T', pValueMantissa=4.875, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126274, standardError=0.00202913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045047_A_C', pValueMantissa=4.922999858856201, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204266, standardError=0.00726404, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045603_T_A', pValueMantissa=1.6740000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998325, standardError=0.00417297, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045685_C_T', pValueMantissa=1.3309999704360962, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0131383, standardError=0.00204533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100045864_G_A', pValueMantissa=1.6770000457763672, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00998092, standardError=0.00417295, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046495_A_G', pValueMantissa=4.683000087738037, pValueExponent=-11, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133938, standardError=0.00203532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100046569_C_T', pValueMantissa=1.6740000247955322, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129058, standardError=0.00202014, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100047823_TA_T', pValueMantissa=1.5670000314712524, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129238, standardError=0.00201974, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049106_G_A', pValueMantissa=1.690000057220459, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130999, standardError=0.00217423, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049236_C_T', pValueMantissa=1.690000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00996986, standardError=0.00417357, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100049902_G_A', pValueMantissa=1.8940000534057617, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130591, standardError=0.00217409, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050211_A_T', pValueMantissa=2.1419999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0633556, standardError=0.0275398, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100050359_GAACA_G', pValueMantissa=1.6019999980926514, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129195, standardError=0.00202015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051409_C_G', pValueMantissa=1.7120000123977661, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130944, standardError=0.00217407, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100051504_G_A', pValueMantissa=1.7549999952316284, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00990516, standardError=0.00417051, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052545_C_G', pValueMantissa=1.5299999713897705, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129286, standardError=0.00201936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100052742_T_C', pValueMantissa=1.687000036239624, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00997036, standardError=0.00417237, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054045_C_T', pValueMantissa=1.3009999990463257, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0129769, standardError=0.0020191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054117_T_C', pValueMantissa=4.938000202178955, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0716183, standardError=0.0364414, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100054574_T_G', pValueMantissa=1.6629999876022339, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999072, standardError=0.00417196, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055122_T_C', pValueMantissa=6.368000030517578, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124774, standardError=0.00214876, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055153_G_A', pValueMantissa=1.6540000438690186, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00999801, standardError=0.0041714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055199_C_G', pValueMantissa=1.8609999418258667, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0130598, standardError=0.00217319, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055816_G_A', pValueMantissa=3.3589999675750732, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0126847, standardError=0.00201947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100055862_T_G', pValueMantissa=4.1529998779296875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0446939, standardError=0.0219282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056323_C_T', pValueMantissa=4.943999767303467, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0267439, standardError=0.0136118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100056440_C_T', pValueMantissa=4.486999988555908, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00779499, standardError=0.00388601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057584_A_G', pValueMantissa=5.919000148773193, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011644, standardError=0.00200103, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057785_T_C', pValueMantissa=4.816999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128495, standardError=0.00219523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100057800_C_T', pValueMantissa=1.0049999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122603, standardError=0.00200707, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059207_A_C', pValueMantissa=3.622999906539917, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0143322, standardError=0.00401899, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAAC', pValueMantissa=3.5920000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00695612, standardError=0.00194938, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059401_T_TAACAACAAC', pValueMantissa=3.884999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133237, standardError=0.00644961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100059657_G_A', pValueMantissa=3.880000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133275, standardError=0.00645004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060102_G_C', pValueMantissa=3.874000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133327, standardError=0.00645048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060272_A_G', pValueMantissa=4.5370001792907715, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0594699, standardError=0.0297173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100060908_A_G', pValueMantissa=2.742000102996826, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113896, standardError=0.00204953, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061298_C_T', pValueMantissa=2.503000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0150616, standardError=0.00672123, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061574_G_C', pValueMantissa=2.7809998989105225, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113862, standardError=0.00204983, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061627_C_T', pValueMantissa=1.6690000295639038, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0323984, standardError=0.00537545, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100061926_T_C', pValueMantissa=1.1759999990463257, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122155, standardError=0.00200796, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062022_C_T', pValueMantissa=9.611000061035156, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0212829, standardError=0.00821882, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062212_C_T', pValueMantissa=3.7899999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0133927, standardError=0.00645157, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062744_C_A', pValueMantissa=3.752000093460083, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134223, standardError=0.00645282, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100062935_C_T', pValueMantissa=3.7669999599456787, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0134118, standardError=0.00645294, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063173_T_G', pValueMantissa=2.7899999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011387, standardError=0.00205019, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063265_C_T', pValueMantissa=2.61299991607666, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0142012, standardError=0.00638472, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063639_C_T', pValueMantissa=2.7750000953674316, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276973, standardError=0.0125851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100063786_T_C', pValueMantissa=2.9630000591278076, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011365, standardError=0.00205011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064214_T_C', pValueMantissa=5.559999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0128066, standardError=0.00219686, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064301_T_C', pValueMantissa=2.427999973297119, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0540203, standardError=0.0239811, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064486_T_C', pValueMantissa=2.484999895095825, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0271265, standardError=0.00428678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064533_A_G', pValueMantissa=8.324000358581543, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771332, standardError=0.00196024, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100064544_T_C', pValueMantissa=8.236000061035156, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00771787, standardError=0.00196013, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100065403_C_G', pValueMantissa=1.7259999513626099, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00799338, standardError=0.00185995, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066509_T_C', pValueMantissa=3.444999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925747, standardError=0.0437751, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100066929_C_A', pValueMantissa=4.581999778747559, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0250808, standardError=0.012559, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067656_G_A', pValueMantissa=2.6489999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143151, standardError=0.00645107, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100067862_G_A', pValueMantissa=7.921999931335449, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119879, standardError=0.00195036, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068504_C_T', pValueMantissa=6.7170000076293945, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00746427, standardError=0.00187258, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068843_C_A', pValueMantissa=1.2430000305175781, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115969, standardError=0.00203679, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100068866_G_GT', pValueMantissa=1.312000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115787, standardError=0.00203689, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069305_A_T', pValueMantissa=2.6449999809265137, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143181, standardError=0.00645098, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069570_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151566, standardError=0.00504359, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100069757_C_T', pValueMantissa=2.5869998931884766, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0145205, standardError=0.00481941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100070175_A_G', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0130301, standardError=0.00421666, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100072279_G_C', pValueMantissa=1.2419999837875366, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115973, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073428_G_T', pValueMantissa=2.609999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143509, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100073963_C_T', pValueMantissa=1.0750000476837158, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074034_T_TC', pValueMantissa=2.005000114440918, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0113741, standardError=0.0020269, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074335_C_T', pValueMantissa=1.0729999542236328, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116458, standardError=0.00203643, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074511_G_A', pValueMantissa=4.894000053405762, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0166749, standardError=0.00478271, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100074712_C_T', pValueMantissa=1.2990000247955322, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0487079, standardError=0.0196078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075164_G_A', pValueMantissa=1.2369999885559082, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115989, standardError=0.00203683, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075228_C_T', pValueMantissa=2.6029999256134033, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143577, standardError=0.00645054, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100075751_C_A', pValueMantissa=1.7940000295639038, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0172016, standardError=0.00726754, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100076243_C_A', pValueMantissa=2.6019999980926514, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143585, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077499_A_G', pValueMantissa=4.675000190734863, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00753971, standardError=0.00185191, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100077617_C_A', pValueMantissa=8.185999870300293, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013965, standardError=0.00417311, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078024_G_A', pValueMantissa=4.400000095367432, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0760544, standardError=0.0267049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078160_G_A', pValueMantissa=2.5989999771118164, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143609, standardError=0.00645053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078351_A_T', pValueMantissa=5.255000114440918, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0358513, standardError=0.0103395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078510_A_C', pValueMantissa=8.102999687194824, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119828, standardError=0.00195067, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100078923_G_A', pValueMantissa=1.805999994277954, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171834, standardError=0.00726738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100079042_G_A', pValueMantissa=2.5889999866485596, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143712, standardError=0.00645058, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080295_T_C', pValueMantissa=5.934000015258789, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121315, standardError=0.00195916, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100080362_T_A', pValueMantissa=9.142000198364258, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117746, standardError=0.00204921, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100081203_A_G', pValueMantissa=7.883999824523926, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119901, standardError=0.00195049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100082411_T_C', pValueMantissa=2.5829999446868896, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143766, standardError=0.00645057, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083012_C_A', pValueMantissa=3.0209999084472656, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125696, standardError=0.0019959, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083306_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143789, standardError=0.00645062, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083442_A_T', pValueMantissa=4.665999889373779, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00754005, standardError=0.0018518, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083679_C_T', pValueMantissa=2.5810000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143785, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083851_G_A', pValueMantissa=7.6570000648498535, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119987, standardError=0.00195041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100083869_GTGGA_G', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143832, standardError=0.00645065, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100084120_A_G', pValueMantissa=2.5739998817443848, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143853, standardError=0.00645064, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085028_A_G', pValueMantissa=1.2200000286102295, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116042, standardError=0.00203692, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085123_T_C', pValueMantissa=2.569999933242798, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143893, standardError=0.00645068, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085191_A_C', pValueMantissa=1.0609999895095825, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116492, standardError=0.00203632, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085317_T_C', pValueMantissa=2.6549999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151555, standardError=0.00504327, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085356_CT_C', pValueMantissa=2.989000082015991, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199591, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085677_T_C', pValueMantissa=7.4720001220703125, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0120068, standardError=0.0019505, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085790_C_T', pValueMantissa=9.621999740600586, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0119266, standardError=0.0019502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100085791_G_A', pValueMantissa=6.89300012588501, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0076585, standardError=0.00283442, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100086416_A_C', pValueMantissa=4.2779998779296875, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757727, standardError=0.00185176, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100087170_C_T', pValueMantissa=4.797999858856201, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0249466, standardError=0.0126147, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088100_T_C', pValueMantissa=1.2690000534057617, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115908, standardError=0.00203699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088206_G_A', pValueMantissa=1.8480000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0171185, standardError=0.00726652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088307_G_A', pValueMantissa=8.534000396728516, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0258604, standardError=0.00421546, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088565_A_AGAG', pValueMantissa=2.5799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01438, standardError=0.00645071, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088687_C_T', pValueMantissa=4.041999816894531, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0124937, standardError=0.00199821, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100088994_G_C', pValueMantissa=4.744999885559082, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.26271, standardError=0.13253, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100089654_C_A', pValueMantissa=1.2940000295639038, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115954, standardError=0.00203897, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100090029_G_T', pValueMantissa=3.2170000076293945, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0322465, standardError=0.00583203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100093119_C_T', pValueMantissa=3.0880000591278076, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.379152, standardError=0.0909911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095173_CA_C', pValueMantissa=1.1920000314712524, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116127, standardError=0.00203702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095421_C_T', pValueMantissa=4.376999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00756736, standardError=0.00185174, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095474_G_C', pValueMantissa=1.0429999828338623, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011657, standardError=0.00203668, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095491_G_A', pValueMantissa=2.575000047683716, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143845, standardError=0.00645073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095666_A_G', pValueMantissa=2.997999906539917, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125726, standardError=0.001996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100095766_C_T', pValueMantissa=2.5769999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143829, standardError=0.00645074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096097_G_A', pValueMantissa=4.854000091552734, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.159194, standardError=0.0807015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100096882_A_T', pValueMantissa=1.875, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0170779, standardError=0.00726586, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097204_C_G', pValueMantissa=4.326000213623047, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00757235, standardError=0.00185173, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097630_G_A', pValueMantissa=6.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0183017, standardError=0.0067411, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100097685_G_A', pValueMantissa=2.1630001068115234, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00784104, standardError=0.00341393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100098591_G_A', pValueMantissa=7.1529998779296875, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00762397, standardError=0.00283455, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100099448_G_A', pValueMantissa=2.5399999618530273, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0110489, standardError=0.00198346, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100113_A_G', pValueMantissa=2.996000051498413, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.012573, standardError=0.00199604, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100100236_G_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143946, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101678_G_A', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116505, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101681_G_A', pValueMantissa=2.572999954223633, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143872, standardError=0.00645085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101734_C_T', pValueMantissa=2.805000066757202, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388904, standardError=0.0177047, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101865_T_C', pValueMantissa=7.827000141143799, pValueExponent=-6, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00939164, standardError=0.0021011, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100101978_T_A', pValueMantissa=2.565000057220459, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0143954, standardError=0.00645086, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102891_G_A', pValueMantissa=3.0280001163482666, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125699, standardError=0.00199607, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100102937_T_C', pValueMantissa=1.0709999799728394, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116485, standardError=0.00203677, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103034_T_C', pValueMantissa=1.062000036239624, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116512, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103075_C_T', pValueMantissa=2.5480000972747803, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144117, standardError=0.0064509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103232_C_T', pValueMantissa=1.059999942779541, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116519, standardError=0.00203676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103284_T_C', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115998, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103427_G_A', pValueMantissa=2.5409998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144177, standardError=0.0064504, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100103653_C_A', pValueMantissa=1.2389999628067017, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116, standardError=0.00203711, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104060_G_C', pValueMantissa=1.0570000410079956, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011653, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104416_A_G', pValueMantissa=1.062999963760376, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116511, standardError=0.00203678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104538_T_A', pValueMantissa=3.0250000953674316, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125704, standardError=0.0019961, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100104974_T_C', pValueMantissa=2.5460000038146973, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0144144, standardError=0.00645109, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105358_T_A', pValueMantissa=1.246000051498413, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115981, standardError=0.00203714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105587_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116489, standardError=0.0020368, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100105759_A_T', pValueMantissa=1.253000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115962, standardError=0.00203715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106124_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106127_T_C', pValueMantissa=1.0019999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116787, standardError=0.00203801, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106157_C_A', pValueMantissa=2.5399999618530273, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01442, standardError=0.00645108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100106705_G_GGCAGAGTAA', pValueMantissa=3.0460000038146973, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0125685, standardError=0.00199613, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107060_CG_C', pValueMantissa=1.2519999742507935, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115965, standardError=0.00203718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107246_C_T', pValueMantissa=1.8339999914169312, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148529, standardError=0.0629731, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107759_T_C', pValueMantissa=3.5490000247955322, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00765844, standardError=0.00185209, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100107761_A_G', pValueMantissa=5.459000110626221, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.272006, standardError=0.0786791, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108013_C_T', pValueMantissa=2.561000108718872, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0243527, standardError=0.00807438, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100108920_T_G', pValueMantissa=9.07699966430664, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011727, standardError=0.00204049, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100109874_G_A', pValueMantissa=4.85099983215332, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0248793, standardError=0.0126104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110231_C_T', pValueMantissa=7.883999824523926, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0117687, standardError=0.00203931, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110702_T_G', pValueMantissa=3.5929999351501465, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0606656, standardError=0.0289201, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100110795_TTA_T', pValueMantissa=6.190999984741211, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118518, standardError=0.00203936, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111161_G_A', pValueMantissa=2.000999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0497915, standardError=0.0161136, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111179_C_T', pValueMantissa=6.201000213623047, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118489, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100111991_C_A', pValueMantissa=6.7820000648498535, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118202, standardError=0.00203929, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112419_TA_T', pValueMantissa=5.803999900817871, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118714, standardError=0.00203896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112828_C_T', pValueMantissa=2.8289999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388309, standardError=0.0177045, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100112930_A_C', pValueMantissa=6.804999828338623, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118191, standardError=0.0020393, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100114067_A_G', pValueMantissa=1.0110000371932983, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104825, standardError=0.00196864, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115072_C_T', pValueMantissa=1.034999966621399, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104694, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115087_C_T', pValueMantissa=5.876999855041504, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118682, standardError=0.00203912, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100115453_T_C', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104692, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116179_G_C', pValueMantissa=5.88100004196167, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118679, standardError=0.00203913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116494_A_T', pValueMantissa=1.0360000133514404, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.010469, standardError=0.00196776, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116607_C_T', pValueMantissa=1.0160000324249268, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104762, standardError=0.00196781, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100116979_C_G', pValueMantissa=1.0180000066757202, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104755, standardError=0.0019678, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100117013_G_A', pValueMantissa=1.0379999876022339, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104684, standardError=0.00196777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118204_T_G', pValueMantissa=1.0509999990463257, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104641, standardError=0.00196778, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118462_G_A', pValueMantissa=5.9079999923706055, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0118664, standardError=0.00203914, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100118652_C_T', pValueMantissa=1.128999948501587, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0104375, standardError=0.00196763, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100119929_C_G', pValueMantissa=8.840999603271484, pValueExponent=-10, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0121944, standardError=0.0019896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100120722_G_A', pValueMantissa=5.441999912261963, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106837, standardError=0.00196527, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100121497_C_T', pValueMantissa=1.5360000133514404, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.573298, standardError=0.23652, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100124748_T_C', pValueMantissa=2.8399999141693115, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0388018, standardError=0.0177043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125143_C_CA', pValueMantissa=3.8269999027252197, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0260846, standardError=0.0125892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125152_C_A', pValueMantissa=7.866000175476074, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105533, standardError=0.00196517, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125180_C_T', pValueMantissa=7.633999824523926, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105635, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100125779_A_G', pValueMantissa=7.78000020980835, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105568, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126618_A_C', pValueMantissa=4.631999969482422, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133295, standardError=0.0668985, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100126748_A_G', pValueMantissa=7.800000190734863, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105558, standardError=0.00196509, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100127494_A_T', pValueMantissa=1.8029999732971191, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082724, standardError=0.00349777, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128204_G_GAGAGAA', pValueMantissa=5.4019999504089355, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0107556, standardError=0.00197804, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128221_A_G', pValueMantissa=6.446000099182129, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106227, standardError=0.001965, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128550_G_A', pValueMantissa=8.194000244140625, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105396, standardError=0.00196532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128651_T_C', pValueMantissa=7.315000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105796, standardError=0.00196528, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128763_C_T', pValueMantissa=7.829999923706055, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105544, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128883_C_T', pValueMantissa=8.057000160217285, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0105443, standardError=0.00196508, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100128958_G_A', pValueMantissa=2.124000072479248, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680841, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129035_C_A', pValueMantissa=3.3989999294281006, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0925999, standardError=0.043676, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129320_C_T', pValueMantissa=2.13100004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680465, standardError=0.00295531, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129629_A_C', pValueMantissa=1.8580000400543213, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.148278, standardError=0.0629939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129660_T_C', pValueMantissa=8.699000358581543, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115118, standardError=0.00200055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100129776_G_A', pValueMantissa=1.690000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884659, standardError=0.0281741, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130207_C_T', pValueMantissa=3.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0140895, standardError=0.00483524, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130573_C_G', pValueMantissa=2.9149999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00674022, standardError=0.00186053, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100130860_A_G', pValueMantissa=9.043999671936035, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114981, standardError=0.00200046, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131042_G_A', pValueMantissa=3.619999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.179459, standardError=0.0503203, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131063_C_G', pValueMantissa=2.2909998893737793, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00671867, standardError=0.00295325, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100131465_G_T', pValueMantissa=8.934000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115031, standardError=0.00200061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132172_C_G', pValueMantissa=2.128000020980835, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00680593, standardError=0.00295533, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAA', pValueMantissa=4.828000068664551, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00431663, standardError=0.00218576, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_T_TTAAATAAA', pValueMantissa=4.5980000495910645, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0519863, standardError=0.0260513, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100132602_TTAAATAAATAAA_T', pValueMantissa=7.363999843597412, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116156, standardError=0.00200877, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133539_G_T', pValueMantissa=2.6610000133514404, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678474, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100133661_G_A', pValueMantissa=2.6619999408721924, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00678444, standardError=0.00186073, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134226_T_TAAAC', pValueMantissa=9.397000312805176, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114918, standardError=0.00200162, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134368_G_T', pValueMantissa=2.305999994277954, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00685323, standardError=0.0018608, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100134849_C_G', pValueMantissa=2.5420000553131104, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00680611, standardError=0.00186063, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100136849_G_A', pValueMantissa=2.4240000247955322, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00682879, standardError=0.00186061, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100137626_G_C', pValueMantissa=4.564000129699707, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.133964, standardError=0.067025, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100139939_C_T', pValueMantissa=2.2850000858306885, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0168361, standardError=0.00739727, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140109_A_G', pValueMantissa=8.161999702453613, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0116036, standardError=0.00201274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140433_T_C', pValueMantissa=8.460000038146973, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00745523, standardError=0.00283129, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140822_C_T', pValueMantissa=4.0370001792907715, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00653853, standardError=0.00184827, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100140993_C_T', pValueMantissa=8.553999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00744479, standardError=0.00283137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100141769_G_C', pValueMantissa=4.497000217437744, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.134653, standardError=0.0671606, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142018_C_T', pValueMantissa=8.651000022888184, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00615783, standardError=0.00184859, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100142970_A_T', pValueMantissa=3.749000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0279115, standardError=0.00962947, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143128_C_A', pValueMantissa=2.7290000915527344, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0151084, standardError=0.0050416, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143200_T_G', pValueMantissa=8.8100004196167, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751992, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143201_T_C', pValueMantissa=8.812999725341797, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00751979, standardError=0.00191775, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143322_A_G', pValueMantissa=8.62600040435791, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0074353, standardError=0.00283084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143412_T_C', pValueMantissa=3.306999921798706, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0244099, standardError=0.00588015, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100143655_T_C', pValueMantissa=5.8420000076293945, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0063633, standardError=0.00185041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144149_T_G', pValueMantissa=5.2210001945495605, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106098, standardError=0.00194903, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144392_A_ACGTG', pValueMantissa=1.059999942779541, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0122106, standardError=0.00200172, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144587_G_A', pValueMantissa=4.710000038146973, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0106442, standardError=0.00194881, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100144738_C_T', pValueMantissa=3.628999948501587, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00387717, standardError=0.00185181, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145180_CA_C', pValueMantissa=7.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00754349, standardError=0.00283104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145446_T_C', pValueMantissa=4.289000034332275, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00722839, standardError=0.0025309, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145462_G_A', pValueMantissa=1.184999942779541, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00704211, standardError=0.00279842, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145533_C_T', pValueMantissa=6.809999942779541, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0688508, standardError=0.0254439, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100145864_T_C', pValueMantissa=2.5959999561309814, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00556169, standardError=0.00184654, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100146576_G_A', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102862, standardError=0.0027873, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100147206_C_G', pValueMantissa=2.24399995803833, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102847, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148436_A_G', pValueMantissa=7.232999801635742, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01072, standardError=0.00317104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100148745_A_G', pValueMantissa=9.111000061035156, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011124, standardError=0.00335401, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100150256_TG_T', pValueMantissa=1.621000051498413, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0058237, standardError=0.00184761, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151385_A_G', pValueMantissa=2.200000047683716, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102977, standardError=0.002787, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151760_T_G', pValueMantissa=1.680999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116223, standardError=0.00369954, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100151918_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152307_T_C', pValueMantissa=9.949999809265137, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108402, standardError=0.00189131, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100152437_C_T', pValueMantissa=1.0140000581741333, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108394, standardError=0.00189222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100153963_AT_A', pValueMantissa=3.984999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00551895, standardError=0.00191674, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155294_C_T', pValueMantissa=5.695000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0370698, standardError=0.0134074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155300_C_A', pValueMantissa=3.9560000896453857, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.013611, standardError=0.0066127, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155337_G_C', pValueMantissa=9.121999740600586, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0129497, standardError=0.00390489, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155409_G_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100155608_A_G', pValueMantissa=2.359999895095825, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102538, standardError=0.00278865, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157105_C_T', pValueMantissa=1.9290000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114702, standardError=0.00369896, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157116_T_A', pValueMantissa=1.4279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00588326, standardError=0.00184495, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157609_G_A', pValueMantissa=2.1989998817443848, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103034, standardError=0.00278846, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100157763_C_T', pValueMantissa=3.859999895095825, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00711467, standardError=0.00343966, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158037_G_A', pValueMantissa=4.420000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0259169, standardError=0.00910471, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158360_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100158691_C_T', pValueMantissa=6.251999855041504, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0131114, standardError=0.00327532, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159080_T_C', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159144_G_A', pValueMantissa=1.3380000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00857697, standardError=0.00346768, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159600_GAAATCAACAATAA_G', pValueMantissa=1.7860000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115575, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100159706_T_TTTAAA', pValueMantissa=2.239000082015991, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102922, standardError=0.00278886, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161011_T_C', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100161641_G_T', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01191, standardError=0.00370485, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162586_C_T', pValueMantissa=1.5570000410079956, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117095, standardError=0.00370097, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100162599_A_G', pValueMantissa=1.7910000085830688, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115545, standardError=0.0037, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164449_A_T', pValueMantissa=8.289999961853027, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0343476, standardError=0.0102747, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164555_T_C', pValueMantissa=1.8140000104904175, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162269, standardError=0.00686797, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100164661_T_C', pValueMantissa=1.065000057220459, pValueExponent=-8, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0108199, standardError=0.00189161, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100166335_G_A', pValueMantissa=1.569000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370099, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167234_TA_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114517, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167290_A_G', pValueMantissa=1.9539999961853027, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114514, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167685_C_T', pValueMantissa=3.9630000591278076, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0526946, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100167711_G_A', pValueMantissa=1.3270000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011893, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100168884_G_A', pValueMantissa=1.815000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.01154, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100169073_T_A', pValueMantissa=1.659000039100647, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0164986, standardError=0.00688708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170367_T_A', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115361, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170447_T_C', pValueMantissa=1.8200000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011537, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170652_A_G', pValueMantissa=8.133000373840332, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0162704, standardError=0.00614785, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100170743_T_C', pValueMantissa=1.819000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115379, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171278_T_G', pValueMantissa=1.965999960899353, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114445, standardError=0.00369739, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171408_C_CTATT', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115357, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171892_C_A', pValueMantissa=4.783999919891357, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0290312, standardError=0.0146713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100171937_A_T', pValueMantissa=3.7090001106262207, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264529, standardError=0.0126887, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172580_C_A', pValueMantissa=1.8209999799728394, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115368, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100172766_C_T', pValueMantissa=1.3320000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118891, standardError=0.00370488, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173406_G_C', pValueMantissa=3.993000030517578, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0276948, standardError=0.00962055, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100173454_A_G', pValueMantissa=1.8220000267028809, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011536, standardError=0.00370004, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174322_A_AT', pValueMantissa=1.9670000076293945, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114438, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100174478_C_T', pValueMantissa=5.164999961853027, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114058, standardError=0.00195247, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175179_A_G', pValueMantissa=1.968000054359436, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114433, standardError=0.00369738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175211_T_C', pValueMantissa=9.72700023651123, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0910994, standardError=0.02762, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175305_C_T', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100175350_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011535, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100176550_CAAAAGACCGTTTTTA_C', pValueMantissa=1.8869999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115298, standardError=0.00371041, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177021_C_G', pValueMantissa=1.8309999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115307, standardError=0.00370003, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177437_T_C', pValueMantissa=4.168000221252441, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00536168, standardError=0.00187135, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100177850_C_T', pValueMantissa=7.14300012588501, pValueExponent=-5, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0216516, standardError=0.00545178, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178264_G_A', pValueMantissa=1.8339999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011529, standardError=0.00370002, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178377_T_A', pValueMantissa=3.9769999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277079, standardError=0.00962096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178824_A_C', pValueMantissa=1.1480000019073486, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0273359, standardError=0.0108138, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178873_G_C', pValueMantissa=3.313999891281128, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00845972, standardError=0.00288043, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100178957_A_G', pValueMantissa=1.8370000123977661, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011527, standardError=0.00370001, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100181244_T_A', pValueMantissa=9.291000366210938, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116765, standardError=0.00352639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182158_GT_G', pValueMantissa=1.440999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118051, standardError=0.00370502, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182496_T_C', pValueMantissa=2.2899999618530273, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102733, standardError=0.00278807, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100182799_A_G', pValueMantissa=2.365000009536743, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0102471, standardError=0.00278728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183196_T_C', pValueMantissa=1.8519999980926514, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011518, standardError=0.00369996, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183255_G_A', pValueMantissa=1.3580000400543213, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118679, standardError=0.0037048, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100183966_G_A', pValueMantissa=1.8609999418258667, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0115126, standardError=0.00369993, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184256_T_C', pValueMantissa=4.7220001220703125, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.029124, standardError=0.0146772, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184474_G_A', pValueMantissa=3.7109999656677246, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00543283, standardError=0.00187227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100184568_G_A', pValueMantissa=2.1500000953674316, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0103173, standardError=0.00278792, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186257_C_G', pValueMantissa=1.2259999513626099, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00596993, standardError=0.00184663, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100186688_C_T', pValueMantissa=1.9229999780654907, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114751, standardError=0.00369939, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100187980_C_T', pValueMantissa=4.630000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813035, standardError=0.00287118, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100189674_T_G', pValueMantissa=9.279999732971191, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.126539, standardError=0.0486397, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190351_G_A', pValueMantissa=4.619999885559082, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00813223, standardError=0.00287113, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100190395_G_A', pValueMantissa=2.0, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0760922, standardError=0.024623, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100192759_T_C', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114555, standardError=0.00369915, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193524_C_T', pValueMantissa=9.555000305175781, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122529, standardError=0.0037093, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100193948_A_C', pValueMantissa=3.0179998874664307, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115477, standardError=0.00194714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195245_A_T', pValueMantissa=4.635000228881836, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0081285, standardError=0.00287091, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195684_C_CA', pValueMantissa=4.2270002365112305, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.137066, standardError=0.0674911, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100195855_G_A', pValueMantissa=4.870999813079834, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00807719, standardError=0.00286889, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197192_T_C', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136954, standardError=0.067486, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197458_C_A', pValueMantissa=4.629000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00812979, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197612_C_G', pValueMantissa=4.498000144958496, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815595, standardError=0.00287088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197640_T_C', pValueMantissa=1.965000033378601, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114501, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197675_G_A', pValueMantissa=2.75600004196167, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0386379, standardError=0.0175348, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100197920_A_G', pValueMantissa=2.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0167093, standardError=0.00739523, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100198475_T_C', pValueMantissa=1.9639999866485596, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114509, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199282_C_G', pValueMantissa=1.1059999465942383, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127328, standardError=0.00390313, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100199476_G_A', pValueMantissa=1.319000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118973, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100200167_G_A', pValueMantissa=3.1589999198913574, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0376207, standardError=0.012745, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201209_C_T', pValueMantissa=1.097000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00602792, standardError=0.0018465, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201414_G_A', pValueMantissa=4.788000106811523, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0068162, standardError=0.00344526, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100201633_T_A', pValueMantissa=1.3179999589920044, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0118983, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202455_T_C', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202467_G_A', pValueMantissa=3.875999927520752, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277856, standardError=0.00962082, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100202772_A_T', pValueMantissa=1.9600000381469727, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114531, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203494_T_C', pValueMantissa=1.9589999914169312, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114534, standardError=0.00369901, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203542_G_T', pValueMantissa=1.6130000352859497, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697446, standardError=0.00184854, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100203788_C_A', pValueMantissa=4.110000133514404, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.113144, standardError=0.0394286, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100204779_C_A', pValueMantissa=4.3379998207092285, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0101425, standardError=0.00502088, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100205801_A_G', pValueMantissa=4.5329999923706055, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814881, standardError=0.00287085, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206194_A_T', pValueMantissa=1.9570000171661377, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114546, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206333_A_G', pValueMantissa=4.160999774932861, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0263098, standardError=0.0129133, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206660_A_G', pValueMantissa=2.4539999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.113651, standardError=0.0505422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100206733_C_T', pValueMantissa=1.315999984741211, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119003, standardError=0.00370432, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207009_TA_T', pValueMantissa=1.9559999704360962, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114549, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207455_C_G', pValueMantissa=1.305999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593547, standardError=0.00184639, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207653_G_A', pValueMantissa=3.6470000743865967, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114874, standardError=0.00194719, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100207898_CAAGTT_C', pValueMantissa=3.384999990463257, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921644, standardError=0.0434369, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100208164_G_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277875, standardError=0.0096208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100209200_T_C', pValueMantissa=1.315000057220459, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119009, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100210277_C_T', pValueMantissa=1.3040000200271606, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119097, standardError=0.00370434, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211064_G_A', pValueMantissa=1.9550000429153442, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114558, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100211240_A_G', pValueMantissa=7.230000019073486, pValueExponent=-7, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00932586, standardError=0.00188208, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212531_T_C', pValueMantissa=3.874000072479248, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0277872, standardError=0.00962078, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100212621_T_C', pValueMantissa=1.6109999418258667, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697491, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213072_C_T', pValueMantissa=1.9529999494552612, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114567, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213340_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697479, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100213631_T_C', pValueMantissa=1.6119999885559082, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00697476, standardError=0.00184851, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100214977_G_T', pValueMantissa=4.242000102996826, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136966, standardError=0.0674913, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215512_G_A', pValueMantissa=4.473999977111816, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00816059, standardError=0.0028708, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215525_C_CA', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0114578, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215535_T_A', pValueMantissa=9.406000137329102, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122847, standardError=0.00371395, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100215669_A_G', pValueMantissa=1.9509999752044678, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011458, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216129_G_T', pValueMantissa=1.312000036239624, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119034, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100216744_G_C', pValueMantissa=2.9519999027252197, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115543, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100217073_T_TCATA', pValueMantissa=4.507999897003174, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815394, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218126_C_T', pValueMantissa=1.055999994277954, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604851, standardError=0.00184672, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218867_A_G', pValueMantissa=3.3550000190734863, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.205837, standardError=0.0968422, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100218929_A_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219439_G_A', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219496_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219653_G_A', pValueMantissa=8.52400016784668, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0210222, standardError=0.00799145, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100219661_T_C', pValueMantissa=7.915999889373779, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0163115, standardError=0.00614227, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220164_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220814_T_TA', pValueMantissa=4.504000186920166, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815468, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100220831_C_A', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221396_C_T', pValueMantissa=2.944000005722046, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115551, standardError=0.00194705, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221486_T_G', pValueMantissa=1.3890000581741333, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0160699, standardError=0.00653242, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221517_C_A', pValueMantissa=2.5439999103546143, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00413576, standardError=0.00185074, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100221594_C_G', pValueMantissa=2.0799999237060547, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0779801, standardError=0.0337333, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223656_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100223788_T_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224059_G_A', pValueMantissa=3.621000051498413, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114895, standardError=0.00194717, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACT', pValueMantissa=1.0759999752044678, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00473991, standardError=0.00185855, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224086_A_ACTCTCTCT', pValueMantissa=9.140999794006348, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0123865, standardError=0.00373569, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224729_G_A', pValueMantissa=9.512999534606934, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122608, standardError=0.00371028, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224788_C_T', pValueMantissa=4.552000045776367, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00814496, standardError=0.00287083, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100224846_CA_C', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225330_C_T', pValueMantissa=4.679999828338623, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00811972, standardError=0.0028709, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100225460_G_A', pValueMantissa=1.4520000219345093, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0138989, standardError=0.00568655, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227298_T_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227436_A_C', pValueMantissa=2.1089999675750732, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0204774, standardError=0.00887858, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100227710_T_C', pValueMantissa=2.624000072479248, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115932, standardError=0.00194728, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228161_T_C', pValueMantissa=1.1180000305175781, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0127208, standardError=0.00390316, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228188_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228581_G_GGGA', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100228620_A_G', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229692_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100229731_G_C', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230118_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100230958_C_A', pValueMantissa=3.694000005722046, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0264656, standardError=0.0126847, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231193_T_TTTG', pValueMantissa=2.11299991607666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0113217, standardError=0.00368321, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231368_T_A', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231561_G_GT', pValueMantissa=4.546000003814697, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815129, standardError=0.00287266, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100231791_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100233804_CAG_C', pValueMantissa=3.674999952316284, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0114848, standardError=0.00194718, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100235720_T_G', pValueMantissa=4.255000114440918, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0683751, standardError=0.0337137, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236254_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236529_C_T', pValueMantissa=1.5670000314712524, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698791, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236538_A_G', pValueMantissa=1.5640000104904175, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00698861, standardError=0.00184852, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100236603_C_T', pValueMantissa=3.1489999294281006, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115356, standardError=0.00194738, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237030_C_T', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237733_G_A', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237772_G_A', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100237893_A_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238295_A_G', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238581_A_G', pValueMantissa=6.859000205993652, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0255013, standardError=0.00751108, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100238657_T_C', pValueMantissa=2.809000015258789, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.01157, standardError=0.00194702, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239610_G_T', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239637_A_G', pValueMantissa=1.1369999647140503, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600877, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239850_T_C', pValueMantissa=1.9490000009536743, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011459, standardError=0.003699, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100239989_G_A', pValueMantissa=3.2009999752044678, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011529, standardError=0.00194715, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240726_T_G', pValueMantissa=4.000999927520752, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0525952, standardError=0.0256104, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100240944_C_T', pValueMantissa=2.8889999389648438, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0115616, standardError=0.00194713, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242014_C_T', pValueMantissa=4.505000114440918, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00815457, standardError=0.00287084, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242478_A_G', pValueMantissa=9.51200008392334, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0122572, standardError=0.00370917, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242630_C_T', pValueMantissa=1.253999948501587, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011921, standardError=0.00369498, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100242920_TGA_T', pValueMantissa=4.275000095367432, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.136751, standardError=0.0674941, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100243390_G_A', pValueMantissa=8.79800033569336, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0252612, standardError=0.00439142, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244149_G_C', pValueMantissa=3.316999912261963, pValueExponent=-9, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.011525, standardError=0.0019484, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244398_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244540_A_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244650_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244773_C_G', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100244991_G_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245546_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100245863_C_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246645_C_T', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834099, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246672_T_C', pValueMantissa=1.1399999856948853, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00600727, standardError=0.00184638, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100246924_C_T', pValueMantissa=3.4030001163482666, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0281666, standardError=0.00961714, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100247616_T_C', pValueMantissa=3.694000005722046, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834089, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248412_C_G', pValueMantissa=1.4470000267028809, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00702484, standardError=0.00184863, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100248726_A_G', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249239_A_C', pValueMantissa=2.0339999198913574, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0353474, standardError=0.0152353, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249267_A_T', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249476_T_TC', pValueMantissa=3.694999933242798, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00834082, standardError=0.00287304, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100249705_T_C', pValueMantissa=1.472000002861023, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0117796, standardError=0.00370405, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250941_T_C', pValueMantissa=1.8240000009536743, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.621107, standardError=0.263096, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100250976_T_A', pValueMantissa=6.709000110626221, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0690304, standardError=0.0254633, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251390_T_A', pValueMantissa=2.9049999713897705, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0055723, standardError=0.00187139, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251454_A_G', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00712036, standardError=0.00184919, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100251790_C_T', pValueMantissa=3.497999906539917, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00593413, standardError=0.00281426, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252662_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252768_G_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100252920_T_G', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254207_CCAGA_C', pValueMantissa=3.382999897003174, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0921782, standardError=0.0434383, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254700_T_C', pValueMantissa=1.3079999685287476, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.0884636, standardError=0.0275222, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100254749_C_A', pValueMantissa=3.940999984741211, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00710422, standardError=0.00344885, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255058_C_G', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100255162_C_T', pValueMantissa=3.9679999351501465, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00827516, standardError=0.00287265, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256000_C_A', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256287_C_T', pValueMantissa=4.053999900817871, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00825485, standardError=0.00287235, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100256511_G_A', pValueMantissa=1.0700000524520874, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00604016, standardError=0.00184634, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100257612_C_T', pValueMantissa=1.9170000553131104, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082026, standardError=0.00350204, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258083_A_G', pValueMantissa=2.7039999961853027, pValueExponent=-2, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0635849, standardError=0.0287601, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258094_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100258332_C_T', pValueMantissa=3.9760000705718994, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082729, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260000_A_G', pValueMantissa=1.6239999532699585, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0116706, standardError=0.00370306, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260586_A_G', pValueMantissa=3.8919999599456787, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.00829222, standardError=0.00287251, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100260869_C_T', pValueMantissa=4.205999851226807, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0082302, standardError=0.00287541, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100262992_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263055_G_C', pValueMantissa=1.3109999895095825, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.0119039, standardError=0.00370431, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263140_C_T', pValueMantissa=1.5770000219345093, pValueExponent=-3, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=0.011701, standardError=0.00370274, betaConditioned=None, standardErrorConditioned=None, r2Overall=None), Row(is95CredibleSet=None, is99CredibleSet=None, logABF=None, posteriorProbability=None, variantId='10_100263249_C_T', pValueMantissa=1.1790000200271606, pValueExponent=-4, pValueMantissaConditioned=None, pValueExponentConditioned=None, beta=-0.00711917, standardError=0.00184892, betaConditioned=None, standardErrorConditioned=None, r2Overall=None)], size=1001)]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" } + ], + "source": [ + "window_based_clumped_output = \"gs://ot-team/dsuveges/finngen/2023.10.13_window_clumped_w_locus\"\n", + "\n", + "(\n", + " session.spark.read.parquet(ld_clumped_output)\n", + " .filter(f.size(f.col(\"qualityControls\")) == 0)\n", + "# .show(1, False, True)\n", + " .select(\"locus\", f.size(f.col(\"locus\")).alias(\"size\"))\n", + " .limit(1)\n", + " .collect()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e242acdd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "gist": { + "data": { + "description": "GCS/dsuveges/PICS/2023.10.06 - PICS FINNGEN from top to bottom.ipynb", + "public": false + }, + "id": "" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 5 + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/notebooks/Mapping_EFO_finngen.ipynb b/notebooks/Mapping_EFO_finngen.ipynb new file mode 100644 index 000000000..1feaf890c --- /dev/null +++ b/notebooks/Mapping_EFO_finngen.ipynb @@ -0,0 +1,761 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mapping EFOs for the FinnGen study index using old study index from the previos prod" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook adds EFOs from previos prod version of study_index to the new FinnGen study_index using trait name as a matching key.\n", + "\n", + "The rsulting study index has 1542 rows with not null EFOs (out of 2408 rows).\n", + "\n", + "The new study index is saved here:\n", + "\"gs://genetics-portal-dev-analysis/yt4/study_index_finngen_with_efo\"" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your browser has been opened to visit:\n", + "\n", + " https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8085%2F&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fsqlservice.login+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&state=XHb8Uk43SsVjvFRqwgrX4Tgg2tTOHS&access_type=offline&code_challenge=OkiqDAkHXDGEgJQbX8r0ZYKfZ7gcgfXS8mfZc5a913Y&code_challenge_method=S256\n", + "\n", + "\n", + "Credentials saved to file: [/Users/yt4/.config/gcloud/application_default_credentials.json]\n", + "\n", + "These credentials will be used by any library that requests Application Default Credentials (ADC).\n", + "\n", + "Quota project \"open-targets-genetics-dev\" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.\n" + ] + } + ], + "source": [ + "!gcloud auth application-default login" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"c92e22c1-acc6-4a9b-8a5a-529fec6e60ae\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"c92e22c1-acc6-4a9b-8a5a-529fec6e60ae\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/04/14 16:03:28 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "pip-installed Hail requires additional configuration options in Spark referring\n", + " to the path to the Hail Python module directory HAIL_DIR,\n", + " e.g. /path/to/python/site-packages/hail:\n", + " spark.jars=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.driver.extraClassPath=HAIL_DIR/backend/hail-all-spark.jar\n", + " spark.executor.extraClassPath=./hail-all-spark.jarRunning on Apache Spark version 3.3.4\n", + "SparkUI available at http://192.168.0.232:4040\n", + "Welcome to\n", + " __ __ <>__\n", + " / /_/ /__ __/ /\n", + " / __ / _ `/ / /\n", + " /_/ /_/\\_,_/_/_/ version 0.2.127-bb535cd096c5\n", + "LOGGING: writing to /dev/null\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "import hail as hl\n", + "import pandas as pd\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "\n", + "pd.set_option(\"display.max_colwidth\", None)\n", + "pd.set_option(\"display.expand_frame_repr\", False)\n", + "\n", + "hail_dir = os.path.dirname(hl.__file__)\n", + "session = Session(hail_home=hail_dir, start_hail=True, extended_spark_conf={\"spark.driver.memory\": \"12g\",\n", + " \"spark.kryoserializer.buffer.max\": \"500m\",\"spark.driver.maxResultSize\":\"3g\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "path_si=\"gs://genetics_etl_python_playground/releases/24.03/study_index/finngen/study_index\"\n", + "path_si_old=\"gs://genetics-portal-dev-analysis/yt4/study_index.csv\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "si_old=session.spark.read.csv(path_si_old, header=True,sep=\"\\t\")\n", + "si_new=StudyIndex.from_parquet(session=session, path=path_si)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-------------------+--------------------+-------+---------+-------------+----+----------+----------+-----------+---------+------------+--------------+-------+--------------------+-----------------+--------------------+\n", + "| study_id| ancestry_initial|ancestry_replication|n_cases|n_initial|n_replication|pmid|pub_author| pub_date|pub_journal|pub_title|has_sumstats|num_assoc_loci| source| trait_reported| trait_efos| trait_category|\n", + "+--------------------+-------------------+--------------------+-------+---------+-------------+----+----------+----------+-----------+---------+------------+--------------+-------+--------------------+-----------------+--------------------+\n", + "|FINNGEN_R6_M13_MU...|['European=253458']| []| 108.0| 253458| 0.0|null|FINNGEN_R6|2022-01-24| null| null| True| 0|FINNGEN|Multifocal fibros...|['MONDO_0009230']|immune system dis...|\n", + "|FINNGEN_R6_M13_MU...|['European=199528']| []| 1804.0| 199528| 0.0|null|FINNGEN_R6|2022-01-24| null| null| True| 0|FINNGEN|Disorders of muscles| ['EFO_0002970']|musculoskeletal o...|\n", + "|FINNGEN_R6_M13_MU...|['European=197821']| []| 97.0| 197821| 0.0|null|FINNGEN_R6|2022-01-24| null| null| True| 0|FINNGEN|\"\"\"Muscle wasting...| ['EFO_0009851']| biological process|\n", + "|FINNGEN_R6_M13_MU...|['European=198253']| []| 529.0| 198253| 0.0|null|FINNGEN_R6|2022-01-24| null| null| True| 0|FINNGEN|Other specified d...| ['EFO_0002970']|musculoskeletal o...|\n", + "|FINNGEN_R6_M13_MU...|['European=198179']| []| 455.0| 198179| 0.0|null|FINNGEN_R6|2022-01-24| null| null| True| 1|FINNGEN| Muscle strain| ['EFO_0010686']|injury, poisoning...|\n", + "+--------------------+-------------------+--------------------+-------+---------+-------------+----+----------+----------+-----------+---------+------------+--------------+-------+--------------------+-----------------+--------------------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "si_old.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "| studyId| projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId|publicationTitle|publicationFirstAuthor|publicationDate|publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples|replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Actinomycosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 101| 363227| 363328|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Amoebiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 160| 367214| 367374|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Anogenital herpes...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1986| 400197| 402183|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Aspergillosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 211| 403213| 403424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Atypical virus in...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 282| 409849| 410131|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "si_new_df=si_new.df\n", + "si_new_df.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "57246\n", + "2408\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------------+\n", + "| trait_reported| trait_efos|\n", + "+--------------------+-----------------+\n", + "|Multifocal fibros...|['MONDO_0009230']|\n", + "|Disorders of muscles| ['EFO_0002970']|\n", + "|\"\"\"Muscle wasting...| ['EFO_0009851']|\n", + "|Other specified d...| ['EFO_0002970']|\n", + "| Muscle strain| ['EFO_0010686']|\n", + "+--------------------+-----------------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], + "source": [ + "si_old=si_old.select(\"trait_reported\",\"trait_efos\")\n", + "si_old.show(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.functions import lower\n", + "\n", + "si_old = si_old.withColumn(\"trait_reported_low\", lower(si_old[\"trait_reported\"])).select(\"trait_reported_low\",\"trait_efos\")\n", + "si_new_df= si_new_df.withColumn(\"trait_reported_low\", lower(si_new_df[\"traitFromSource\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "2408" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "si_old = si_old.dropDuplicates([\"trait_reported_low\"])\n", + "joined_df = si_new_df.join(si_old, \"trait_reported_low\", how=\"left\")\n", + "joined_df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+--------------------+\n", + "| trait_reported_low| studyId| projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId|publicationTitle|publicationFirstAuthor|publicationDate|publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples|replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats| trait_efos|\n", + "+--------------------+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+--------------------+\n", + "| actinomycosis|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Actinomycosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 101| 363227| 363328|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| null|\n", + "| amoebiasis|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Amoebiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 160| 367214| 367374|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0007144']|\n", + "|anogenital herpes...|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Anogenital herpes...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1986| 400197| 402183|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0007282']|\n", + "| aspergillosis|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Aspergillosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 211| 403213| 403424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0007157']|\n", + "|atypical virus in...|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Atypical virus in...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 282| 409849| 410131|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['MONDO_0024318']|\n", + "|bacterial infecti...|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial infecti...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 20226| 363227| 383453|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| null|\n", + "|bacterial, viral ...|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial, viral ...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2852| 409329| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| null|\n", + "|other bacterial i...|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Other bacterial i...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 6145| 367214| 373359|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0000771']|\n", + "| candidiasis|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Candidiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 4306| 403213| 407519|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['MONDO_0002026']|\n", + "|other sexually tr...|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas|Other sexually tr...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2186| 400197| 402383|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|['MONDO_0021681',...|\n", + "| cholera|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Cholera| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1385| 367214| 368599|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_1001235']|\n", + "|dengue fever [cla...|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas|Dengue fever [cla...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 53| 409137| 409190|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| null|\n", + "| dermatophytosis|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas| Dermatophytosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 3921| 403213| 407134|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['MONDO_0004678']|\n", + "| early syphilis|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Early syphilis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 308| 400197| 400505|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0007504']|\n", + "|infectious mononu...| FINNGEN_R10_AB1_EBV|FINNGEN_R10| gwas|Infectious mononu...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2979| 400974| 403953|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_0007326']|\n", + "| enterobiasis|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Enterobiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 112| 411658| 411770|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| null|\n", + "| erysipelas|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Erysipelas| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 22261| 363227| 385488|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['EFO_1001462']|\n", + "|diarrhoea and gas...|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Diarrhoea and gas...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 32210| 367214| 399424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['MONDO_0045031']|\n", + "|gonococcal infection|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Gonococcal infection| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 954| 400197| 401151|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true| ['DOID_7551']|\n", + "| helminthiases|FINNGEN_R10_AB1_H...|FINNGEN_R10| gwas| Helminthiases| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 523| 411658| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|['EFO_0007245', '...|\n", + "+--------------------+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+--------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "joined_df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1542\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 22:===========================================> (3 + 1) / 4]\r" + ] + } + ], + "source": [ + "num_non_null_rows = joined_df.filter(joined_df.trait_efos.isNotNull()).count()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------+---------+---------+--------------------+------------------------+------+------------------+--------+--------------------+----------------------+---------------+--------------------+----------------------------------+--------------------+------+---------+--------+--------------------+---------------------+--------------------+--------------------+---------------+-------------+--------------------+-----------+\n", + "| studyId|projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId| publicationTitle|publicationFirstAuthor|publicationDate| publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples| replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats|\n", + "+------------+---------+---------+--------------------+------------------------+------+------------------+--------+--------------------+----------------------+---------------+--------------------+----------------------------------+--------------------+------+---------+--------+--------------------+---------------------+--------------------+--------------------+---------------+-------------+--------------------+-----------+\n", + "| GCST000102| GCST| gwas|Endothelial funct...| [EFO_0004298]| null| null|17903301|Genome-wide assoc...| Vasan RS| 2007-09-19| BMC Med Genet| null|Up to 1,238 Europ...| 0| 0| 1238| [null]| [{nfe, 1.0}]| [{1238, European}]| []| null| null| null| false|\n", + "| GCST000272| GCST| gwas| Height| [EFO_0004339]| null| null|19030899|Genome-wide assoc...| Lei SF| 2008-11-23| Hum Genet| null|618 Chinese ances...| 0| 0| 618| [null]| [{eas, 1.0}]| [{618, East Asian}]|[{2953, East Asian}]| null| null| null| false|\n", + "| GCST000436| GCST| gwas|Acenocoumarol mai...| [GO_0061476]| null| null|19578179|A genome-wide ass...| Teichert M| 2009-07-04| Hum Mol Genet| null|1,451 European an...| 0| 0| 1451| [null]| [{nfe, 1.0}]| [{1451, European}]| [{287, NR}]| null| null| null| false|\n", + "| GCST000514| GCST| gwas|Response to antip...| [GO_0097332]| null| null|19875103|Genomewide associ...| Aberg K| 2009-10-27| Biol Psychiatry| null|421 European ance...| 738| 0| 738| [null]| [{afr, 0.28997289...|[{214, African Am...| []| null| null| null| false|\n", + "| GCST000550| GCST| gwas| Metabolite levels| [EFO_0004725]| null| null|20037589|A genome-wide per...| Illig T| 2009-12-27| Nat Genet| null|1,029 European an...| 0| 0| 1029| [null]| [{nfe, 1.0}]| [{1029, European}]| [{1202, European}]| null| null| null| false|\n", + "| GCST000708| GCST| gwas| Freckling| [EFO_0003963]| null| null|20585627|Web-based, partic...| Eriksson N| 2010-06-24| PLoS Genet| null|9,126 European an...| 0| 0| 9126| [null]| [{nfe, 1.0}]| [{9126, European}]| []| null| null| null| false|\n", + "| GCST000754| GCST| gwas|Personality dimen...| [EFO_0004365]| null| null|20691247|A genome-wide ass...| Verweij KJ| 2010-08-04| Biol Psychol| null|5,117 European an...| 0| 0| 5117| [null]| [{nfe, 1.0}]| [{5117, European}]| []| null| null| null| false|\n", + "| GCST000880| GCST| gwas|Menarche (age at ...| [EFO_0004703]| null| null|21102462|Thirty new loci f...| Elks CE| 2010-11-21| Nat Genet| null|86,142 European a...| 0| 0| 87802| [null]| [{nfe, 1.0}]| [{87802, European}]| [{14731, European}]| null| null| null| false|\n", + "| GCST001031| GCST| gwas|Large B-cell lymp...| [EFO_0000403]| null| null|21471979|Common variants o...| Kumar V| 2011-04-07| J Hum Genet| null|74 Japanese ances...| 74| 934| 1008| [null]| [{eas, 1.0}]|[{1008, East Asian}]|[{3634, East Asian}]| null| null| null| false|\n", + "| GCST001032| GCST| gwas|Caffeine consumption| [EFO_0004330]| null| null|21490707|Genome-wide meta-...| Cornelis MC| 2011-04-07| PLoS Genet| null|47,431 European a...| 0| 0| 47431| [null]| [{nfe, 1.0}]| [{47431, European}]| []| null| null| null| false|\n", + "| GCST001059| GCST| gwas| Neutrophil count| [EFO_0004833]| null| null|21507922|Duffy-null-associ...| Ramsuran V| 2011-05-01| Clin Infect Dis| null|115 African ances...| 0| 0| 115| [null]| [{afr, 1.0}]|[{115, Sub-Sahara...| []| null| null| null| false|\n", + "| GCST002187| GCST| gwas|Systolic blood pr...| [EFO_0006335]| null| null|24058526|Genome-wide meta-...| Bhatnagar P| 2013-09-13| PLoS One| [MONDO_0011382]|1617 African Amer...| 1617| 0| 1617| [null]| [{afr, 1.0}]|[{1617, African A...| []| null| null| null| false|\n", + "| GCST002623| GCST| gwas| L-arginine levels| [EFO_0006524]| null| null|25245031|Genome-wide assoc...| Luneburg N| 2014-09-21|Circ Cardiovasc G...| null|3,747 European an...| 0| 0| 6739| [null]| [{nfe, 1.0}]|[{3747, European}...| [{1159, European}]| null| null| null| false|\n", + "| GCST003261| GCST| gwas|Ischemic stroke (...| [HP_0002140]| null| null|26708676|Loci associated w...| Pulit SL| 2015-12-18| Lancet Neurol| null|up to 8,062 Europ...| 9510| 32473| 41983| [null]| [{amr, 0.06647928...|[{2791, Hispanic ...|[{256, African Am...| null| null| null| false|\n", + "| GCST003427| GCST| gwas|Alzheimer disease...| [EFO_0004847, MON...| null| null|26830138|Family-based asso...| Herold C| 2016-02-02| Mol Psychiatry| null|2,478 European an...| 2478| 979| 3457| [null]| [{nfe, 1.0}]| [{3524, European}]| []| null| null| null| false|\n", + "| GCST003665| GCST| gwas|Free cholesterol ...| [EFO_0004611, EFO...| null| null|27005778|Genome-wide study...| Kettunen J| 2016-03-23| Nat Commun| null|21,555 European a...| 0| 0| 21555|[EGCUT, ERF, FTC,...| [{nfe, 1.0}]| [{21555, European}]| []| null| null| null| false|\n", + "| GCST003773| GCST| gwas|Loneliness (multi...| [EFO_0007865]| null| null|27629369|Genome-Wide Assoc...| Gao J| 2016-09-15|Neuropsychopharma...| null|8,490 European an...| 0| 0| 10760| [null]| [{nfe, 0.80529739...|[{8490, European}...| []| null| null| null| false|\n", + "| GCST003791| GCST| gwas|Response to metfo...| [EFO_0006952, GO_...| null| null|28173075|Metformin pharmac...| Niu N| 2016-09-11| Hum Mol Genet| null|up to 96 African ...| 0| 0| 288| [null]| [{afr, 0.33333333...|[{96, African Ame...| []| null| null| null| false|\n", + "| GCST003824| GCST| gwas|Depression in res...| [EFO_0007006, EFO...| null| null|27723809|Genome-Wide Assoc...| Matsunami K| 2016-10-10| PLoS One| [EFO_0004220]|45 Japanese ances...| 45| 179| 224| [null]| [{eas, 1.0}]| [{224, East Asian}]| [{160, East Asian}]| null| null| null| false|\n", + "| GCST003837| GCST| gwas| Chronotype| [EFO_0004354]| null| null|27494321|Genome-Wide Assoc...| Jones SE| 2016-08-05| PLoS Genet| null|127,898 British i...| 0| 0| 127898| [null]| [{nfe, 1.0}]|[{127898, European}]| [{89283, NR}]| []| []|ftp://ftp.ebi.ac....| true|\n", + "| GCST004678| GCST| gwas|Psychosis pronene...| [EFO_0008337]| null| null|28525603|Genome-Wide Assoc...| Ortega-Alonso A| 2017-05-19| Schizophr Bull| null|3,967 Finnish anc...| 0| 0| 3967| [null]| [{nfe, 1.0}]| [{3967, European}]| []| null| null| null| false|\n", + "| GCST005189| GCST| gwas| Tanning| [EFO_0004279]| null| null|29195075|An Unexpectedly C...| Martin AR| 2017-11-30| Cell| null|216 Sub-Saharan A...| 0| 0| 216| [null]| [{afr, 1.0}]|[{216, Sub-Sahara...|[{240, Sub-Sahara...| null| null| null| false|\n", + "| GCST005437| GCST| gwas|Random C-peptide ...| [EFO_0005187]| null| null|29404672|Meta-genome-wide ...| Roshandel D| 2018-02-05| Diabetologia| [MONDO_0005147]|1,497 European an...| 0| 0| 1497| [null]| [{nfe, 1.0}]| [{1497, European}]| []| null| null| null| false|\n", + "| GCST005503| GCST| gwas|Medium HDL partic...| [EFO_0004612]| null| null|29084231|Common, low-frequ...| Davis JP| 2017-10-30| PLoS Genet| null|8,372 Finnish anc...| 0| 0| 8372| [null]| [{nfe, 1.0}]| [{8372, European}]| []| null| null| null| false|\n", + "| GCST005669| GCST| gwas|Delta-6 desaturas...| [EFO_0007765, EFO...| null| null|29246731|A common variant ...| de Toro-Martin J| 2017-11-02| J Clin Lipidol| null|81 extreme respon...| 0| 0| 141| [null]| [{nfe, 1.0}]| [{141, NR}]| []| null| null| null| false|\n", + "| GCST005749| GCST| gwas|Digit length rati...| [EFO_0004841]| null| null|29659830|Genome-wide assoc...| Warrington NM| 2018-04-12| Hum Mol Genet| null|14,382 European a...| 0| 0| 15661| [null]| [{nfe, 1.0}]|[{14382, European...| []| null| null| null| false|\n", + "| GCST006420| GCST| gwas|Affective disorde...| [EFO_0004247, EFO...| null| null|30116032|Genetics of suici...| Erlangsen A| 2018-08-16| Mol Psychiatry| null|4,302 European an...| 4302| 13294| 17596| [null]| [{nfe, 1.0}]| [{17596, European}]| []| null| null| null| false|\n", + "| GCST006484| GCST| gwas| Type 2 diabetes| [MONDO_0005148]| null| null|30130595|Pilot genome-wide...| Dominguez-Cruz MG| 2018-08-18| Gene| null|45 Maya ancestry ...| 45| 47| 92| [null]| [{amr, 1.0}]|[{92, Native Amer...| []| null| null| null| false|\n", + "| GCST006496| GCST| gwas|Glomerular filtra...| [EFO_0006829, EFO...| null| null|30160337|Genome Wide Assoc...| Asleh R| 2018-08-30| Clin Transplant| null|243 European ance...| 0| 0| 251| [null]| [{nfe, 0.99601593...|[{243, European},...| []| null| null| null| false|\n", + "| GCST006739| GCST| gwas|Proportion of mis...| [EFO_0006923]| null| null|30188897|Detecting past an...| Jeong C| 2018-09-06| PLoS Genet| null|981 Tibetan ances...| 0| 0| 981| [null]| [{nfe, 1.0}]| [{981, NR}]| []| null| null| null| false|\n", + "| GCST006907| GCST| gwas|Ischemic stroke (...| [EFO_0005524]| null| null|29531354|Multiancestry gen...| Malik R| 2018-03-12| Nat Genet| null|4,373 European an...| 4373| 406111| 410484| [null]| [{nfe, 1.0}]|[{150765, European}]| []| []| []|ftp://ftp.ebi.ac....| true|\n", + "| GCST006960| GCST| gwas|Inflammatory bowe...| [EFO_0003767]| null| null|26490195|Inherited determi...| Cleynen I| 2015-10-18| Lancet| null|16,902 European a...| 29838| 0| 29838| [null]| [{nfe, 1.0}]| [{29838, European}]| [{6182, European}]| null| null| null| false|\n", + "| GCST007217| GCST| gwas|RR interval (hear...| [EFO_0004831]| null| null|30679814|Genome-wide assoc...| van Setten J| 2019-01-24| Eur J Hum Genet| null|2,006 Erasmus Ruc...| 0| 0| 28698| [null]| [{nfe, 1.0}]| [{28698, European}]| []| null| null| null| false|\n", + "| GCST008154| GCST| gwas| Trunk fat mass| [EFO_0005409]| null| null|28552196|Whole-Genome Sequ...| Tachmazidou I| 2017-06-01| Am J Hum Genet| null|3,399 whole genom...| 0| 0| 16237| [null]| [{nfe, 1.0}]|[{3538, NR}, {128...| [{10667, European}]| null| null| null| false|\n", + "| GCST008483| GCST| gwas| Ulcerative colitis| [EFO_0000729]| null| null|26398853|Identification of...| Ye BD| 2016-01-01| Inflamm Bowel Dis| null|705 Korean ancest...| 705| 1178| 1883| [null]| [{eas, 1.0}]|[{1883, South Asi...|[{3674, South Asi...| null| null| null| false|\n", + "| GCST008671| GCST| gwas|Phlegm x occupati...| [EFO_0007939, EFO...| null| null|30449631|Genome-wide inter...| Zeng X| 2018-11-15| Environ Int| null|1,702 Dutch ances...| 1702| 6274| 7976| [null]| [{nfe, 1.0}]| [{7976, European}]| [{6789, European}]| null| null| null| false|\n", + "| GCST008675| GCST| gwas|Maximum habitual ...| [EFO_0007878]| null| null|31151762|Genome-wide Assoc...| Gelernter J| 2019-04-08| Biol Psychiatry| null|126,936 European ...| 0| 0| 143965| [null]| [{afr, 0.11828569...|[{17029, African ...| []| null| null| null| false|\n", + "| GCST008775| GCST| gwas|Birth weight or w...| [EFO_0004342, EFO...| null| null|30858448|Genetic overlap b...| Tekola-Ayele F| 2019-03-11| Sci Rep| null|153,781 European ...| 0| 0| 378240| [null]| [{nfe, 1.0}]|[{246502, Europea...| []| null| null| null| false|\n", + "| GCST008870| GCST| gwas|Keratinocyte canc...| [EFO_0010176]| null| null|31174203|Combined analysis...| Liyanage UE| 2019-06-07| Hum Mol Genet| null|at least 18,538 E...| 18538| 340302| 358840| [null]| [{nfe, 1.0}]|[{358840, European}]| []| null| null| null| false|\n", + "| GCST009173| GCST| gwas|Response to (pegy...| [EFO_0007859]| null| null|30715261|Genome Wide Assoc...| Brouwer WP| 2019-02-02| Clin Infect Dis| [EFO_0004239]|121 Asian, Europe...| 0| 0| 509| [null]| [{nfe, 0.5}, {afr...|[{127, European},...| []| null| null| null| false|\n", + "| GCST009364| GCST| gwas|Triglyceride leve...| [EFO_0004530, EFO...| null| null|31719535|Multi-ancestry sl...| Noordam R| 2019-11-12| Nat Commun| null|at least 2,926 Af...| 0| 49886| 61990| [null]| [{eas, 0.03837715...|[{2096, East Asia...|[{12579, Hispanic...| null| null| null| false|\n", + "| GCST009391| GCST| gwas|Metabolite levels...| [EFO_0005132]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_2| GCST| gwas| Metabolite levels| []| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_3| GCST| gwas| Metabolite levels| [EFO_0004468, EFO...| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_4| GCST| gwas| Metabolite levels| [EFO_0004518]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_5| GCST| gwas| Metabolite levels| [EFO_0004761]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_6| GCST| gwas| Metabolite levels| [EFO_0004846]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_7| GCST| gwas| Metabolite levels| [EFO_0005001]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_8| GCST| gwas| Metabolite levels| [EFO_0005002]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "|GCST009391_9| GCST| gwas| Metabolite levels| [EFO_0005058]| null| null|23823483|A genome-wide ass...| Rhee EP| 2013-07-02| Cell Metab| null|2,076 European an...| 0| 0| 2076| [null]| [{nfe, 1.0}]| [{2076, European}]| []| null| null| null| false|\n", + "+------------+---------+---------+--------------------+------------------------+------+------------------+--------+--------------------+----------------------+---------------+--------------------+----------------------------------+--------------------+------+---------+--------+--------------------+---------------------+--------------------+--------------------+---------------+-------------+--------------------+-----------+\n", + "only showing top 50 rows\n", + "\n" + ] + } + ], + "source": [ + "path_tmp=\"gs://gwas_catalog_data/study_index\"\n", + "tmp=StudyIndex.from_parquet(session=session, path=path_tmp)\n", + "tmp.df.show(50)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "joined_df=joined_df.withColumn(\"traitFromSourceMappedIds\",joined_df[\"trait_efos\"]).drop(\"trait_efos\",\"trait_reported_low\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "| studyId| projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId|publicationTitle|publicationFirstAuthor|publicationDate|publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples|replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Actinomycosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 101| 363227| 363328|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Amoebiasis| ['EFO_0007144']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 160| 367214| 367374|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Anogenital herpes...| ['EFO_0007282']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1986| 400197| 402183|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Aspergillosis| ['EFO_0007157']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 211| 403213| 403424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Atypical virus in...| ['MONDO_0024318']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 282| 409849| 410131|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial infecti...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 20226| 363227| 383453|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial, viral ...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2852| 409329| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Other bacterial i...| ['EFO_0000771']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 6145| 367214| 373359|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Candidiasis| ['MONDO_0002026']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 4306| 403213| 407519|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas|Other sexually tr...| ['MONDO_0021681',...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2186| 400197| 402383|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Cholera| ['EFO_1001235']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1385| 367214| 368599|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas|Dengue fever [cla...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 53| 409137| 409190|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas| Dermatophytosis| ['MONDO_0004678']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 3921| 403213| 407134|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Early syphilis| ['EFO_0007504']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 308| 400197| 400505|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "| FINNGEN_R10_AB1_EBV|FINNGEN_R10| gwas|Infectious mononu...| ['EFO_0007326']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2979| 400974| 403953|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Enterobiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 112| 411658| 411770|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Erysipelas| ['EFO_1001462']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 22261| 363227| 385488|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Diarrhoea and gas...| ['MONDO_0045031']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 32210| 367214| 399424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Gonococcal infection| ['DOID_7551']| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 954| 400197| 401151|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_H...|FINNGEN_R10| gwas| Helminthiases| ['EFO_0007245', '...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 523| 411658| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "joined_df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "string\n" + ] + } + ], + "source": [ + "column_type = dict(joined_df.dtypes)[\"traitFromSourceMappedIds\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.functions import from_json\n", + "from pyspark.sql.types import ArrayType, StringType\n", + "\n", + "# Assuming joined_df is your DataFrame\n", + "joined_df = joined_df.withColumn(\n", + " \"traitFromSourceMappedIds\",\n", + " from_json(\"traitFromSourceMappedIds\", ArrayType(StringType()))\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "| studyId| projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId|publicationTitle|publicationFirstAuthor|publicationDate|publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples|replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Actinomycosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 101| 363227| 363328|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Amoebiasis| [EFO_0007144]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 160| 367214| 367374|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Anogenital herpes...| [EFO_0007282]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1986| 400197| 402183|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Aspergillosis| [EFO_0007157]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 211| 403213| 403424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Atypical virus in...| [MONDO_0024318]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 282| 409849| 410131|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial infecti...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 20226| 363227| 383453|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial, viral ...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2852| 409329| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Other bacterial i...| [EFO_0000771]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 6145| 367214| 373359|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Candidiasis| [MONDO_0002026]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 4306| 403213| 407519|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas|Other sexually tr...| [MONDO_0021681, E...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2186| 400197| 402383|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Cholera| [EFO_1001235]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1385| 367214| 368599|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas|Dengue fever [cla...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 53| 409137| 409190|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas| Dermatophytosis| [MONDO_0004678]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 3921| 403213| 407134|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Early syphilis| [EFO_0007504]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 308| 400197| 400505|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "| FINNGEN_R10_AB1_EBV|FINNGEN_R10| gwas|Infectious mononu...| [EFO_0007326]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2979| 400974| 403953|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Enterobiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 112| 411658| 411770|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Erysipelas| [EFO_1001462]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 22261| 363227| 385488|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Diarrhoea and gas...| [MONDO_0045031]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 32210| 367214| 399424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Gonococcal infection| [DOID_7551]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 954| 400197| 401151|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_H...|FINNGEN_R10| gwas| Helminthiases| [EFO_0007245, EFO...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 523| 411658| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "joined_df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "array\n" + ] + } + ], + "source": [ + "column_type = dict(joined_df.dtypes)[\"traitFromSourceMappedIds\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "si=StudyIndex(_df=joined_df, _schema=StudyIndex.get_schema())" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "| studyId| projectId|studyType| traitFromSource|traitFromSourceMappedIds|geneId|tissueFromSourceId|pubmedId|publicationTitle|publicationFirstAuthor|publicationDate|publicationJournal|backgroundTraitFromSourceMappedIds| initialSampleSize|nCases|nControls|nSamples| cohorts|ldPopulationStructure| discoverySamples|replicationSamples|qualityControls|analysisFlags|summarystatsLocation|hasSumstats|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Actinomycosis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 101| 363227| 363328|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Amoebiasis| [EFO_0007144]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 160| 367214| 367374|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Anogenital herpes...| [EFO_0007282]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1986| 400197| 402183|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas| Aspergillosis| [EFO_0007157]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 211| 403213| 403424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_A...|FINNGEN_R10| gwas|Atypical virus in...| [MONDO_0024318]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 282| 409849| 410131|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial infecti...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 20226| 363227| 383453|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Bacterial, viral ...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2852| 409329| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_B...|FINNGEN_R10| gwas|Other bacterial i...| [EFO_0000771]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 6145| 367214| 373359|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Candidiasis| [MONDO_0002026]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 4306| 403213| 407519|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas|Other sexually tr...| [MONDO_0021681, E...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2186| 400197| 402383|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_C...|FINNGEN_R10| gwas| Cholera| [EFO_1001235]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 1385| 367214| 368599|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas|Dengue fever [cla...| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 53| 409137| 409190|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_D...|FINNGEN_R10| gwas| Dermatophytosis| [MONDO_0004678]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 3921| 403213| 407134|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Early syphilis| [EFO_0007504]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 308| 400197| 400505|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "| FINNGEN_R10_AB1_EBV|FINNGEN_R10| gwas|Infectious mononu...| [EFO_0007326]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 2979| 400974| 403953|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Enterobiasis| null| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 112| 411658| 411770|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_E...|FINNGEN_R10| gwas| Erysipelas| [EFO_1001462]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 22261| 363227| 385488|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Diarrhoea and gas...| [MONDO_0045031]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 32210| 367214| 399424|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_G...|FINNGEN_R10| gwas|Gonococcal infection| [DOID_7551]| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 954| 400197| 401151|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "|FINNGEN_R10_AB1_H...|FINNGEN_R10| gwas| Helminthiases| [EFO_0007245, EFO...| null| null| null| null| null| null| null| null|377,277 (210,870 ...| 523| 411658| 412181|[FinnGen]| [{fin, 1.0}]|[{377277, Finnish}]| null| null| null|gs://finngen-publ...| true|\n", + "+--------------------+-----------+---------+--------------------+------------------------+------+------------------+--------+----------------+----------------------+---------------+------------------+----------------------------------+--------------------+------+---------+--------+---------+---------------------+-------------------+------------------+---------------+-------------+--------------------+-----------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "si.df.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "2408" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "si.df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "si.df.write.parquet(path=\"gs://genetics-portal-dev-analysis/yt4/study_index_finngen_with_efo\")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "path_to_study_index=\"gs://genetics-portal-dev-analysis/yt4/study_index_finngen_with_efo\"\n", + "si=StudyIndex.from_parquet(session=session, path=path_to_study_index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-krNFZEZg-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/Productionizing_LD_matrix.ipynb b/notebooks/Productionizing_LD_matrix.ipynb deleted file mode 100644 index 3ba4dc06b..000000000 --- a/notebooks/Productionizing_LD_matrix.ipynb +++ /dev/null @@ -1,1505 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "baf71347", - "metadata": {}, - "source": [ - "# Extracting square sub-matrices from reference\n", - "\n", - "\n", - "### Conceptual considerations:\n", - "\n", - "```\n", - "Summary statistics\n", - "↓\n", - "[window based clumping]\n", - "[ld based clumping]\n", - "↓\n", - "StudyLocus\n", - "↓\n", - "[ld matrix extraction] <- StudyIndex (studyId, ldPopulations), ldIndex, ldMatrix\n", - "↓\n", - "\n", - "```\n", - "\n", - "\n", - "- Assume we have only one ancestry" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "d75ac655", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-25T11:18:41.257715Z", - "start_time": "2023-10-25T11:18:14.728571Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "SLF4J: No SLF4J providers were found.\n", - "SLF4J: Defaulting to no-operation (NOP) logger implementation\n", - "SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.\n", - "SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.\n", - "SLF4J: Ignoring binding found at [jar:file:/usr/lib/spark/jars/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]\n", - "SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.\n", - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", - "pip-installed Hail requires additional configuration options in Spark referring\n", - " to the path to the Hail Python module directory HAIL_DIR,\n", - " e.g. /path/to/python/site-packages/hail:\n", - " spark.jars=HAIL_DIR/backend/hail-all-spark.jar\n", - " spark.driver.extraClassPath=HAIL_DIR/backend/hail-all-spark.jar\n", - " spark.executor.extraClassPath=./hail-all-spark.jarRunning on Apache Spark version 3.3.0\n", - "SparkUI available at http://ds-genetics-etl-test-m.c.open-targets-eu-dev.internal:37397\n", - "Welcome to\n", - " __ __ <>__\n", - " / /_/ /__ __/ /\n", - " / __ / _ `/ / /\n", - " /_/ /_/\\_,_/_/_/ version 0.2.122-be9d88a80695\n", - "LOGGING: writing to /dev/null\n" - ] - } - ], - "source": [ - "from gentropy.common.session import Session\n", - "from gentropy.dataset.study_locus import StudyLocus\n", - "from gentropy.dataset.study_index import StudyIndex\n", - "from gentropy.datasource.gnomad.ld import GnomADLDMatrix\n", - "from gentropy.datasource.finngen.study_index import FinnGenStudyIndex\n", - "\n", - "import hail as hl\n", - "from hail.linalg import BlockMatrix\n", - "\n", - "from pyspark.sql import Window\n", - "import pyspark.sql.functions as f\n", - "from pyspark.sql import Column, DataFrame\n", - "\n", - "from urllib.request import urlopen\n", - "\n", - "\n", - "session = Session(hail_home='/opt/conda/miniconda3/lib/python3.10/site-packages/hail')\n", - "hl.init(sc=session.spark.sparkContext, log=\"/dev/null\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "9eac3419", - "metadata": {}, - "source": [ - "## Generate FINNGEN Study table\n", - "\n", - "- Executed in 2.22s\n", - "- Building a Finngen study table from source." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "51b4cd9c", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-25T11:19:13.439965Z", - "start_time": "2023-10-25T11:19:11.603603Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0--------------------------------------------------------------------------------------------------------------------\n", - " studyId | FINNGEN_R9_AB1_ACTINOMYCOSIS \n", - " traitFromSource | Actinomycosis \n", - " nCases | 93 \n", - " nControls | 332343 \n", - " nSamples | 332436 \n", - " projectId | FINNGEN_R9 \n", - " studyType | gwas \n", - " hasSumstats | true \n", - " initialSampleSize | 377,277 (210,870 females and 166,407 males) \n", - " discoverySamples | [{377277, Finnish}] \n", - " summarystatsLocation | https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_AB1_ACTINOMYCOSIS.gz \n", - " ldPopulationStructure | [{fin, 1.0}] \n", - "only showing top 1 row\n", - "\n", - "+--------------------+------------+\n", - "| studyId|ldPopulation|\n", - "+--------------------+------------+\n", - "|FINNGEN_R9_ASTHMA...| fin|\n", - "|FINNGEN_R9_E4_PIT...| fin|\n", - "|FINNGEN_R9_E4_VIT...| fin|\n", - "|FINNGEN_R9_H8_MID...| fin|\n", - "|FINNGEN_R9_L12_PI...| fin|\n", - "|FINNGEN_R9_M13_HA...| fin|\n", - "|FINNGEN_R9_M13_SP...| fin|\n", - "|FINNGEN_R9_Q17_LV...| fin|\n", - "|FINNGEN_R9_ALCOHO...| fin|\n", - "|FINNGEN_R9_CHRONL...| fin|\n", - "|FINNGEN_R9_C_DIFF...| fin|\n", - "|FINNGEN_R9_E4_OBE...| fin|\n", - "|FINNGEN_R9_GOUT_S...| fin|\n", - "|FINNGEN_R9_I9_LYM...| fin|\n", - "|FINNGEN_R9_I9_VAR...| fin|\n", - "|FINNGEN_R9_J10_CH...| fin|\n", - "|FINNGEN_R9_K11_HY...| fin|\n", - "|FINNGEN_R9_K11_RE...| fin|\n", - "|FINNGEN_R9_M13_OS...| fin|\n", - "|FINNGEN_R9_O15_PR...| fin|\n", - "+--------------------+------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "# Processing studies:\n", - "def update_population(ld_pop: Column) -> Column:\n", - " return f.when(\n", - " f.size(ld_pop) == 1,\n", - " ld_pop.getItem(0).ldPopulation\n", - " )\n", - "\n", - "\n", - "# Read the JSON data from the URL.\n", - "json_data = urlopen('https://r9.finngen.fi/api/phenos').read().decode(\"utf-8\")\n", - "rdd = session.spark.sparkContext.parallelize([json_data])\n", - "df = session.spark.read.json(rdd)\n", - "\n", - "\n", - "finngen_release_prefix = 'FINNGEN_R9'\n", - "finngen_summary_stats_url_prefix = 'https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_'\n", - "finngen_summary_stats_url_suffix = '.gz'\n", - "\n", - "# Parse the study index data.\n", - "studies = FinnGenStudyIndex.from_source(\n", - " df, \n", - " finngen_release_prefix, \n", - " finngen_summary_stats_url_prefix, \n", - " finngen_summary_stats_url_suffix\n", - ")\n", - "\n", - "studies.df.show(1, False, True)\n", - "\n", - "# From the study table we only need study identifier and the ld population\n", - "# We only need ld population if the study is based on single ancestry.\n", - "studies = (\n", - " studies.df\n", - " .select(\n", - " 'studyId',\n", - " update_population(f.col('ldPopulationStructure')).alias('ldPopulation'), \n", - " )\n", - " .distinct()\n", - " .persist()\n", - ")\n", - "\n", - "studies.show()" - ] - }, - { - "cell_type": "markdown", - "id": "6452e680", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-24T10:24:17.267975Z", - "start_time": "2023-10-24T10:24:11.432842Z" - } - }, - "source": [ - "## Reading distance and ld clumped Finngen dataset\n", - "\n", - "- Extract two random loci for prototyping purposes.\n", - "- Input dataset: 19,005 study locus from 1,387 studies." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "46e851ca", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-25T11:25:04.824517Z", - "start_time": "2023-10-25T11:25:00.848659Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 63:===================================================> (33 + 3) / 36]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------+---------------+--------------+--------------+\n", - "|studyId |variantId |pValueMantissa|pValueExponent|\n", - "+-----------------------------------------+---------------+--------------+--------------+\n", - "|FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC|15_29035680_G_A|2.076 |-21 |\n", - "|FINNGEN_R9_G6_SLEEPAPNO |16_53771295_C_A|2.149 |-26 |\n", - "+-----------------------------------------+---------------+--------------+--------------+\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "sl = StudyLocus(\n", - " _df= (\n", - " session.spark.read\n", - " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", - " .filter(\n", - " (f.size(f.col('qualityControls')) == 0) &\n", - " (f.size(f.col('locus')) > 100)\n", - " )\n", - " .orderBy(f.rand(seed=23))\n", - " .limit(2)\n", - " ),\n", - " _schema=StudyLocus.get_schema()\n", - ").persist()\n", - "\n", - "# Get list of leads and studies:\n", - "sl.df.select('studyId', 'variantId', 'pValueMantissa', 'pValueExponent', ).show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "id": "661d9633", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:16:21.754731Z", - "start_time": "2023-10-27T11:16:20.553762Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", - "|studyLocusId |variantId |pValue |locusSize|ldSetSize|qualityControls |\n", - "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", - "|-6067699795164145074|15_27427129_A_G|9.592E-13|738 |35 |[] |\n", - "|-8027743839728879857|15_27983407_C_T|4.618E-61|837 |78 |[] |\n", - "|4889075444063922922 |15_28519016_G_A|2.786E-33|277 |-1 |[Variant not found in LD reference]|\n", - "|2224601896262245870 |15_29035680_G_A|2.076E-21|647 |5 |[] |\n", - "|-7676564604508510836|15_48134287_A_G|3.572E-12|442 |34 |[] |\n", - "+--------------------+---------------+---------+---------+---------+-----------------------------------+\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "# Let's get all top-loci from this study on chromosome 15:\n", - "(\n", - " session.spark.read\n", - " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", - " .filter(\n", - " (f.col('studyId') == 'FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC') &\n", - " (f.col('chromosome') == '15') \n", - "# f.col('ldSet').isNotNull()\n", - " )\n", - " .orderBy(f.col('position'))\n", - " .select(\n", - " 'studyLocusId',\n", - " 'variantId', \n", - " f.concat_ws('E','pValueMantissa', 'pValueExponent').alias('pValue'), \n", - "# 'studyLocusId', \n", - " f.size(f.col('locus')).alias('locusSize'),\n", - " f.size(f.col('ldSet')).alias('ldSetSize'),\n", - " f.col('qualityControls')\n", - " )\n", - "# .count()\n", - " .show(20, truncate=False)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d101a072", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "attachments": { - "image.png": { - "image/png": "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8IseYXz/ww2TU+jEN2tzYM2N9Rs2ar+4T3TYG8mUMaNOU/r090vvvv2087bt2yVvntzGS7TtazWqS19lcunWW2+Nds6bQ1x4OsODQsFuYqpkiVf1rA7MZoGACxREUD7g9/Mv62Tt2p/1uWJFi8rjObLrffz76bo79pFP9rU3wBtmoDp27orT8t33P8rT+W88I9qR/0iABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIUgfCwsLAESfCBAwcFI+whWTJnko4d2lqKCu2o/j3wQHrp3KmDOZRP535u7WOWBRbRRkc31m8wigrLg9rB4stG/v77b7OrF2iev+ALfYyZB2+/9aalqDCeoCyoX6+OOYzRFkoCI18tXWZ2re3CRV9a+zWqV7X2L1y8YHXe16ldy3K372TN+ph16DTjZJ1QO+AycMA7rhUVceFpjxf75cqW8VBUwA0mnzDTwsiZM1GmqMyxv+1vhw5Zpy8p019OKVWqhLRo3lT/cj71pPM0j0mABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIYgQSbWbF7zx4LTVnVue1cLNqcfP65G+aBflp7Y80CKFUWLrihvDD+sYWZpaNHj8mYsR/Yna39HTt+tfZfr1nDq6IDHl6rXk1mzPzQ8ut2p7y6n/4DBmnvXyz8Ui3+3NtaIByzLWDCCYIZAXbzRzmyZ5elSxbpc85/ULbs3rNXr1fhPOftuH69utYi1t7OO93iwtMZVuVKFZxO+jiHbbbE3471MrxecN0Rs0eMSa4aNWtLa7Xgevny5SRH9mxawZXmttuke9fO/oLgORIgARIgARIgARIgARIgARIgARIgARIgARIgARIggSREIMGUFVhHwsjUaTPk++9/MIc+t4cPH4l2DosvY22In9TiyzC9dPC3Q9YC0tE8X3c4fORGOFmyZPHlTR5++CGf5/ydwIyQl18qrEwS/aBNQcHE0QuFnteXfLvyO+tSzJ6ISJXKOjY7UExgTYtNmzfr9TYOKlZQcsREMmfOFBPvlt/Y8LQuvr5zz913O5308e1qFouRyMhrZjfgtm6d2jJ/wUKLwfvjxgt+mBUD81KvFC8qL75QyDKnFTBAeiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEghpAhEJZQbq0KHDFgh0xG/Zus06druDNQ569OylO/S9XYOZC2fPRjc3ZFd63HVXOm+XajezloRPD35OVKtaRSsr4GXp0uWWssJuAsrbDISZH86WwUOGWR3zzijQQe9GcXHzTTc5Lw14HFuezoDvuOMOp1OcjrF+xfzP52gu365cZYUFDjAlZsyJwWzX2716elUAWRdxhwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIIOQJJJiy4o7bb7dglC1TWp4t8Ix17GsnIiLCOnXkyFF57fW61jF2TDiPPPKwZMuaVbAYdfYncnn4wUGa22+M8P/vv/+inTcO9nUujJvb7SvFi1leP1cd6r3VQtfn//c/MQtMY00MLARul4WLFkuvt/taTlC2lFbrMeTKmVNwTzB7tG/f/mj3bV0Qh5248HRGGwyFF0xkTZsyUY6fOCE//rhaflz9k6z45lsPxQ1MdqWOSC293urhTBKPSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAEkhCBG9qAICc6U+aMVgz58uaRBvU9FQ/WSR87n8z51DpTpMhLMn7smGiLSZ8+/bvlx76TKeONuI+otS18yYmTJ32dCuh+2223Si21HsbHn3yqO9TXr98gx44dt66r+VoNa9/sTJ4y1exKh3ZtpF3b1tEWHf9l3XrLT3zuxIVnfKYjUFgZHnxQaqi1RPC7du2a7Ny5S2bMmi1zPp2rL/1YPRc93+ymF/QOFBbPkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJhCaB8IRKln1WAdZ28CUHDhyU/AWe17/OXbtb3n5VndRGWjZvFk1RgXPr1nvv2M/46CPmUpk3b75ERkZax/adxUuW2g9jvF+5UkXrmqXLlsvCL7+0jkuVfNXax86VK1c8TGG1btUimqIC/n766Wds4l3iwjPeE2MLcP/+A1b+j37vfdsZ0QqJp556UoYOHmAtVA7TUCdPnfLwxwMSIAESIAESIAESIAESIAESIAESIAESIAESIAESIIGkRSDBlBV58+QWmDmC/KDM+qxTMw+cgpHzg98dptedwNoTzzz9tOUlPPxGUrGwtlNOnTotY94f53TWx3nVTA4TNxb6Xvjl4mj+cP3kKdOiucfEocAzT8uDDzygL5k2faasWvW93q9erYo413Ww3w88HTh4UPu1/1u/YaPApFQwxB5/THnGd3ouXrxoBZkhw4NW/mOWii/F0sULF6xrfC3wbXngDgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEgTCPfVGewm1c2at5I3mrUM+Dt58pTcrtas6NWzuxVstRq19ELJZ86ckUuXLsmOHb9Kg0ZvyLJlX2s/6PQvV7a05T93rpzW/vtjP9DrF1y4cFHQ0f7JnLlSulxF2blrt+Xn2LFjgjUooAC59dZbPeJu266jTJ46TQ4dPiznVaf3j6vX6OvdLGRtReBlBwoAmIJyStXKlZxOepaAfd2Od/oNlA0bNwo67jdt2ixj1D1WrV7TY42G3347rM9HCywWDnHhGYvool0C805Gxn0wQWDuCgoj5FXhF1/Qp2CWq1nL1sqc1jGttLhy9aps275d3urVx5qVAr8333yzCYpbEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBJEgg7OrVq5H2Ufb+7uHy5cuSNcdT/rx4Pff1ssWSPVs23eHcqk17WbzkK6/+7I6Lvpgn9g51zLQoXOQVj857u3/sF3q+oPyulB/2mQJjRo+UCuXLirpPad6yjbXgtfNaHOfLl1crCrCP2RDDhg7Gbozk4G+/SZFiJaxroHRZ8+Mqr2sqrF37c8DFs+vUriUfzv7YCg87a9d8r2dwjBw9RkapH2TB55/q9OsD27+vli7T9w2n3r16SqOG9fXZuPLs3befTJ8xS4f17ddL5bHHsuh9+z+Y9Cr6Sknt5OS5ddt2KV+xit27XrejvVq7A/n3SskyHud8HaxcsUyyZMns6zTdSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAEkgCB8LCwMNfJjIlfe6ARqaLW8cb1Y8eMkkED+tlPe+wXK1pEFi+c76GogAeYcfrko1mSLVtWD/84SJMmjbRu2VxmzZwmPbp18TgfKVHrU6RKlUrGjxsjHdu39ThvDqDomK2uf/T6+hYREbFbexxrc0DpYeT1Wq95VVTgfMGCz8nokcN0+o1/s4WSA4qWAf36SovmTY2z3kaq2SKQVDbTWOHq/rxJePgNd/s9xZWnyVPEGZ7qhokuexrs7va44efJJ5+Qhg3q2b1b+8jjj2fPtEx3WSdsO2D85cJ5VFTYmHCXBEiABEiABEiABEiABEiABEiABEiABEiABEiABJIqgTBlBiqqNz+B7wAml3bt3i1Y6Pnff/+T9PffL7lz55RMGTP6TQlmd2xUZpKwEHPq1Kklv+q0zpw5k4dCAOaDDh8+IhERqeTJJ56Ithj32XPnZMuWrXoEP67Nkzu3pE9/vySW/PnnX7J5yxY5dOiwTke+vHmjpWfP3r1y7uw5SZs2reTIkd3jfuOS7vjgGZf4YQbs9zNn5SaVl1AUIU+NIG3bt+/QJp/++PNPfe7RRx7R/vLkzuV1QXJzLbckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJJh0CMzEAlndtiSkmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJIKgUSbWZFUADGdJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACwSXgfbGB4MbJ0EmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjAIhB+9epV64A7JEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJDQBGgGKqGJMz4SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEPAjQD5YGDByRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAglNgMqKhCbO+EiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABDwIUFnhgYMHJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACCU0gPDIyMqHjZHwkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkYBGgssJCwR0SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHEIBCmZlZwakVikGecJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACmgDXrOCDQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkKgEwq9du5aoCWDkJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACKZtAeFhYWMomwLsnARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIVAJcYDtR8TNyEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABzqzgM0ACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCoBCIiIyMlJqagDh48KLt375YzZ87I1atXEzXxjDzuBFKlSiX33nuv5MiRQzJnzhz3ABkCCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACcSQQJhSVkS6vWb9+vVy8uRJyZMnj2TIkEHQ0U1J2gSgcDp+/Lhs2bJF30i5cuWS9g0x9SRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAkmOQLjbFGNGBRQVpUuXlkceeYSKCrfgQtwfFE7IzxIlSuiUIp8pJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJCQBFwvsA3TT5hRwdkUCZk9CRfXTTfdpPMX+UwhARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggYQk4HqBbaxRAdNPlORLAPmLfKaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEIScD2zAmsbcFZFQmZNwseF/OWi6QnPnTGSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEon4FpZkdJB8f5JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgASCQ8C1GajgRM9QSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEUjoBKitS+hPA+ycBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBRCYQnsjxM3oSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIEUToDKihT+APD2SYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCxCVBZkdg5wPhJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIIUTCI+MjEwwBIhr7969cu7cuQSJc8WKFbJw4UIrrrlz58r8+fP18enTp2X69Oly/Phx67y3neXLl8vixYu9nYqx25UrV2Tfvn1y9OhRSUjuMU5oErngjz/+lLmfzZPjJ07oFJ86dVomTpoiv//+u887cOPH58VxPIG0bt++I46h8HISIAESIAESIAESIAESIAESIAESIAESIAESIAESSH4EEkRZAQVF7dq1JW3atJI9e3a555575JFHHrEUB8HC+v7770vfvn118FevXpUaNWpI/fr19fGBAwekYcOG8uuvv/qNfsSIETJo0CC/fgKdvHTpkrRo0UJSp04t2bJl0/cOFhMmTAh0abTza9asEfxCTZYt+1oy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Z/defb5e3drWGhdY46Rundd9Kiv0BS7+QdlQsOBzlqIClzytFF45cz4lW7dt9wihqHo2jTz33LN6d/PmLVpZEegezHXckgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCcQ4a1zPbq32LlgXQXIrl27XAeQNm1aD79GWfHCCy94uONgy5Yt2m3jxo0Cc05OQfy///6709nj2K4YwYlMmTLp83v27NFb+7+dO3fqw06dboy2t58/oWYA+FKQYA2Odu3a6R9G8k+aNEkvLo7ZFVhfIrZh33vvvdosFta+qF+/vk4OFi7v37+/No1lT1+o7N+eJo1HUvbt2y8dO3eVLVu3ebibgwPXTXc98vBDxklvMz76qMdxbA4QZ62aNaJdmiVzJlm9xtO012233VC6pUubTl+DxbQhge5Be+I/EiABEiABEiABEiABEiABEiABEiABEiABEiABEiABrwTCvbrGkyM66DHrwJd5JKz3MG3aNMGaE74kZ86c+hSUDujkt//MItuY6XD48OFoQTjXp4jmQTkcO3bMw/n48eP6+FEvHeFmFgMWxranw+xjPQWn4BxMNWEdBSP33HOPXsi7Zs2acvToUa1QiU3YJjzMIoFCaMeOHTJixAg5pBaHLlmypGANkKQgrdu2l337D8jokcNk9fcrZcfWjQJTUWmuKzUeUut+QDDrwi4n1XoncZUnHs8hJ9SsF6ccP35CMmfK6HT2eRzoHnxeyBMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAISVGUF+FaqVEkvdG3WeDDMYX6qTZs20qhRI72wsnF3bo1pp23btun1F7CwNX7ffPONtaj1008/rdY3WOahsICCwNvsCGf4H3/8scdC1PPmzdNesNi2U7BOBmTNmjUeaYGSYOHChU7v+nj79u16TYuZM2dGO481JbCGBZQXMQkbMziMQGED81J//vmnNk+FtTbGjx+vT8dkRosJL6G3//33n+zctVvKlC6p15Z4WM2euEWZDVutGBvJniOb3l285CvjpLdYCNufmMXj//jjT5/esC7JunUb9LoYxtNvStmDtTDyXs9v4+5r6+YefF1LdxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAZGgLrANwCNHjpT169drM01YW6J06dJy/vx5mThxol7nAQtFw5SRLylfvrzuhK9YsaL06dNHMmfOrBUD06dPl7Fjx+rLsPYDFuBG2OisR+fx4MGDfQXp4b5q1SqpVauWVKlSRbAgeL9+/aRYsWICBYhTYCIKppZ69+6t76FgwYICZQQW+a5evbo0aNDAeYkULlxYsmfPLs2aNZMDBw7o40uXLgmUJF999ZVW2KBT3W3YWKgb61OABdhAkH6s9dG5c2e5+eabZejQodq9UKFCehvK/5BezG7AQthQDtynnoWP5syRAwd/s2ZWZMqYUS9sPUkteA2BYuc7tZj5V0uX+b21nNcXzB4/cZJcvnxJSpcqGc0/FvWe8+lcadS4qTSoX0+uXbsmkyZP0XHXfr1mNP/eHNzcg7fr6EYCJEACJEACJEACJEACJEACJEACJEACJEACJEACJBBFIAI298PCwoLGA4tXL1iwQLp27apnAGCtBghmFGAh6xYtWnjEbUbDG0esYbFkyRJp1aqVmLUicO2QIUOsa5955hm9YDWUCGbtCnTmY3YF1oOwizN8KE2mTp2qO/zhDwqAKVOmCBZwhtj9g9OECRMEC4ZDWWKUApgdMmrUKO3f+Q/XYyZG48aNdZqRbiNQ1GBtCYjbsOvVqydLly6Vvn37CkxWIf0zZsyQLl26SLly5XRYMIu1evVqueuuu/RxYvyzcwsU/+hRw6V5i9bSs1dv7bWCWoC7Tu1aMn9B1GwVsHl3yEDNyCgsoOAYNeJdad+xixW88zm+8847pWP7tjJi1HvSoVNXee7ZAtGedYTz8eyZMnzEKOnWo6cO69kCz8iwdwerRd0z62NnuHA0r4w5F+gedED6uuC9ayYObkmABEiABEiABEiABEiABEiABEiABEiABEiABEggqREIU+aYIt10LKND3CzgHNubvHLlip69kC5dOvG2JkSgcDEj4Y8//pD77rvPQ4lgv+7MmTNaEYLR7jERhItroFxxI1DynFJrJsCEU+rUqd1cotet2Lt3r9xyyy2qIzyL+Frc3E3YFy9e1PEapQoScO7cOe0GZU5sJT7yObZx//nnXyr9EdaMCm/h4Bk4f/6CUsRELXDtzY/T7YoyOXbl8mXN3XnOfnzhwkV9aF9I237ezb6be3ATDv2QAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEoiEOFGURFfQNCxjjUCYis33XSTYNFuf+LPpJS/62I6CwEj6h944AF/QUY7ByWFt7UwnB7dhI3ZHU7BWh5JWdKlSxsw+XgG8IuJRKRKJfgFkrgoKUzYbu7B+OWWBEiABEiABEiABEiABEiABEiABEiABEiABEiABEggikDQF9gmaBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARLwRyAcCwpTSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCxCISbBYITKwGMlwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIGUTCMdizhQSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSCwCnFmRWOQZLwmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQgCbAmRV8EEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABBKVQLiSRE0AIycBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkjZBKipSNn5z7snARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggUQnQDNQiZ4FTAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJpGwCEWFhYSmbAO8+GoEZM2ZEc6MDCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACQSLQNi1a9ciqbAIFl6GSwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIgAzUAFIsTzJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACQSUQzlkVQeXLwEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABAIQoLIiACCeJgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCC6B8OAGz9BJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwD8BKiv88+FZEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBIBOgsiLIgBk8CZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCAfwLhkZGR/n3wLAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkEkQCVFUGEy6BJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQCEwgPCwsL7Is+SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCBIBCLcKiuOHz8epCQwWBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggZRMIOLatWsSHu5une0MGTKEBKt//vlH7rjjjpBICxORvAjw2Upe+RlKd4Nnq3PnzqGUJKYlyASGDRvGb1WQGYdi8PyOhGKuBD9NzPfgMw7FGJjvoZgrwU0T8zy4fEM1dOZ7qOZMcNPFfA8u31AMnXkeernCPAm9PEmIFCk9hTtFRUIkhnGQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmkPALUVKS8POcdkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEBIEYi4evWqpEqVKqQSxcSQAAmQQHIkMGHChOR4W7wnHwQwZZVCAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTgjkA4FRXuQNEXCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAcAjQDFRwuDJUEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABlwSorHAJit5IgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgASCQ4DKiuBwTXKhbtm6TabPmCVX1BomlMAEIiMj5eBvv8mff/7l1zN4/nbokJw4eVJwTSjJ9z/8KN+uXKWTdOrUaZk4aYr8/vvvoZREpuU6gZ27dsvcz+bx/eQTESsCi5d8JcuWfe33Wjd+/AbAk0mGgL3sTzKJTsYJTez8+Pfff+Xw4SN+CV+8eFF/g1BXcCsLFy2W3Xv2uPWeYv1h7cBVq76XGTM/FNTFjSBPPp+3QLtfu3bNOIfElm2GuGVDML63Ma3Hs14ZtzyM7dXk7knu7NmzHt+W2PBB+2j79h2eAaeAox9Xr5GvV3yTKHd6+fJlmTpthuzY8WuixM9IoxOYv+AL2bxlqz4R0+9B9NDcufA5cMfJ+Prjjz91eXf8xAnt5KxLuSnLYlNGmviT4jY81DpQ4wrxwIGDugMWlf+EkK7de0rGLNk9fmUrVJbR770v9jQULPSStO/YxUqS8xoc16nXUNC4Swx5b8xY6d23n+zfvz9eo9+wcaPgl1wECoq27TvJU7nzS5FiJSRP/gKCvHV2BKLw7tmrtzyW7Ql5ueir2g+umf3RJyGDYvKUaTJ23Hidni8XL5EBg4bIsuUr9DGeXSgy8D5REp/Ad999L527dpfLly4lfmKYgiRFAO9yy9btpEPnrla6neWyNz+WZ+4kOwL2sj/Z3VwSvKFg58fMWbN1HbVeg8YedNBJ1KZdB8nxZG4pXKS4FC1eQmbN/sjDjzmYOn2mjPtgvNx1VzrjFHC7/8ABadWmPZXsAUj17TdA6jdqIpOnTlN1rgPaNwa5lCpbQTqqcnvJ0mVyLR4HuzjL/wDJ83o6WG0Gr5ElMUdv7ULT5oOSIljfW2c9PhA21isDEYr9+QqVquoy19sAMCf3c3/8Id98u1KwDSVJqP4UKGXRvtm7b5++fScfN0xw/fJE6LRH2vFufzJnrptkxrsfKLhHqf4mb/Lp3M902n7+ZZ230zJp8lR9Hh2fsZFdu3cLvl3jxk+MzeU+rwnV98FbgsEO+W8GcYwZ+4FUrV7Tm9cEcUM/41eqvgCJ6fcgtgkM1nMQ2/SgvYv+TMh///2n8wdKvVCR48eP6/Ju1/X3zlmXclOWxaaMDJX7j006IqCsCAsLi821IXnNgoWLtKJg144tcuuttwY9jdeuRSlFOndsr+M6eeqUfDj7Y63hR4Hbt3cv7X5JdV5fvXolWnrMdVu3bZflX6+QH35cLRERqaRM6VLR/AbToddbPaRSxQqSPVu2eI1m4KChOrzP54ZOJ31sb/DMmTPqI1RL0MB/pXgxKVumlEBDig9+0xat5N0hA6VG9Wo6+Dff6i2oKJQtU1rKlS0t589fkCmqIfrmW2/LLbfcIlWrVIptMoJyXY3qVeXOO+9Uz11JHf4l1SnesHFTade2tXRs3zYocTJQEiCB4BNIlSqVzPlolkSkTm1F5iyXvfmxPHOHBEggSRK4cOGirnNgtB0Egyjs0rFLNz2iv369OvL00/nlgw8myFu9+sgjDz0sRYq8ZHlFQ3zou8Nl8MD+ctNNN1nugXYa1q8no0aPkU8//Uxer/VaIO8p9vyXi7+Swi++ILNmTLXaY+vWbVD1xvMyd85H8myBZ+KVjbP8j03gwWozxCYtoXaNaRd2aNcmWtIee+wxCdb31lmPjxY5HRKEADr5zQypr5Yul3p1a/uN99dfd0qjJs1k9qzp8uILhfz6TciTCd2fkpD3Fl9xRUqUxYRQm/mG+ytWtIi+TXReP/dsAb1v/4f8ffTRR+SJx3PYnV3vP/XkkzJm9EjJmye362vceAzV98Fb2nfu3Clp0qSR9Onv16e3bd8uTz31pDevCe6WUN+DYD0HsQW29udfpFOHdvpyM+A2W9assQ0u6NexLhUYcUR4OC1BBcbk3wcKqjatW1qeevboLjVfr6PNKqGjN23atNY5s3PPPffIC4UKelx37NgxKVS4qEDLFh/KCjeKKOMnU8aMgl9sxYQT2+uTwnUfjJ+kFRVogLS3NUIqlC8r5StWlcFDh0uVKpX1rWD0FBr7494fbd1aGaXcKPDcC4KOAzfKivhi6iacO+64Q6pXq2KllTuJR8BNfrlJXXyF4yYu+gltAgULPhcwgW78BAyEHkiABEKGQIvWbbQy4p0+b8vHn8zxSNeu3Xv0uYoVygvOQ9ApjpmiH0yc5KGsMGYm7AoMj8B8HKRLl1YKPV9QPv3scyorfDDCKHsMgMmfP5+lqIDXU6ejzG3lyvmUjysDO8dXHcBbOHFtMwROfdL2gXahvZ3gvBt/31tvvJ3Xe/Pjrx7vzb8zTB7HDwGMaIbgGfjs83kBlRXxE6toU8PeBp8GyvtA5+MrfQgnIeOKz3QnxbDuvfde/R2HxY63evaQCDVwyQhm7sFslhkwa9xjskX/Ifo/4iJJ/XnYsWOnPKMGehhZv36jdO/ayRwm6tbf9wAJiy/2gZ6D+IrHDcyz587p+tTjj2fX3nfu2iXobzXKpEBhuEmrGz+B4rGfZ13KTsP7frLSVOhp1Mq0DaRMuYpin/K+b99+wdTc/AWe142xHj176bUEDBaMjof5JhTemMKFaV2vvV5XFnyx0Hhxvb3ttluluhqpDjGjK9xc/NBDD+mR+JhWhhFVTunzTn+dNqcGv5MaHWfuFVOeho8crafzZ3osh2AqKmzeGoHG8ZWSZbS5n1q16wn8rFu/QWAmAO5GTp/+XTp06qp5PZkrnzZRZb8XwwvhgRfCwfWrlLkaiJ59oI7Xb9iofzg3Uo2wS8qyfMUKyZYtq7Ru1cLjNu677z7pdH1mzTZlb/jsmbM6/554/HEPf2luu02PnGnSuKGHu/MAzxyePTCt/trr2h4k8nH8hEna67ARo6z8NtdiqrHJV+MGpQieaYQD8w5DlDLF15okmzZt1tfv3LlLd2Dg/YHAPAXChUkoPH+VqtaIFgbeKzxLlNgTwPs+eOgwzRr5BZNwa9f+HC1AzMDCs4HyCXmBqeNGzDsJt1Jlyut8R37jw4r1aPAs4TrkFWZ/2cVMm4QZCnRW4Z1/d9gIgS3z/gMH62O4ody0j8793//+J4OGvKvTjfMIxzndEnYZ4Y7zxo+x1Yg0BDt94IrnH3F36fZmyJg2M/kV6Jvjhk8gxpgaDLN0/spl48c8F4HixTOLsgEdkW/3ecf6VqA88Pb9MuGm9K1519CAxHOJdxJumzZvCYgG3358C/r1H+ThF+8p3nmMYofgW40yBM886jww9YO89yZYT8mU8fbzMGWJssYuqCeY+tEbzVpa33u7H+7HnYCbchXl8IhR7+m8wzOEPP7pp7X6GPUyIxiZj5kTqSIijJPebtkS9by1aPaG5f7gAw9opQK+Pfa6wnff/yBZMmcSnIeYdx+2dVEfwTOGH2ZlGHMI2qP6V7jwC4L6RaD1vYz/5Lbdv/+AbnvgXcT7ju/l+QsX9G3C7OYrJUrrfVPXWvTlEv3ejVOzXCCoi+FbbyTQO4i88VWX8Ff+m/DNFmUKyhmYBzN1UbQVjNjbDNu379DPHcoR5w9rcRgJlHbjLyVs7d9b0y7D2jWN32iueaMeNmHiZAuFGz/2ery5EHU9Ux/E9qOPPZWW8OevXmnC4dYdAdSb5ioFBWbfv9m9q/4Wo2PYl2BwIkwLQ7DF+2PKUH9lB/ybOqSzzm/qGDM/nK3LHNOmgBlju/hrI/rrT0E7H9YE8N1BfQCmiPxJoH4Jf9eaczGNE9/QUKr7Byr7AvW5gAPeb+QtuONb8sWiLw0en9vKymIGyv0Nqi/GLsuvm3yG9QdIoDqjeabeV6aj8a1HOxL5iucVViSMuA3H17Pp730wcYTCdpLqG4G5HrSZUT/CPt4ZsIYpKBz7qnPbn2XkY/8Bg3Rb29xXoLaX8Wf6isx7iHLcLs7vgclDX+zNtajXmX4GvN+YLYK+JJQ33sT5HJhyyVf/oLcw4up26PBhzbzwy8V1UOMnTNbH6MdEPiA//Jlqw/uJPhKUlWhj4btpxNyPs5zF+UDvNerRaEuZth7q6WYgigkfYeA9sgvaeuPGT9DvGuqOaFfjHv2J/blyUy77CyvUzoU7O75DLYExSU/JV1+Vp558Ql9SuVJFKVniVb2PD3+NWnW0/TYU3KVKqUJ+4ZdSt34jgRYOckY9zKhww1/69Om1+Rs84O06dLYWIdYeXf6LSOXZMHR5mTIBFXUdCiun5MmdS3f8b7m+eA7OwwzRZ5/PV/f9pPaOxgUKe4zSwqyOq+qBh81bs5DyBdVI2rt3nzRt3lLbwG3ZvJncf/99+v7hDsFIr9dq1VYKja+lSuWKUrfO6/Kr6sTGC2zsbxpeKPzyqCmAdWrX0uHiGC/nLcoEV9XKlbRGE1pN7OfLk0eHnxT/oeID25SYVmnyyH4fmJWwcd1Pki9fXq3BxT2jAEJj1N7oz5c3jxR5+YZ5BXsY2EdhiGdOP3vKBBMUIdVr1tYVid9/P6O9n1SdS3v27PW49PKVK5r/33//rd3R4EVj6Pbbb5fOnTpIlixZdME3bPhIj+vMARrPyH80UB9++CHB+wPB+4S8gxueP3z88DOC+OZ8Ojdkpj2adCWlLZ6P1m07yAfK7meunDkF7yQ+Sqgs/LJuvcetwDRXdjWdsUH9uvoZwNRxNGgg5p1s066jVqq1atFMYODvfVVxgv1GmMVDmQDb1+i4njJ1Oi7TgvhQQZmtPtAw15ErV05BpbRcxSryzTffCjq0nlPTiNHQRTohV9Qz16pte61Ew7PRuFEDwZTY2nUbWM8IypJyFaoIKi1dO3fU4eCD+poqZ3EOEqz0IXy8S0gvRjFiKj7er9fr1A8J28AmvwJ9cwLxccP4yJEjcuTIUb/lsvGjM8VFviD/UWb06dtfd3bUU9+JzJkz6fJg/oKYK/lNvMl9a9617m++JYUKPS9vKOU13gm8N5hd6U8wgulxpQRHAwkNBCNrVCc1BjnkVd9YhIFvNeJp2qSR7jSBYqRewybGu8cWJv+Qj+bbYU6eVgpwUyeA28RJU6RX776SLl06wexCPC/1VZj274G5ltvYE3BTriJ0DB5AI+iRhx/W5frx4yekcdMWOs9Qz4NM/GCsTxNCB3+L6kDLlj2b9mv+5XwqaiT/yRMnjZM2UZo3b17r2Lz7+K58hoatMn9ZrOjLer2Llq3beii0TXibXSjjrAiSyQ7qcXivV6hvKL4/+A5h0EmHTl309w8mOKpVixrYhG8u6lpQCsHEKL6pEMzWraRmv0ACvYOB6hIxqZf36Pm2LmdgHravMmf7zz//SLUatfR3BGnB98uUD/fcG1XHR/rND6N4cf6uu++C94Bp155S0D/799a0y5q3bKPNxKIOCNPBAwcPtRaod+PHXo8HSgwkQF3viSeekEED+skjjzyiB5w4B+H5q1emoCyJl1vdpvoR0FYsX66MlHj1FR3m4iVLfYadV7UJUXZCsMX7kybNbboN6K/sgH9Th3TW+U0dY9y4CVKuXFldB4CJ6WHDR+EyLYHaiL76UzAAEd/9w4cO63oAzAdjsIq9PWHiMNtA/RLGn69tTOMMtbp/oHIb6Q3U53L06DGprQagoK7YpFFDZZmjkPR4s5esXvOTL2zaHUoziFnHQB+of1B05FSz9rJkyeyqzohnCoPeoEQvrfrQyqvnCv2HKOPPnftDB+um7hno2fT1Pph0h8r2lDL5/r//3RhUjPq4UczDnDqO8W44BW1hvD97VR9O2zatJEeOHALFRxNVdzMSqM0Hf86+IvRb1nQMLnJ+DwKxR7hoK6Bj/68//9Tv9wNqgMprterq/lGUN97E+RyYcslX/6C3MOLqhmcQzDFYA3LLLTd7tJFwDjPdvMlY9UyjbYO+PbRtUiuTyfhuQlkAMffjLGcDvde4FoM+MagIg9HR/3JEvcfo77ELwjd1KeOOhesnT5ku1apWlooVyul2NQYyIE+9SUzLSG9hhLSbeshUv3hgUYVQYE8J5EM1qn3GpGYVRD6aOVukqthZftSHVLspZYTltn7DBu02ZOgw7aYqhfpYjXqy/CCeF18upn+Wo2NHzWqIfCJnXg9XXFe+YhUd3p9//qnP5XumYGTrtu0tf85jnFCjL/Q1ZcpXsvzZd1RjIVoa581foN2UMkF7nTh5aqQaLWFdpl5gfR4MIKqA08c93+qtj80/ww3H6sWJfO/9cZFqFJU5Hbly5Xf6uiVfLdVuhpea7mr5MWlRHayWW5Vqr0Xil1TE17O1ceMmff+fzv3c1a2oD5L2j2cRz0eLlkp/KgAAQABJREFUVm0jca1Sevi93jxvf/31l+UPzyjCeaffQO2GZ+655wtb57Fz7Phxj/SpikmkGpUVqTqiLH94JosUe9U6Vso6K29URVZfj/uE4P1BnHgujJjnr1//qHTAXX3YtL+t27YZb9z6IODr2UJegfW06TOtK/EO4rlRH3vtpjrctZ9ZH35k+THv5MeffKrdzDuJPDFy+vRpfZ0JB+6qYhyplBzaHXkKQZmDNMA/5PLlyzp+uKEMgagOKv3cqQaUPkZZgPP2NMEvyjY8axCUufDzyZyoNMJt46bNunxRilYdH84HI31Ll32t40a5ZATlJOJTI9CNU1C3vvIckZr88vfNcZN/gRgjLpTBeN+NeCuX7X7cxItvG1iWLF0uUik5TdD6GVGVZus4Je74y3fzruFbbMTkoVrTyDj53K5Z85PmjvffiJoxpN9XvLcoi/H9xjfByOAhUd8Q837by35T77DXG3Ad0oJ3GaLWa9JxIh4juEd8r1QHpnFK8Vt/+e4Pjj0/3JSraoRstPxQAxb0O4530v5smXjx3Nnfyzeat4xWj4Bf811RM+T0paizIEzVSWGCijTvPr5R9raBGrGn/arBQJZfpSTVbmpQg+WW3HZ85TvqbGCnGqLWLasRe9pNzYLRbviuwo/zm6RGZ2p3U4dz8w66qUsgUm/lv5VAtYN2IdKklP2W88mTpyKRJtOOsrcZLE/Xd/CNx/Vq4JR2cZN2Zxihfuwrz5HuTqqOjvtHHdz+mzHrQ+u27N9b0y5THSbWedXhrcMAc4gbP856PN5xU4YjDJQRaCOqgWg4jHRTr9Qe+c8i4C/f4WnAoCE630wbTg1G8Wh3wY/hbvopTL5ha8RN2WHqkPY6P643dYyjR4+a4CLx7cYzaeJ000Y077i5BoEVL1Fa/9Q6jDpslBXo20DYFy9etOKz7wTqlzDta3P/Tj5u4kT8pr0ajLq/r3w39afZH31iv2Vr303Z56bPBfUx3OO2bdutsE2ZgPz2J8gflAN4/yGm/mDanG7qjOaZOnTosBWV6SdAfkFiEo6/Z9Pb+2BFmoA7vvLcJAHfdeSJGjConSZNmarbQ+a8ty36YNB/Y/oG4UcNOtHhqIWqXbeJvfUVoS2J9KBcgBiOpl/H5KE/9nhO8L6Z9xvhoD1hDxdudnE+B6ZcCtQ/aA/D7X6gPFEKBavegucd6VZmTH0Gb9q6+Faa/nD0kaCujPotwjD3Yy9n3bzXpl8O/X8mbLTR8O1Hukw93ZSzJpE4h5+93giWcFOz2LS32JSRJvykuE12C2x70wxh5B9GNNkXvXk6f36tVXZOm6qrZggY0fbeqlbRZpUwqgjH3uS80uRhlBtEVegtDTYWePG2XgX8YcSVevD1zAMc79jxqzWKuke3LnCKJhgljxHvC9So1W5dOmn7tku+WqZHUZsFkjBKE4LV5jHrAumGwNSDXcr7sTN4z913Sxtl6gijtDBt9O+//5E///pTX/67WmTaLkWLFLEOn3vuWb2PEXQFnnnack8OOxfVjAMIFsd2IxiFvuGXNTqPsX6F+WEk4kcfzvC6IBXyCiNy8NzYNfL169UVaH5jIqVKltDeMXMI00sxM+ToseP6uYtJOHa/5vmbp56/N3t0E4zyVRVePRIQMwIosSOgKp/6wlo1b5h6wDv467ZN0QIsXryo5Vbg2ahFN1Xl0XLDTskSUaO5sI/R1hCM6jSCfKtb+3U92hN2y429TdgWx0weCEYYYFaN+sDKXXel025YFBJl6Ek1ogSiOi30Fot4GYFfHKsPqR5d+2CGB/UpzNKIiEitRgM9L5hdhB8EZg8gwUjf1q1bddgYvYpprHaxm7OwuyfGvr9vjpv8w8goiC/GsbknN/Fmy/qYDvpVNXrw5ptvtqLBM2qfQmud4I5FAOZ0zOKHcMR7hTrK5uuzJlEfMO+GuQjvX9M3Gsuz6tuCmXtLVNmLNQQwyh02smu9VkO/tyiL8VOVYtm3b7+uA/x+5ncdzJmz56x33ITrZmueh2zZsnq8S0jHL2r2F0YGIn0U7wTO/fGHzJkzN9rJKmoUrdOWrptyFQtQQuzfDIxkr/16LYFJAjeCkWapb0odzWtE6gjthvMQ1CMhd90VNUJeH1z/B3vVGTJksJxqqFkCMAX1q5phZ2xZp00bNbrwrHr2Upp8uzLKTOPFfy9a780jjzysMexQeYh33q24eQdjUpfwFy/s3mPULczEPJ4juxQvVlSyqvK+dcvm/i7T5/C8tFAzBF5+qbC0VLM7IW7SnhzLD9Vxre/f/EN5Wa/OjbqYcTdbMxIfx3hOUHdxmm9x48eElzlTJlm27Gs9ShSz5HPnyqVn8pnzZuumXmn8cuubANrMsHRQsuSrVhsOs6IwixLfdHsfhO9Qos7EpOyw1/lNuJjlj9G8RrBwN2bB71YjurEgcmzaiGakNuou+w/sN0FLxuvrXe7dt0/XPawT13fc9ks4r8NxbOIMpbq/m7LPTZ8L6ob4XqBcNoJ8MKYZjZu3LdalQn8TyhL0TRgTUKVLldTe3dYZET/KJF/iNpxAz6av8EPNHRZHIBkzPqq3W7duF8wM8SXohzlw8Dc9wt7eN4gZFvhBTL3fX5s4h5oN662vCG1JtL39iT/2GR58UPcRNW/aRGDO3gisLfiyymH8eNsmRv/gps2bpYHqM4Mcuj572PSPekujeT8b1a9nrRmGPpKPZ8+M5t1ezprr/LWJ9uzeq8NAXqJOBUHfCqzVYCaEP8F3HnUuIzDXlibNm7JdfUecEpsy0hlGqB9HGIChntC4pA829OyNOhNWlsyZ1BS6teZQbx9UL6tdTMGMDkH7R8LuB/tKQ2Y5lSur7LaqDhtjSsc64WXHXIfOHphSwjWm89CLdz0dHA0INFZRQC7/eoW89WZ3yyuOu6upgVCG2OXqlSiTK8btdh/ToXAeHQ+YhoapS4HEXqClSxvVqam0doEuS3Lns6tOGsj+/TcqaIFuAotbNWpYX//QgPt4zhy9bkTzFq1l7Zrvo11uOp3NM2c8ODszjLu/LTqpYP4Lz358CireeP4w1Tlb1qxaCdNVKc4osSewR02jRYXT3uHrK7R0adNap7AGCiRS/dnlpptusg4PHDio9x9+6EaHEhweun584MABq7yBMsop9rBwDh9xIybdTj+PKlMDkCNHjuopxtOmTBQ1G0c/j3CHeQuYJnup8IvW+hHBSJ959qtUq4loPcRUMj0cE+nA3zfHbf75Yxyb23ITr1FWoKFlF2+dmvbz3BfJ7jC9AyaZM2VUiyB/qvGgYQp7y06BsgKdejC7o0bpysD+feXnX9bpqc9mAIIaeaQ7p9A4jS/B9wQC27reBCaj3DSavV2bEtzUKCyv+fm8UhA7v+9uytUzal0siPPdu/++e13jfEyZhlyl1hOAQtperp+4bv4Ji/5B1GhZvb355hvfFe2g/hk/5hjfMDwHxjQh3M13zQz4MH5TwhYdExCYQnTKgYNR32anu69jN++geXYMc19huXEfM2qELkewxgZ+yFeUP6jT+hI8S6h3woTRyBHvWgpMN2lPbuUHTE54G3Diix3c71Im9uwC5ca1yGt2J1d+zAXt2rTWbUEMHsAPaYLJ2m5dOnt0RrmpV5owufVNYJ36FqPtDQURTHZAYBoHskgNKIiJsiImZYezDo747lPtT7ukSxfVdjDt89i0EX+7Xp7BrLQxLW2P4+DBQ16VFW77Jexhmf3YxBlKdX83Zd/9apBYoD4XDGLw1o+FuqQxZ26YObeFX3xBv/sYXAhlBUxAYXCaqXu4rTPe6WPAronPbTiBnk0TXqhuN2zcqPrevrHWER2qTP1Avli4SG+hiCilzNBDMWAX08djlBv2c2bfTdvrluuDw5x9Rc62pAnTvvXH3vQb3nvvPfZLxP598DgR4CAh+wexJi7qrlDifDj7I0GbRFl90CmcoUyyo7+kXdvW0VJseJtBJNE82Bzs5ayb99rU8R55+IbSGMFlfDRKuWULOtquGYRoP5H1sSyyZ2+UAsTuHpsy0n59UthPETMroFVzzixA5sDGLzoI7IKX1YwuhjtmSkAefPABvfX2DxXAH1Z94+2UTzdUQl8oVFDGjB7p04+3Ey++WEh/dNS0Jj2jAn7Kli2tvWL0Hha9RAE54t0hyk7p42p0xx1SonQ5q8HoLUyn28pV32lFBSq1tWvVlEeVUuTC+Quipp05vaaYYygekGfoGPIm6Jj96eefpVDBgjp/MLMFWlHTaMSIc9ihxQLW6ERC5cLZ0WCeMfPMmXiQr075W83CsMu/F/+1HyqbeO3lsErT6JHDVGf008rOeFoZPGSYzFOKhriIef6WL/9aLQIX9W6UV8o5SuwJZM6cSSsdMUIaWvf4FKOUwOwa+ygrfMghdreYxptRjbBBIwSjyTCq14hZPMo8zxj9U7TIy3qU93c//KBsnk7U6wV9v2qFpTQJRvpyZM8uahqsbNrws4SH3VCyIJ3h4VGjHEyaE3Pr75vjNv/8MXZTMXLev9t4ndfx2B0B2Ct3Cuoj2bJFKcVrv15TjZKv6fRiHVdQNkxhT/UXNathmSqL0WgxNu7VlG39jcEMTYyIxppUq9Ro+7ZqLRt/ctHxDblwIaqTGteYRtDsWdPFrEFgD8uMnre7cf8GAdgwPnRgzw0HP3tuylUzeEKZDfAY6bhtR9RsNz/BW6cyXa/74rl72NaY2q8U2BDjZkYA/vPP/6xrzY6zXo1vAdzKqDUXjPyjRhNCYtvgNeEkxS0GRKVVHdDTp0yKlnxvyp9onmwObt7BzJnjry6BxjJGF2LNv5/WrhXYUO7bb4DcrdagwDoW3uQDtR4HOjHnffaJR/3WTdq9hUe3uBFAZ9GwoYOld6+esmHjJr0uGezOY9bU4IH94xY4r45GYOGXUQME0Dls2n5YLxCjcDHiuYsapON2BlF8lh3REqocYtNGfOB6PwhGgTdu2CBasFhrwylx7ZeITZyhVPd3U/Zh0CoGh/rrc0HdEN9qp6AueZufwafwj2excqUKul6ImV1QfKBcMBLbOqO53mzjKxwTXqhu9+zZZ82CRhoxuOj09f4Qc1zi1eLRkm/a28e85KPx7KbtZdrWzr4io2wwYcV0mzlzJn3Jjh071Xq1lfQ+/mEQRKgL1gJZu/ZnK5nIk/Pnz+tjKC+dfb3Go1FSnFB9vSZ/zDl/Wzfv9UPXZx07+zeMdQp/4aMP0SmwjoIZck6JTRnpDCPUj9WAKs9OnFBPcKD0hV+favPXX39bXnPnzi3r1m2Q4yduFPTKzqCehoMFKe3y1dLl1iE6D5X9YGuRaOtEIu6gMxPmHqDBXbpsudaOY+oWZJeqEEGgYIB5CGjN/1Ad3dA0xkSMGYLWyhQUFB/oVN8Uh8URTcdoTNIQin4xBQwLmX4yZ65H8q6qBjoWGOvStYeqNNymF8RTtgHl83kLPPzhAEoGKLecI6hwDsoQ/PDMXVYj04zAhJRd0t9/vy6E8Qwb2bxli9nVDRFUjsuULqkbleh0wMKKq9essfwE2jHlwjmH6Qbz/KFSjncFs4Cc2v1AYfO8JwHT+YdORyNY6ByKxyFDhxunWG2fUIvxQharZ8oueMYgjytFbmzFjBJbpZSbRtAIxvOKijUW9MaoBSjnMOIGblgYblD/d7R3jL4NZvpy5nxSx7NbvQtQ1pkf3gNlU9skOdG3/r45bvgEYuzrBv2Vy27i9RUu3QMTwKhJmIUwgroJzPdgGr0bwQAMvE9L1MKdXy7+Spleq2ZNM4bZS3xHmjd7Q/tBZ/MvPpTsiOte5Rei1vHSW/xDp7P9+Ek18AECMwLmPcIWo3wwcIISfwTclKtPKhN9qEe83fsdbaozUs1mRR0NAxLciqn7Tp0+w7pE2VmXmWoUGup9ZhSZMQPoNAGKi5Yt+9oyNYrjlaqjGmL/rpgGNBZhTmlSoEAB2bNnr5qtfMV6b1IrM1vLV6yQ3xzmGwOxcfMOxqQu4a/8x3OA0bf4tqAdAeXEtKlRChdj/sCZXnQUDH13uPR6q4fAzK5d3KTd7p/78UMAdTEMsIIJ4yIvvyRjx4zS3wTMjKbELwHUfdVaPQJzHR/OnCbj3h9t/d4dMlBH5sv0h2lvGZN78ByfZYfzTpFWN21EZ38K+gIwA2r9+g1y+x23W2UazESjTEO54ZS49kvEJs5Qqvu7Kfvc9Lmgbog6or0TE3VI1CXdCAYV4ltsTJbbO9NjWmf0FV98hePtffAVZ2K4Y4bLxx/O0HUwDDie89EsGXRd+fvr9s362PkNRDpRZ0Z/ySL1bcU7aATldNXqNfX31k3by95XhH5KI/a2pHGLyRZmzmHqa/LUaXohd8yUhEKkW/c3YxJMovhFHvTr21vzXfnNcp0HuJc2rVvqfV/KeQzqhnzxxSKPdKPvpV6DxnrmsceJ6wdu3uvsObJp384+PHwnAsk3364SzMg2gm8H3t+cymSwU2JTRjrDCPXj+B3GGwJ3mz9/Pp2KfgMGSdUqlbRd6IYN6mlbjY0aN5UGyi4ZXsBJk6fogsY5ehErwqODP3PmzLJIdchCI4cXIJQE5h5QmOAjZdeOm0JuwqTJWpOODu9R742JcdKNuasBA4fIazWqqcbwIZ/mHwIFXlCtYwFb6piiBdNYbjtjAoWbGOfffutNwRon3Xr0VJr0LVL05ZflwsUL8tHHc/QI1xbNm8rdyq7zswWe0es49OjZS81uOKKPL1+6rBt/MLvQoH5dD7ML9ntp37a14Blsrmz+ws7kQWUqwGmOy9hE7NS5mzYdhhGPdpMhGEWBzqy5n81Ttknz6OnAHykTVHhe0MHhRhAGRupiJgYK3OJFi1haZ/P8QQnm6wPgJg76iSIAe8F459Qi09K96xHNGaa2MEIRZVhcBIoqjNaZNHmqshcVqTuh0HiFSYD69ep4jH6MaTyvFC+mG75t23cSPLcYwT3/i4WyV43CQEMNcv7CeWnTroOuADVTJiTQAfbBxKhOj6dVWY2O1GCnr3HTFtKhfVt59OGH5etvvtHvRb93QqdM9/fNcZN/aLz4Y+wtXwOVy27i9dYw9RYX3bwTgJkI2HTHOzF9xkztCd8GtwJTUP0HRo2OK1/uxuw2dDSjYotvAr5FsIGL992X4JuA7wVsbd9/3/2qjMij3xGU72gUQfA8VKtaWX+LLiizQPnz5tVKebUwnO6cwTtMiR8CbspVrGk1cfxYqV23gRQpVsKKGDaoYerBjeTOlVPXH6ZMnS5pVXhQgGD0PEajDXinjxVE6tSpdQNQLZ5puZkdzKJo1KSZNk+BNSlQz0NjvKSyt2tk166oGSWxmeFlwkiq24bqfYadeOQT2iEwtQjGeD+XLIo+mMXffbp5B93WJQKV/+i06KHMyWLb++2eggFRqE9Cnn8u+jobaES3bNNed2TCNJgxbwv/eK7cpB1+KfFLYN78L/TaZFAgYZ2wjRs36/oZZnlT4pcAOpJRdpYtUypawMVVXRmySA3cgRkep5gOqPGqbnz58iVBOR6fZYczPrdtRG/9KR07tBW1WLdqr7SV8mXL6vUQ3x0eZSHC2yz7+OiXiGmc5huakHX/Vd9/b5lMNLzxnUa9KVDdyU2fC74f8+YvkHoNm+hBX5cuXVKz1CeYqAJuC6i6IOpzeE6xpoqZMYkLY1pn9BVZfIXj7X3A4LdQkiNHj+r33XRab1ezWjEbyphn9pVWmEDGLOemLVpJ1cqVtfIJZhYx+Cizuh6m+d20iU1fkVq8WcqXK+u1r8hXGvy5jx4xTDDYtr56zoxg5n5SENRR86m2CQSDiDGAooHq5/AnqNvABP/MD2dLeKpwQd0IfSRq8XldZzOKM2cYbuo0qAtBeT1pyjR9eR7VH/edKifc1NHxLanf6A3dT3NRzXIfPWasfn/RL+hNYlpGegsjlN2SnRmo55UmDQuTYMFJjALE2gBoiGM68/ARo3RHMzIEjfhh7w7WNtXtGTThg/eVzdVuuhBCwY7pjlgcxZeEOcyL+PIHd6df57G/a+3n0ImMBiE6E+wLvmAEHDoJUZFA5xUEpiAWqA7EQGJfuwQmW9DxjmmrMPMCDqOU/dn2HbtYozft/k3YqozVYj9XtUplbYJilGrEwmxQUu7cxsdy0oRxMmjwUD1a3NgXR2dP/3599KLFAIDCbd5nn0pXpY0GQ/uCR+CKj5UvwbN2RjX80Lm04ptvtXJhxLChWoFhrnn1leJW/qDRi/h7dO+iF7Y0fkaPGi5YG6Nnr6hOWSx2iQJ5vloc20iYzRSOPc/Mecyswfonvd7uK3eOvMNSVuD5Q5woTM0ibeYabmNOAJWbqZMmyFtv97GUTnjnBg3oZ/E1+WO29ljCJOrF83YO/hDOLTffohRPC/VHE2E3btRAL5LuEY7teYB7uDLt5Jyybn9mMFpv5vQp+vkwC0miwjVk0AD9gUYYUE7i+cX5hkpZDIEfmIkwleVgpm+GGg36lnp+ja19/a6oMhELjIeKBPrmBOLjhjHu1Z53vsplu59A8ZrnzWwNT+excef2BgHUUTCiB4oqCN4JfLtRtroVmH+EsgINRPvaAW1UuY1ZS+bbg4Zwzx7d9Dto8saez4hv7JjR0qRpc21aCsdozGIaOBq2EFynnwfVeYlOy/ETohSOmNHRR3VmUuJGwJ4fbspVxIbp4D+t/k5Wr/5JsID6s2oUPxQL/hpCzvK8m1pvCqN5zYAIjJodOnhANNvqJZX9ZQzKcJr866iUwDvUYtodOnXVAFCv7qcUHaZshyMGdqDczaWew5QmeMdnz5ouw1Tbo2v3qPcEdXesMWRm0Bgm5t30dxzoHXRTl0D4vsp/Ezc6Mz/6cIZ0VwNzjPk41BtQf8esbYg9vfvVDAwoLCDGVr8+UP/QdsBafIHSbvwnh63btp39vfd1304Tlt78GT/2PIG/gWoWK9oj/foPsi6DQrxd21b62Pg3W8uT2jH1Srsb930TwAxHSBHVfnYKRr5iwXkM/urTp5f17hju6NRGWYpyGGUpFBpuyg5zvTM+HDufLdPpZq5x00b01p+Cbz4GyMEufOtl7XXUGME8sF9fPZvamZaY9EuYtDm3buM01+EbmlB1f/OeLFv2tZ5paL9/lPXoeA5U9rnpc8Hggg/GvqefEQyYhHRo10Z2/LrTw2qIPX77Pr79SAvqbpUdZvzc1BkRlvOZMuEb7rENx/lsensfYmKix6QrmNs9e/bq4DNlzqS3MJ1klHvawce/iuXLaUsDU6dOt/rpCr/4ggxXptsNR/28BGiz2/uK0E+HOhb6p2CRwYRjtvakOPPQyf6BB9LLqm+WCcwq7d69Rx57LIsaaKwGJj4eeNa3ic9sPeKN6qaw0mY/F1/727fvkKpVowZOYaAwBOVoIOnbu5fu61j05RI1cGyW9o7BnG92j6rXer+fwG0iXIdZddgahQX6o01/qkmXt/AxMx4zK2CxBYJ2Xm81YNqsM2OuMVu3ZaSJM6ltw9T08Ug3icbozQzX7W+58R9MP/8oUzr4GPmTy5cv69NovNnF2GG2L/yC89BsohCHXWHMvDiHNQVU5dw8CPYwQn0fWYqHHA1GM5U/NmlGw/QPxeFuVdFyNnJjGh7M2kSovLDbto9pGAnh382zhXSADUaQp1Vrgvh7LzDVDzNTYJ8YCw+75Wjy8C7FHsyezJVPm//CCCkjbvLnzz//Uh0YEfpDZq6LyRbvAu7hFtVJZd4FvENYvwQaaDOCPiZhplS/bp4tTOmEqTDM0IlvwTNlyrX4DhvphvLK3knljCPQsxjM9OF7gJkAKMtM5cyZvmAc+8vzmH5z3PAJxNh5j27KZTfxOsNN6cf+8r1shcp6pDIaFnguYdM/GO87ymmU3caMj5s8wTuCbxRGgPsSPA+oX2Ah9YiIZDc519dtu3L3l++uAnB48lWuIm+nqNm1UHLZBwxAKYtGEdYDislMBpTdsIedNetj1nfenhSMNKtRs7Ye9IOFOfGc5M5XQNDIQ+cnroegwWwX1FGeLfiiGilcQgaozqzkKm7y/fyFC3L50mVtCiKuHNy8g27qEm7Kf6T70n+XYlSO+Ls/N2n3d32onHOT56GSVjwLsBiANm1C1n9C5f7jMx3BzHeUl1dUnQDtLbvEZ9lhDxf7buqMvvpToOi+5ZabvSopnPGY9z6u/RIxiRNpiK+6f3zku2Hgq+7kpk2Pe8I6ILerb21c+ncQjlNiU2d0hoHj+ArH1/vgLc5guMVHnvtLF55lrPPiKx/xvARqs5v+yvhq22KgLGbtoLPe9FfB1GsTZaEAAw/jau3BHw8354KZJ+CNQRcxZRnovcZ9gel5tfZvTNpjuA7v0pUrl9X6w3fi0JXEtIx0FWgie0pWMysyZskeK5zOhQ9RmXv62UKxCosX+ScAe36Bpsn5DyFxzsb22Yprap3PJsJLrLQgbthnxHopKNBbNH8DTlZ6MMoeo4coMSOQmPkZs5QmL9+wZdm5Y9TIsMS+s8xZA4/+SOw0xiZ+b+VXbMJJrtdkzZE8Rptj1M+Czz9NrtkU5/uKzzIe7xQG20CBgBH7GC2ZWZkt/WXdOoGZSSgTjKIivuJFnPi2oyGL8J2CwRROwTVYw0KbCFIzSiFID2YaeFsk0Hl9cjiOL/7JgYW/e8DMsO9Wfu3PS5I5V75iFW0uNskk2E9CmyrTnZiVRwlMgO96YEah4gMdse/0eTteksN8jxeMfgMpXqyoTJ3s3uSV38Di4SRmL2A2Q3IT1Nn+/udvvVYmzFBjxhRmaWM9TSi6X37pRX3LcX3mg9H2jmuaklteOu9n04afgzIozhlPsI6TlbICL1psBXbLMIXdSFzCMmFwm3wIJPbzAPMgD2Z4QANNzLQULPSSHhmIaWxm/ZHETE9yeMLILznkYszvwf7N4TMQc35J9Yrs2bLJfffdq5PPfE+quRizdAcjnyeoNSvGvD9OfvhxtSz5apk2d9pOrR3UumVzK3HxGS/W7OrYuataGPqQXgcLdRKMQIP4igfT6nv36mmZkPTlz0pwMttJafebzLIvVrez6IuotT1idTEvSrIE+K4n2ayLU8KZ73HClyQvxqzo5CrNm74h6dKmUybDv9BromTI8KDAjHiHdm3l3ntDt93C9zC5PpFR9xWmphBFGvMu/m41qZmB8ncvPEcCvggEc4qZrzjpnjII8NlKGflsv0vmuZ1GytlnvqecvLbfKfPdTiPl7DPfU05emztlnhsSKWvLfE9Z+W3ulvluSKScLfM89PKaeRJ6eZIQKQp3o6hIiIQwDhIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggZRJIDxl3jbvmgRIgARIgARIgARIgARIgASCS2DpsuWyffsOHcnOXbtl7mfzBAuIJoasXfuz/Lh6TWJEzTjjgcDiJV/JsmXu1/hI7OctHm45yQRx+PAR+XzeApkx80PB4reUlEXgqirTYef/r7/+Slk3zrslgWRKIKbf22SKIVFvi8qKRMXPyEmABEiABEiABEiABEiABJIjgfUbNkqzFq0lze1p9O1999330rlrd7l86VKcb3fDxo2CX0zkqupErV23gRw9eiwml9GvSwJdu/fUi8lj0U/nb9z4uC0Ui87Qlq3bSQe1foxbic/nzW2cMfV37o8/5JtvVwq2SVWwnk+pshX02j5Lli6Ta5GRSfVWmO4YEkAZ3LxlG8mV9xkp9mopyZ2vgOQv8LxaT2ppDEOidxIggVAhEJvvrZu0I1wsYn7gwEE33lO8n4gUT4AASIAESIAESIAESIAESIAESCAeCUSqDsvefftJxQrlJXOmTPEYclRQAwcN1Tufz/3EddgvFHpecuZ8Soa8O0zGjB7p+jp6dEfg2rWoGTMd2rWJdsHT+fNHc4uJQ6pUqWTOR7MkInXqmFwW8n5//XWnNGrSTGbPmi4vvlAo5NPrLYHr1m2Q8+fPy9w5H8mzBZ7x5oVuyZDA1m3bpUq1mvrOKleqKEVeLiy/7twln30+X1q0aiv93ukt9erUToZ3zlsigeRNIFjf20tqoErDxk2lXdvW0rF92+QNMR7uLgIVaa5bEQ8kGQQJkAAJkAAJkAAJkAAJkAAJKAJ79u7V5p+avdHEJ49gtsN8hV2qZAkZNnykDBrQT26//XafaeOJ2BFIkyaNtPeirPAVmq98svs3fgoWfM7u7LFv/Hg4xuLAWzje3GIRtMRXOLGJO5jXnDp9WgefSykCfUlSufekkk5fnBPSve87/XV0E8ePk5IlXtH7lSpWkGZNm0jhl4vL4CHDpGaN6nLTTTfFKlnMi1hh40UkECcC5r3z9711E4EJx41f4yc215hrk+M2HEAoJEACJEACJEACJEACJEACJEAC8UNg9eqfdEDPPVsgWoB79u6TOvUaSqbHckilqjVk9kfRZ0fMnDVbqlavqc0JvdGspaxSJqQgZ8+elVdKlhGYmMIP+yNHj9Hn/vvvPxk+crQULV5Ch12hUlVtR1+fvP6v0PNRHd6/rFtvd+Z+AhGYNHmqlK1QWdb+/IvOXzwDyEOTv0iG8QPzSKXKlNd5iXVO2nfsIj179fZIKZ6T6q+9buX3h7M/9jiPA4wAf+31uvpZwvOGcI0gHTr+Vd9LvQaNrXCw3gVM3OAZQhqxXfPTWnOZ3iLNTVu00uHiWcV6DXaB2SrMLpr54WzrmcRzf/C337S398aMlbbtO+l9bJGOU6eiOv7t4YTyPriO+yDKxFeZchX1+4z0+spDnPP1buMcBAze6tVHmxOCSaFR6v2ev+ALzcesiVCrdj3rvY+6SrR5ETA8fvy4cdLPVVzyyARkz2uUL/0HDJJ///1Xr8+BZwP5bBeMIMZzjvIoOcqZM2d0+VujejVLUWHu856775bBA/tL+vvvk42bNhvnoOSFt/fOipA7QSGAtUm6v/mW9X62atPe4507fuKENtn3ZK58gh/KQbhR4p9AH6UwxDvgXCeoU5du+nuGGE+f/l06dOqq8wv5gW/Qlq3brMT4Kqud31u34fj6tq9S31h8IyCTp0zT5TlMQkF+/mWd/kbjW1u4SHHpP3CwXLx4UZ9Lyf/COasiJWc/750ESIAESIAESIAESIAESCC+Caz95Re55557JH36+6MFjY7G1MqcD8wFXb58Wd58620PpcLESVOkV+++ki5dOu3nyJEjUr9hE9mkOr5uufVWqVq5kg4b4WM/X548Oo5+/QcJOoDz58+nTQxgjYqOao0D0yCGp8dz5NB+qazQGBL83xmlbMKC6+jAypMnt9SpXUv2KuUVjs3C68ZPm3YdJVu2rNKqRTMJUynFc3DkyFErzWNVJzmek4iICP2c4JmCMsO5PgbMTmTPmlUa1K8re/bs1WaX0OEGuXDhQlT8bdpJhgwPSuuWzXVHTsNGb0jd+o0lV66cOux9yj+eW5g7gkBRhmfy8KHD+vydd94pb/d5R6ZMna7P49+hw4f1gvLjxk2QcuXKyivFi8kPP65WM3tGaT958+aRYkVf1vvY4llOk+Y2fZxU/pUtU0ry5M6lk1ulSmWppMy+QXzlob93G9ehPGjZuq3Mmv2RFC3ykhqZX00+mTNX+g0Y/H/2zgRepvKN44+LkrqptMhOSGhB9ZdUlhCSkLWyRinJrkVJopA1+xZRKS2kLEl7kl1SIVtl35ekLOf//N5zz8yZuXPnzr133Dt35vd8PjNzznve8y7f55zznnmf931eoyfc05ANqsc9e/aYbefr+PG/TZz/NA1IOHSEdND5Bl1v0jw7PfmEXKvPkIna2fZI+w4SFxcnJUuWlKnTpvt0ruEcXOcOG6QTTfLbho2mOjWqVwtYrfvq1pEvF38mFf53qzkeLl2Ekk7AAjEwLATQYf2grvv08dxPpb7Ooql1Tw358quv5d56DeXw4SOCNQnuva+BuWd6du8qHR5tZ4xUTZo9ZI6FpRBMxEMAzxfcE2vX/uQJO3TosHHFVrpUKcO8SbMHZeFni6RB/Xry8EPNjas2GFj37dtnzknqWe1ub6HXUNNJqm3Pnz+fwF0cpHSp60x7hzC0xY2bPigYbIIZr9XvrmaM3X379TdxY/pLZ1aEJDt27AgpXnpEOnr0aHpkwzxikACvrRhUejpVmddWOoGOoGyo8whSRjoWhXpPR9gRlBX1HkHKSMeiBNN73XoNrIdbtvEpzdhxE6yCRYpb3Xs+4wnX0XNWzVr3WteVucnS0YGWjtg1cXr0etYTB/lUuquq9UDjZp6wBg80sfBxy4RJUywdge0JOnjwkElLO5E9Ydj43213WDpq0CeMO6ERCKZzHc1peGtnluX/2bJ1q8lgwKuDTJxPPp3nyfDDj2abMDUg+cTRDjFPHGxA3841tXfvXnNOu8ceN9cNjmuHitW0+cPmWjp1+rTlXG/TZ7yNw0a+/PJrc947M98z+zrLwuy/MnBwQgzLmjZ9hgkbNHiIJ8wp44qVK01YtRq1LHz+/vuE2ce127FTZ3MermlI7br3m/2//vrL7OML1zXuATWSmDA1Xph9/EayBNP766PHmjrobAJPFRw9u3UYyr095+NPTFrQgSM6KtvoFNwOHDxogsveXMHq9cxzThTz65yrM1fMfrh0VLlqdfPMOHz4sCe/ESNHmXL+tmGD9f2SH8z2Z4s+9xx/rncfU2btgPOEZcaNpPQ+bvxEU2eHNeqGew6M3B+n/uHSRSjpZEbOkVTmpHSOMuoMIqP3NWt/8hT5hx+WmjA8Z9VAZ7Znvms/XxFJZ9dYI0eNsbQT3XMON1JGICmdHDt2zPB2t19OW6Xrx1hqiDDsl6+w2y3k6rSB8+YvMIUI9KzGAXd7m5J0grXtaPfwHNcZZyZvfKmh14Sp0cIThjTU8O/Zj9WNOP8pMzFtuWHlSYAESIAESIAESIAESIAESCCNBDACEzMjAkmrFg95gnPkyCEP6uh6jFj/668dAvc7EIyoX/fzz+azbft2M5MCsyEwwi8pade2tcBnOtzArF//i2zYYKe1a/dun1NyX57buJPyCeRO2Aicf/754v/x92ZQpXJlT37/Sxh9vWbNWk8YNhw/+D6BCTvOddKmZQvP+pMY5f7OW2/KL+tWSzZdkNuRatWqOJtyy632AtDbdUaEW6pV9cYpfs015tDtrgWvr0kIO3LkqPydMBujQP78snnLZnON/rx+vRQqVMict+n33z1Jly17k+TLl8+z7yyijZkBsSBuHTo6C3Zv//LrrwZLE3Uv5MjVefKYUbjOfii/4dLR8ePHZcvWbdKsaWPJlSuXJ2vMsNi+ZaNcW6KE3Kqu7jDLa8HCz8xxzBD6UN1WPdCwfqrXa/BkFKEbxxNmGMXHx3tKiJlvN5S9xeeDGSfh0kVK0vEUihthJbBq1Wq59ZabfWYMYW0D3AuYJXe1zk6DjBozzsyW3L17j5TVGWRPPtFB3we8909YCxXDiWHdLcxWmD37Y7MmElDMm7/QvD9dV/JagUs2sMcsPrgfhPunw0cOG2L71JWbW9zPanc4tlOSTihtuzv9AgXym13MisQsWDXASJ3ataRN65buaDG5nQ0vNRQSIAESIAESIAESIAESIAESIIHwEDiqfzhhiAgkmPrvFnT6QuA25/ffN5tt+IQPJHvVdQE6LwOJjmxWX9rPJzJEnDnta+DIqa6kHHc+gdJhWOoJYIHtyRPHJZtAzpwXeOJckss2aunoSU8YNoItzLtly1YT1+no8DnRb+cSVyfzhTltN0uW+OaFa8IRx7ACt1KOZHX1GWzTzmsIOlbcLsZMoH5t3bpdri9TxuxecfnlTrD5dTrs/OvqEymKdtw6DOXehksQ3N8wdrmlUOGC7t1kt8OlI8eoVahQ0vnDMAbjis4GMW5MdNS5eb7cV/feZMuZWSMULFDAFH3Xzl2mIxM7RYsWkZEjhprwvbruCPzOw0VbuHSRknRMIfgVdgLo7IbhLim57NJL5Y3JE6TfywOMC0bEg6ui7t26yJ13VErqNIangQBc72FNn19++VUN5gUF70G9n33apIjBHaNGj5Whw0cmm4P7We0fOSXphNK2u9OvWqWyPN2zu+gMPYHLRkjNmtXlmV49pEjhwmY/Vr+yxWrFWW8SIAESIAESIAESIAESIAESOBcEsLiqui4ImDRmXbhHKatLHxMPnZTqVsdsvzV9qpQpXTrR+blyXZwoDAEHDx0SLMSNkexDBw+U664rKRdfHC81at2bqOPz0OHDMf8nOCDETBToGCl26chd98yF9KhCnqttYxlG17dt3SpRlplt3YlEFThHAVdfbY+6DnZvQ6/obMPsBPfsmF07fWdHoYgnTvguwHry35OekodLR861tUM75YPJfffda9ZKwVoVX3/9rTG4lNNnUbRK0aKFTdWwWH2ZMvZzGqOv6yUYaJxZJoULF5Jw6SJc6USrTtKjXhitjxmQwQSdz1Uq32UGHnz97bcyZuwEXf+njXzz1edSqGDSRr9gafJY0gQqVaqoax1dKIs+X2xmVCBmnTq1zAlYTwSGikYPNJAHmzWVgmrMOKHvWOpWM+kEAxwJVzoBkjZBHR5rL4/ozFis8zNfZ6iNnzBJflq7TpYu+SapU2IiPA5WIgoJkAAJkAAJkAAJkAAJkAAJkEB4CFx51VWy228BXCdl9ZXsbApc8n7y6XyzX0g7tkqpkQGyUheNxCh057Nx0ybzZ9wcTPjCLAtHfktwH4U/5JV1YV4s7H1IDRh//PGnE8Xzu1M7Hi+/PLdnnxuZjwCMUZA5c+b6FH7goCHSolVbc135HAjjDjplYVhbsWKlXBR/kecahXuNzz7/XI4cORJybo6XByyKGu0Syr1dUjtDIV9oJ7gjcMUErm7Jny+vfPf9EneQLF++0rMfLh3h+VOwYAGZO/cTswCsk8Gn8+ZLw0ZNxZnhg05cuLfCs+2jOR9LkyaNzOLbTvxo+y1XtqwZMT9+4mQPA6eOcNc0cdIUswuDc7h0Ea50nHLyN+UEypcvJ7q+jpkF6ZyNewD3Au4JbGPxbQxUwP3wSJvW8srLL5momDVFCT8BzF5q1qSxzPl4rnFFV/G2CpI3wTCMzn9IR3UFhYEcuIdW+7lbDKVE4UrHae8OHjjoyfbHZctl/oKFklVnqKGMzz7dU9q2aSVw35mSttSTYBRtqME+axRVh1UhARIgARIgARIgARIgARIggYwlUOyaojLjrXcSjZBGqTDS7+TJf6VUqeuMAeLrb76VLk89aUZSw0UUfL0jzol//pFyN90kGzZuFF2Q0fgxxghBSAVd5wB+sYeNeF3u1jUJritpd16PnzjJzKQ4deqUDB/5uonr/tLFeo2LlqJFiriDuR0mAnCvpQtjJkqtXLmyxnd5ogOpDEBnDHykvznjLYnLGmeuB3R6vDH1TWndqsU57yju2qWT6GLZ8njHTlK3Th1Bh/rgIcNMberWqR1yrcqULmXijpswUU6d+k9q3VNTLnC5pAo5oUwQMZR7u2b1u+X1gmOkc9ce0rlTR2NU1MXQExkd4Td/7U9vmHi1ataQ1WvXynuz3vehEC4dwYVNp6e6SvsOT+jaGfXNmji6oK3pjC1SpLAnT7iCgusjSEquAU8CmWgDrtJeeP4500l9b70Gxi8+nsFw5ffe+x+YEdLodLxSZ9hBwqWLcKWTiVBHVFFbtXhYXQ59LK1aPyKPtm9n1kmYoG3ulq3bZPTrI2Tf/n3y5FNdBOtYPNqurXHlN1afbZDy2gZQzg2BunXryKQpbxg9vDbIfgYhJ2fWU/8BA6VJ4wdk67btkpSLzWAlC1c6cO8Ht2BY06fEtcWlms7CgSHkJXUbhvYcz829+/bLbB2EgHjuGbjByhetx+gGKlo1y3qRAAmQAAmQAAmQAAmQAAlkCAG4gYCxYpMuJOyMgnfWApgyabzp6D1w4IBxX4BRdE92fNyUE3Fe6d/PrHcx6/0PZdx4u6OjsXYEvvjCc566NGxQX75SI8dwNVbs0Rkcrw54WcaMGmHSRWcJBD6PZ+soZ7es++lns3vnnfSf7eYSju0sWeJMMuh48JeePboZY4VzDbiPq8qNOMecX3ccZztLXEJkDejb53kzGnPuJ/MEC/lCWuri7egkhTjpOL8mMOEri3jTcYeb7YQCBTrPiYvr8dix43qNvy0dF3Y2weigG9Cvr4+xwV1eRHJGljppX3zxxdK1cydjnOvSraf8TxdrdlwPOXlF+q9TF3c5kwpL7t5G59TE8WOlT99+0v+VgSbJOyrdLk+p4WLEyFGeLLp0eUo2bd5sfLXDXztGccPgCeOlI+HSEVwbYaT4FDXCOc8WlGmIuptz1xOuV2CsKFqksBQrdo1TjKj9vVlH2S+YN1e693xaXh30mqeecEmDDtOGDe73hIVLF6Gm48mYG2ElgPsM7ffg14ZKr2fs9hjX+4fvz5Q8ea4yn6GvDTL3rrP+AM7B8VjveA6rIvwSQ8c+ZoBhJql7oWy8h8HF0thxE4x7vdy5c8vwoYONkdd5djm/fkmaXaf9Sm06/m07EsUsD6wt9vwLfeXiYfHGSIFZsnjXwzsjBLNjBw7ob7Zj+SuLLm7lu7pWEjR27twpefPmTeJo+gZjhfT4+Pj0zZS5xQQBXlsxoeYMqSSvrQzBnqGZUucZij/DMqfeMwx9hmZMvWco/gzLPJje4QqkVJmbTAdiZ+1E9Bf8BYOx4lJdkDOpme6Is3//fhMHrg4CycmTJyWbLoTs+Ld3zkHHSKAFIzt17qZuENbIt18tDpQcw5IhEEznyZx6zg4719Jl6uLCMQacs8wCJAwXTjlynO9jpAgQLWgQ1mg4rbOBklqUPujJ6XAw3Hp37lPc/0nd25ilAzdx6PfADBp0bq1e+aNgEV9H/tHZV//oM8Ad5hxz/4ZDR0gP6WBNkkDPFowQrnNffen3Uh9p8dCD7uwz7Xaoeke8bdu3CzpD4SItWAdoOHWR1vsu0yrmHBY8VJ1jzZizZ8/IRRddFLA0hw8fkezZs5kBCQEjMDBkAqHqJKkE0b4cOnhQ0EYm9b6V1Lnu8HClg+f6v//+a9o751mBMLwTXnLJJXrdZHdnG7Pbgd96YxYHK04CJEACJEACJEACJEACJEACqSdQqGgJ2b5lo5nZMEF9lz/a/hHTkYvwjBKUZ8+evcav89jRI00xUJ7nnukl7dVdBSVtBOqqK5if1tmzVtKWUmyfjZkhL734QqaBkB73NO5df0mPfP3zDLaPmV2T35hqOmYbNbRd1TllXPHjErniisuDnZ7pjjl1i6SCw2AFYxbl3BBo9+jjZnR+WlLfvOlXz8CCtKTDc20CkXgfhlM3cBU6/5M54UwyU6WVDVZ9x5qTqUrOwpIACZAACZAACZAACZAACZBAhBFwOhexdsCSH5bKl199LbVr3WMMGBlZ1E8+nScN6t9v1gVAOZxyZmSZoiXvuXM+jJaqsB4pIJBe9xAWhoWrE2cGVXrlGwoKrKlTv2ETXTfnWhkx9DXPDJtIKmMo9UhJnGiuW0o4xFLciePHxFJ1M0VdeR9mCjWlupBZzpw5Y4UyXZRuoFLNmCdmIgJpnWKWiarKoqYzAV5b6Qw8ArKjziNACRlQBOo9A6BHQJbUewQoIQOKQL1nAPQMzpI6z2AFZFD21HsGgc/gbKn3DFZABmRPnWcA9GSypE6SARSlh9VOYS8EFqX1Y7VIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQinAAtFRGuIBaPBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABKKdQBxWHaeQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEYRiOPi2hmFnvmSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmAQJxlWSRBAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhlGgDMrMgw9MyYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgABzqzgdUACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJChBOJUMrQAzJwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCC2CdBSEdv6Z+1JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIMMJ0A1UhquABSABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCB2CbABbZjW/+sPQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlkOAHOrMhwFbAAJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBDbBGisiG39s/YkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkOEE6AYqw1XAApAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAbBOgsSK29c/akwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECGE4jL8BKwACRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAjFNgMaKmFY/K08CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACGU+AxoqM1wFLQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIxTSDOsqyYBsDKkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJZCwBGisylj9zJwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIGYJxCXJUuWmIdAACRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhlHgMaKjGPPnEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJRA3NmzZzMdiBw5cmS6MrPAmYMAr63MoafMWEpeW5lRa2krM3WeNn6Z9WzqPbNqLm3lpt7Txi+znk29Z1bNpb7c1Hnq2WXmM6n3zKy91Jedek89u8x6JnUeeZqjTiJPJ+lRojiV9MiHeZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAQAK0VATEwkASIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH0IhB35syZ9MqL+ZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAIgJxWbNmTRTIABIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJILwLZ0iuj9MrnyJEjcuLECbEsK72yZD6ZiECWLFkkZ86ckitXrhSXmtdWipHF1Am8tmJK3aay1Hns6Rw1pt6p95QS4PtDSolFTnze75Gji/QqCXWeXqQjKx/qPbL0kV6lod7Ti3Tk5EOdR44unJJQJw6J2PpNTu9ZtFM/pF79nTt3St68eSOC3qlTpyR79uyJyoI/g2fPnpX4+HjJli3q7DCJ6suAlBM4ffq0HDt2TLCwfCCDBa+tlDPlGTYBXluxdyVQ57Gnc9SYeqfe+f4QO9cA7/fY0bVTU+rcIRFbv9R7bOnbqS317pCInV/qPPJ0TZ1Enk7So0TJ6T2qFtjGjAoaKtLjssq8ecCIhWsE10pKhNdWSmjFZlxeW7Gnd+o89nSOGlPv1HtKCPD9ISW0Ii8u7/fI08m5LhF1fq4JR2b61Htk6uVcl4p6P9eEIy996pw6iTwCsVmi5O7FuBAnVmQKeqgLKkwhgWAEcI2k9LrntRWMKI85BHhtOSRi55c6jx1du2tKvbtpxM429R47unbXlHp304iNbeo8NvTsX0vq3Z9IbOxT77GhZ3ctqXM3jcjYpk4iQw/pXYpgeo8qY0V6g2V+JEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACaSegrvujyhNU2okwBRIgARIgARIgAQlvA4QAAEAASURBVBIgARIgARIgARIgARIgARIgARIgARIggXQlQEtFuuJmZiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAv4E4s6ePesfxn0SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSDcCcVmyZEm3zJgRCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACfgT4ALb/kS4TwIkQAIRSOCbb76Rq666SmBgPnPmjKeEM2bMMGEI9//s27fPE48bJEACJEACJEACJEACJEACJEACJEACJEACJBDJBLJxZkUkq4dlIwESiHUClmXJsGHDpFu3bgFR7Nmzx4T37ds30fELL7wwURgDSIAESIAESIAESIAESIAESIAESIAESIAESCASCWRDRxgNFpGoGpaJBEiABESGDBkiPXr0kFatWskFF1wgY8eO9cGC2ROlSpWSF154wSecOyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQmQjEqWSm8rKsJEACJBBTBA4dOiSjRo2SN954Q+Lj4xPVHTMrChQokCicASRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQmQhky0yFZVlJgARIINYIPP/885IjR44kq71r1y658sorZerUqfLxxx9Lrly5pFq1atKkSRPJnj17kufxAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlEEgEusB1J2mBZSIAESMCPQDBDBaLCWDF9+nTp1KmTnDhxQj7//HN5+OGHpU2bNj4Lcfsly10SIAESIAESIAESIAESIAESIAESIAESIAESiCgCcVyvIqL0wcKQAAmQQIoI7N69W8qVKyebNm2SBQsWyJ9//ildu3aVGTNmyNy5c1OUFiOTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQEYR4MyKjCLPfEmABEggDAQ2btwo33//vVx11VWe1Pr162e2v/vuO08YN0iABEiABEiABEiABEiABEiABEiABEiABEggkgnQWBHJ2mHZSIAESCAIgf/++082bNggR48e9YmVM2dOsxj33r17fcK5QwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKRSoBuoCJVMywXCZAACSRD4OzZs3L33XdLz549fWKuXLlSjh07JpUqVfIJ5w4JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCqBbFyzIlJVw3KRAAmQQHACWHy7devWMnLkSLn00kulQYMG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CZAACZAACZBAVBOgsSKq1cvKkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEDkE6CxIvJ1xBKSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQFQTiLMsK6oryMqRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlENgEaKyJbPywdCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACUQ9gTiVqK8kK0gCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBC5BGipiFzdsGQkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEBME4s6ePRsTFWUlSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEIpNAFjVWWFmyZEm2dDt37pT4+Phk4zECCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACaSEQDbLsiQUYwUSjRRjxalTpyR79uwpqSfjkkBIBHhthYSJkVJBgNdWKqBl8lOo80yuwFQWn3pPJbhMfhr1nskVmMriU++pBJeJT6POM7Hy0lB06j0N8DLxqdR7JlZeKotOnacS3Dk8jTo5h3AjOOm4UA0VEVwHFo0ESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCATE4jDzAoKCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACWQUgTiVjMqb+ZIACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCA0FLBi4AESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCBDCdANVIbiZ+YkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJcYJvXAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQIYS4MyKDMXPzEmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGis4DVAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQoQToBipD8TNzEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGit4DZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACWQogbgMzT2TZG5ZIr/tFfnzcNoLvHm/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KZLbMk4k9f4utP5Q5xbWQbycexhh/N+pU3J1jhAdqHXhZfayyy6lkcKQTdtfoc6tUEeOEbn79kWbEfB46aSkHgIJ7fNIjhAGrZ9+/tkonZHXIJTgeoOwI6HCgSA05AHNX5ExU0aTEyNUfVwXmEBC+h1huhASyC3os7NnzwhG1QcTPMYh1EsOvd9ACRqpINwXEnjfcvPNvBdFCs9RPly/I0zI5ZdfZrzlHJuZyWD97y7H+ZRHIFS/w5sCo5cRysf9Eo0+zxgbws/rUSGkD/LZFChQwC+UnHt7PIMilwVy2zD0j5vOhc+H6nPUDi/Cc+fPSZ7Y3ELOPQb6ryf2fRf72B+9XzJlzkSPGif8C5wO1+94VofHbKBk6oH6Hc0Jtc0FNjfo5mjL4V8Pm7ZiwAMlNIFw/Q49B8J4F1DbMwaPhpN/Tlv6IAxcdSfLDrct118cAuH6/OK0gntxEmCfOGmkn+l0ZaxIP93KI00oAV4IE0qO24UjwHMrHKG0t559nvb61MsRsd+9UEp7Zdjvaa9PvRwR+90LpbRVhn2etvrT69Gw372SSlvl2O9pqz+9HA373Auli1uGfXJxeaeUvUVhRB6FBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJKLAI0VyUWe+yUBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjAENJQpE/PxXCABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkg+ArRUJB977pkESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESEAJRJ0/f54gSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDZCERlyJAh2XbOHZMACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAAE2zzHCABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkhWAvSsSFb83DkJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAA9K3gOkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJJCuBKJVkbQB3TgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkL4JZIhR8YLg0KFDkjVrVi9FWYYESIAESIAESIAESIAESIAESIAESIAE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yZUrV7zDQn4Idx/jMQ3PYCf+/scYwN3r7UpQDmGkcujo7HBKTnsb/iYegXD9HsmecB5kVA1DICVVJPWwbNITSGi/o4/hIXOLKhTdz5X4L5/TkG/B/uuJdVTYD0INZslyuS+kXGLVnZbrCdfnkV7jL5QV2vPj3n1yba6cfE68UJghtg/X7/v2RWuIr2sC/pcC3duxq1DbhGiKb1Wo64hdCOEjf/r5ZxNqskD+/PZi/nokEKrfkc9h1++WzuamC9D9oCnwykD0DoRzQqjxlCbRf2kISh0QW+wGy5iS0tqXmO0J1eeJuR/W5Z1AqD7BdXB/9H7JlDmTL2qA95pZMiUTyKAJuWK8KC7SgrEiJXcE25YyCIS6EKaMFrIVqZUAz63U2nMJbzf7POHsUvOW7PfU3HsJbzv7PeHsUvOW7PfU3HsJazv7PGHcUvtW7PfU3oMJaz/7PWHcUvNW7POU13vsk5TXJxejRZo7mC7kFwM090ECJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBCYQBRcgCkkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkFwE6FmRXOS5XxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAUOAnhU8EUiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABJKVgObWjkrWBnDnJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEAC6ZsALRXpu/959CRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQ7AQYBirZu4ANIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH0TYAJttN3//PoSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDZCdCzItm7gA0gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggfRNgMaK9N3/PHoSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSHYCGc6fPx+TIUOGsA05dOiQZM2aNWw5FiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBSAhk8mKosCtMKcaKM2fOSObMme1m8ZcEEo0Az61EQ8mKXAR4brmApINZ9nk66OQAh8h+DwAlHSxiv6eDTg5wiOz3AFDS+CL2eRrv4CCHx34PAiaNL2a/p/EODnB47PMAUJJ5EfskmTsgmXYflUz75W5JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwBCgsYInAgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQLISoLEiWfFz5yRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAlExMTGkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALJRoDGimRDzx2TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmAQFSGDBlIggRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgASSjQCNFcmGnjsmARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIAgajz58+TBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkkG4EolWTbOXdMAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAArRU8BwgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIVgJR586dS9YGcOckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALpm0BUxowZ0zcBHj0JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECyEmAYqGTFz52TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnQWMFzgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIFkJ0FiRrPi5cxIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggaiYmBhSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIFkI0BjRbKh545JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARA4P/YeNeOUSE9MQAAAABJRU5ErkJggg==" - } - }, - "cell_type": "markdown", - "id": "9db8b8ab", - "metadata": {}, - "source": [ - "## Comparing with Finngen finemapping.\n", - "\n", - "The same [trait](https://r9.finngen.fi/pheno/C3_BASAL_CELL_CARCINOMA_EXALLC) has 3 finemapped credible sets.\n", - "\n", - "![image.png](attachment:image.png)\n", - "\n", - "- `15:27983407:C:T` and `15:27985172:C:T` are very close, I could find `27983407`.\n", - "- Also `15_48134287_A_G` is found by both approach.\n", - "- One of the other three snps was not found in the LD set (`15_28519016_G_A`). \n", - "- `15_27427129_A_G` and `15_29035680_G_A` were resolved in the LD matrix, and were found to be not linked. But they are not in the.\n", - "\n", - "What are the r between these variants?\n", - "\n", - "- 15_27983407_C_T vs 15_27427129_A_G -> r = \n", - "- 15_27983407_C_T vs 15_29035680_G_A -> r =" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "id": "d8da5802", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T10:19:25.494510Z", - "start_time": "2023-10-27T10:19:23.020596Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", - "| variantId| pValue|locusSize|ldSetSize|qualityControls|chromosome|position| idx|ldPopulation|\n", - "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", - "|15_27427129_A_G|9.592E-13| 738| 35| []| 15|27427129|11130387| fin|\n", - "|15_27983407_C_T|4.618E-61| 837| 78| []| 15|27983407|11133253| fin|\n", - "|15_29035680_G_A|2.076E-21| 647| 5| []| 15|29035680|11136878| fin|\n", - "+---------------+---------+---------+---------+---------------+----------+--------+--------+------------+\n", - "\n" - ] - } - ], - "source": [ - "# Extracting and resolving ld:\n", - "resolved_ld_index = (\n", - " session.spark.read\n", - " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", - " .filter(\n", - " (f.col('studyId') == 'FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC') &\n", - " f.col('variantId').isin(['15_27983407_C_T', '15_27427129_A_G', '15_29035680_G_A'])\n", - " )\n", - " .orderBy(f.col('position'))\n", - " .select(\n", - " 'variantId', \n", - " f.concat_ws('E','pValueMantissa', 'pValueExponent').alias('pValue'), \n", - "# 'studyLocusId', \n", - " f.size(f.col('locus')).alias('locusSize'),\n", - " f.size(f.col('ldSet')).alias('ldSetSize'),\n", - " f.col('qualityControls')\n", - " )\n", - "# .count()\n", - " .join(ld_index, on = 'variantId', how='left')\n", - " .persist()\n", - ")\n", - "\n", - "resolved_ld_index.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "id": "722eb21d", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T10:24:03.123125Z", - "start_time": "2023-10-27T10:23:32.607310Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-10-27 10:23:48.619 Hail: INFO: Coerced sorted dataset \n", - "[Stage 942:> (0 + 1) / 1]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---+---+------------------+\n", - "|i |j |entry |\n", - "+---+---+------------------+\n", - "|0 |0 |2.0000000000000084|\n", - "|0 |1 |0.4201370447477838|\n", - "|0 |2 |0.0 |\n", - "|1 |0 |0.4201370447477838|\n", - "|1 |1 |2.0000000000000004|\n", - "|1 |2 |0.0 |\n", - "|2 |0 |0.0 |\n", - "|2 |1 |0.0 |\n", - "|2 |2 |1.9999999999999996|\n", - "+---+---+------------------+\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "# Accessing r data from the LD matrix:\n", - "half_matrix = (\n", - " BlockMatrix\n", - " .read(ld_matrix_template.format(POP=ld_population))\n", - " .filter(\n", - " [row['idx'] for row in resolved_ld_index.select('idx').collect()],\n", - " [row['idx'] for row in resolved_ld_index.select('idx').collect()]\n", - " )\n", - ")\n", - "\n", - "# matrix = half_matrix + half_matrix.T\n", - "matrix.entries().to_spark().show(100, truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "id": "c316e0d0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:18:11.801945Z", - "start_time": "2023-10-27T11:18:06.718163Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", - "| variantId|chromosome| studyId| studyLocusId|position| beta|oddsRatio|oddsRatioConfidenceIntervalLower|oddsRatioConfidenceIntervalUpper|betaConfidenceIntervalLower|betaConfidenceIntervalUpper|pValueMantissa|pValueExponent|effectAlleleFrequencyFromSource|standardError|subStudyDescription|qualityControls|finemappingMethod| locus| ldSet|\n", - "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", - "|15_27983407_C_T| 15|FINNGEN_R9_C3_BAS...|-8027743839728879857|27983407|0.413866| null| null| null| 0.388762| 0.43897| 4.618| -61| 0.0443583| 0.025104| null| []| null|[{null, null, nul...|[{15_28482553_T_C...|\n", - "+---------------+----------+--------------------+--------------------+--------+--------+---------+--------------------------------+--------------------------------+---------------------------+---------------------------+--------------+--------------+-------------------------------+-------------+-------------------+---------------+-----------------+--------------------+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "study_locus_id = -8027743839728879857\n", - "\n", - "# Running susie for a specific study locus:\n", - "sl = StudyLocus(\n", - " _df= (\n", - " session.spark.read\n", - " .parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/finngen/2023.10.13_ld_clumped_w_locus/')\n", - " .filter(f.col('studyLocusId') == study_locus_id)\n", - " ),\n", - " _schema=StudyLocus.get_schema()\n", - ").persist()\n", - "\n", - "sl.df.show()" - ] - }, - { - "cell_type": "markdown", - "id": "947d112a", - "metadata": {}, - "source": [ - "## Annotating study locus with ld population + Get list of ancestires" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "id": "8be0fd89", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:20:59.482466Z", - "start_time": "2023-10-27T11:20:59.062418Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0------------------------------------------------\n", - " studyId | FINNGEN_R9_C3_BAS... \n", - " variantId | 15_27983407_C_T \n", - " chromosome | 15 \n", - " studyLocusId | -8027743839728879857 \n", - " position | 27983407 \n", - " beta | 0.413866 \n", - " oddsRatio | null \n", - " oddsRatioConfidenceIntervalLower | null \n", - " oddsRatioConfidenceIntervalUpper | null \n", - " betaConfidenceIntervalLower | 0.388762 \n", - " betaConfidenceIntervalUpper | 0.43897 \n", - " pValueMantissa | 4.618 \n", - " pValueExponent | -61 \n", - " effectAlleleFrequencyFromSource | 0.0443583 \n", - " standardError | 0.025104 \n", - " subStudyDescription | null \n", - " qualityControls | [] \n", - " finemappingMethod | null \n", - " locus | [{null, null, nul... \n", - " ldSet | [{15_28482553_T_C... \n", - " ldPopulation | fin \n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "['fin']" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Adding ld population to study locus:\n", - "dl_df = (\n", - " sl.df\n", - " .join(studies, on='studyId', how='left')\n", - " .persist()\n", - ")\n", - "\n", - "dl_df.show(1, vertical=True)\n", - "\n", - "# Extract the required ld populations:\n", - "ld_populations = [row['ldPopulation'] for row in dl_df.select('ldPopulation').distinct().collect()]\n", - "\n", - "ld_populations" - ] - }, - { - "cell_type": "markdown", - "id": "b69aad94", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-24T10:34:37.443692Z", - "start_time": "2023-10-24T10:34:37.436917Z" - } - }, - "source": [ - "## Read ld index" - ] - }, - { - "cell_type": "code", - "execution_count": 155, - "id": "5465b9d3", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:21:03.778148Z", - "start_time": "2023-10-27T11:21:03.770967Z" - }, - "code_folding": [ - 2 - ] - }, - "outputs": [], - "source": [ - "from gentropy.common.utils import _liftover_loci, convert_gnomad_position_to_ensembl\n", - "\n", - "def _process_ld_indices(\n", - " ld_index_raw: hl.Table, \n", - " grch37_to_grch38_chain_path: str\n", - ") -> DataFrame:\n", - " \"\"\"Creates a look up table between variants and their coordinates in the LD Matrix.\n", - "\n", - " !!! info \"Gnomad's LD Matrix and Index are based on GRCh37 coordinates. This function will lift over the coordinates to GRCh38 to build the lookup table.\"\n", - "\n", - " Args:\n", - " ld_index_raw (hl.Table): LD index table from GnomAD\n", - " grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates\n", - "\n", - " Returns:\n", - " DataFrame: Look up table between variants in build hg38 and their coordinates in the LD Matrix\n", - " \"\"\"\n", - " ld_index_38 = _liftover_loci(\n", - " ld_index_raw, grch37_to_grch38_chain_path, \"GRCh38\"\n", - " )\n", - "\n", - " return (\n", - " ld_index_38.to_spark()\n", - " # Filter out variants where the liftover failed\n", - " .filter(f.col(\"`locus_GRCh38.position`\").isNotNull())\n", - " .withColumn(\n", - " \"chromosome\", f.regexp_replace(\"`locus_GRCh38.contig`\", \"chr\", \"\")\n", - " )\n", - " # Temporary filter:\n", - " .filter(f.col('chromosome').isin(['16', '15']))\n", - " .withColumn(\n", - " \"position\",\n", - " convert_gnomad_position_to_ensembl(\n", - " f.col(\"`locus_GRCh38.position`\"),\n", - " f.col(\"`alleles`\").getItem(0),\n", - " f.col(\"`alleles`\").getItem(1),\n", - " ),\n", - " )\n", - " .select(\n", - " \"chromosome\",\n", - " \"position\",\n", - " f.concat_ws(\n", - " \"_\",\n", - " f.col(\"chromosome\"),\n", - " f.col(\"position\"),\n", - " f.col(\"`alleles`\").getItem(0),\n", - " f.col(\"`alleles`\").getItem(1),\n", - " ).alias(\"variantId\"),\n", - " f.col(\"idx\"),\n", - " )\n", - " # Filter out ambiguous liftover results: multiple indices for the same variant\n", - " .withColumn(\"count\", f.count(\"*\").over(Window.partitionBy([\"variantId\"])))\n", - " .filter(f.col(\"count\") == 1)\n", - " .drop(\"count\")\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "id": "15eab28a", - "metadata": {}, - "source": [ - "- Full genome: 5min" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "id": "e231cc9a", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:25:47.523343Z", - "start_time": "2023-10-27T11:21:07.729708Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 975:=================================================>(9996 + 4) / 10000]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------+---------+--------------------+--------+------------+\n", - "|chromosome| position| variantId| idx|ldPopulation|\n", - "+----------+---------+--------------------+--------+------------+\n", - "| 15|100068435| 15_100068435_C_T|11488485| fin|\n", - "| 15|100074914| 15_100074914_T_C|11488528| fin|\n", - "| 15|100082112| 15_100082112_C_G|11488600| fin|\n", - "| 15|100084933| 15_100084933_C_T|11488622| fin|\n", - "| 15|100086055| 15_100086055_C_T|11488643| fin|\n", - "| 15|100102338|15_100102338_CGAA...|11488802| fin|\n", - "| 15|100102474| 15_100102474_A_G|11488806| fin|\n", - "| 15|100140453| 15_100140453_G_GAC|11489087| fin|\n", - "| 15|100141050| 15_100141050_G_A|11489092| fin|\n", - "| 15|100149133| 15_100149133_G_T|11489141| fin|\n", - "| 15|100270659| 15_100270659_G_A|11490053| fin|\n", - "| 15|100317282| 15_100317282_T_C|11490464| fin|\n", - "| 15|100376040| 15_100376040_ACTT_A|11490958| fin|\n", - "| 15|100391254| 15_100391254_CA_C|11491027| fin|\n", - "| 15|100394474| 15_100394474_T_C|11491043| fin|\n", - "| 15|100466861| 15_100466861_T_C|11491614| fin|\n", - "| 15|100516200| 15_100516200_T_C|11492028| fin|\n", - "| 15|100525848| 15_100525848_T_G|11492086| fin|\n", - "| 15|100588385| 15_100588385_A_T|11492713| fin|\n", - "| 15|100605649| 15_100605649_A_T|11492813| fin|\n", - "+----------+---------+--------------------+--------+------------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "grch37_to_grch38_chain_path = 'gs://hail-common/references/grch37_to_grch38.over.chain.gz'\n", - "ld_index_raw_template = 'gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht'\n", - "ld_matrix_template ='gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm'\n", - "\n", - "\n", - "ld_population = 'fin'\n", - "ld_index_raw_path = ld_index_raw_template.format(POP=ld_population)\n", - "\n", - "ld_index = (\n", - " _process_ld_indices(\n", - " hl.read_table(ld_index_raw_path),\n", - " grch37_to_grch38_chain_path,\n", - " )\n", - " .withColumn('ldPopulation', f.lit(ld_population))\n", - " .persist()\n", - ")\n", - "\n", - "ld_index.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "id": "e43d0dbf", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:26:04.794300Z", - "start_time": "2023-10-27T11:26:04.691498Z" - } - }, - "outputs": [], - "source": [ - "# how to do the join?\n", - "window_size = 250_000\n", - "tags = (\n", - " # Pre-process study locus:\n", - " f.broadcast(dl_df)\n", - " .select('studyLocusId', 'chromosome', 'position', 'ldPopulation')\n", - " .alias('study_locus')\n", - " .join(\n", - " (\n", - " ld_index\n", - " .selectExpr(*[f\"{col} as ld_index_{col}\" for col in ld_index.columns])\n", - " .alias('ld_index')\n", - " ),\n", - " on = [\n", - " (f.col('ld_index.ld_index_chromosome') == f.col('study_locus.chromosome')) & \n", - " (f.col('ld_index.ld_index_ldPopulation') == f.col('study_locus.ldPopulation')) &\n", - " (f.col('ld_index.ld_index_position') >= f.col('study_locus.position') - window_size) & \n", - " (f.col('ld_index.ld_index_position') <= f.col('study_locus.position') + window_size)\n", - " ],\n", - " how='left'\n", - " )\n", - " .select(\n", - " 'studyLocusId',\n", - " 'chromosome',\n", - " f.col('ld_index_variantId').alias('variantId'),\n", - " f.col('ld_index_idx').alias('idx'),\n", - " f.col('ld_index_position'),\n", - " f.col('ld_index_ldPopulation').alias('ldPopulation')\n", - " )\n", - " .persist()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 158, - "id": "45fb0df5", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:26:08.409160Z", - "start_time": "2023-10-27T11:26:06.312358Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 979:============================================> (173 + 27) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+-----+\n", - "| studyLocusId|count|\n", - "+--------------------+-----+\n", - "|-8027743839728879857| 2079|\n", - "+--------------------+-----+\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "tags.groupby('studyLocusId').count().show()" - ] - }, - { - "cell_type": "code", - "execution_count": 159, - "id": "858894fc", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:26:14.204291Z", - "start_time": "2023-10-27T11:26:12.440937Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", - "|studyLocusId |chromosome|first_position|last_position|window_length|first_idx|last_idx|ldVariantCount|\n", - "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", - "|-8027743839728879857|15 |27733460 |28232552 |499092 |11131979 |11134057|2079 |\n", - "+--------------------+----------+--------------+-------------+-------------+---------+--------+--------------+\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 159, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Collecting region:\n", - "ld_windows = (\n", - " tags\n", - " .orderBy('studyLocusId', 'ld_index_position')\n", - " .groupBy('studyLocusId', 'chromosome', 'ldPopulation')\n", - " .agg(\n", - " f.first(f.col('ld_index_position')).alias('first_position'),\n", - " f.first(f.col('variantId')).alias('first_variantId'),\n", - " f.first(f.col('idx')).alias('first_idx'),\n", - " f.last(f.col('ld_index_position')).alias('last_position'),\n", - " f.last(f.col('variantId')).alias('last_variantId'),\n", - " f.last(f.col('idx')).alias('last_idx'),\n", - " f.size(f.collect_list(f.col('variantId'))).alias('ldVariantCount')\n", - " )\n", - " .withColumn('window_length', f.col('last_position') - f.col('first_position'))\n", - " .persist()\n", - ")\n", - "\n", - "(\n", - " ld_windows\n", - " .select(\n", - " 'studyLocusId',\n", - " 'chromosome',\n", - " 'first_position',\n", - " 'last_position',\n", - " 'window_length',\n", - " 'first_idx',\n", - " 'last_idx',\n", - " 'ldVariantCount'\n", - " )\n", - " .show(truncate=False)\n", - ")\n", - "\n", - "\n", - "ld_windows.count()" - ] - }, - { - "cell_type": "code", - "execution_count": 160, - "id": "61d51efe", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:26:22.608155Z", - "start_time": "2023-10-27T11:26:22.421535Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Row(studyLocusId=-8027743839728879857, chromosome='15', ldPopulation='fin', first_position=27733460, first_variantId='15_27733460_AGCCAAACTGGCTCATGGCC_A', first_idx=11131979, last_position=28232552, last_variantId='15_28232552_G_GA', last_idx=11134057, ldVariantCount=2079, window_length=499092)" - ] - }, - "execution_count": 160, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "row = ld_windows.collect()[0]\n", - "row" - ] - }, - { - "cell_type": "code", - "execution_count": 161, - "id": "d4d006bd", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:26:31.400420Z", - "start_time": "2023-10-27T11:26:30.851547Z" - } - }, - "outputs": [], - "source": [ - "ld_population = row['ldPopulation']\n", - "study_locus_id = row['studyLocusId']\n", - "chromosome = row['chromosome']\n", - "first_index = row['first_idx']\n", - "last_index = row['last_idx']\n", - "\n", - "# For each row, we need to open the gnomad \n", - "half_matrix = (\n", - " BlockMatrix\n", - " .read(ld_matrix_template.format(POP=ld_population))\n", - " .filter(\n", - " range(first_index, last_index),\n", - " range(first_index, last_index)\n", - " )\n", - ")\n", - "\n", - "matrix = half_matrix + half_matrix.T\n" - ] - }, - { - "cell_type": "code", - "execution_count": 162, - "id": "e24da4ca", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:27:24.435664Z", - "start_time": "2023-10-27T11:26:35.945855Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-10-27 11:26:58.169 Hail: INFO: Coerced sorted dataset \n", - " \r" - ] - } - ], - "source": [ - "(\n", - " matrix.entries().to_spark()\n", - " .select(\n", - " (f.col('i')+first_index).alias('idx_i'),\n", - " (f.col('j')+first_index).alias('idx_j'),\n", - " f.when(f.col('i') == f.col('j'), f.col('entry')/2).otherwise(f.col('entry')).alias('r'),\n", - " f.lit(study_locus_id).alias('study_locus_ids')\n", - " )\n", - " # Joining with i:\n", - " .join(\n", - " (\n", - " tags\n", - " .select(\n", - " f.col('variantId').alias('variantIdLeft'), \n", - " f.col('idx').alias('idx_i')\n", - " )\n", - " ), \n", - " on='idx_i', how='outer'\n", - " )\n", - " # Joining with i:\n", - " .join(\n", - " (\n", - " tags\n", - " .select(\n", - " 'chromosome', \n", - " f.col('variantId').alias('variantIdRight'), \n", - " f.col('idx').alias('idx_j')\n", - " )\n", - " ), \n", - " on='idx_j', how='outer'\n", - " )\n", - " .select(\n", - " 'variantIdLeft',\n", - " 'variantIdRight',\n", - " 'study_locus_ids',\n", - " 'r'\n", - " )\n", - " .distinct()\n", - " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/ld_matrix-{study_locus_id}')\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 164, - "id": "3cb94848", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:28:28.344710Z", - "start_time": "2023-10-27T11:28:27.670811Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0---------------------------------------------------\n", - " studyId | FINNGEN_R9_C3_BASAL_CELL_CARCINOMA_EXALLC \n", - " variantIdLead | 15_27983407_C_T \n", - " studyLocusId | -8027743839728879857 \n", - " variantId | 15_27733459_AGCCAAACTGGCTCATGGCC_A \n", - " pValueMantissa | 1.937 \n", - " pValueExponent | -2 \n", - " beta | 0.0267247 \n", - " standardError | 0.011429 \n", - "only showing top 1 row\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "837" - ] - }, - "execution_count": 164, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "study_locus_id = -8027743839728879857\n", - "\n", - "# Get data:\n", - "ld_matrix = session.spark.read.parquet(f'gs://ot-team/dsuveges/ld_matrix-{study_locus_id}')\n", - "\n", - "# Select one study locus:\n", - "selected_locus = (\n", - " dl_df\n", - " .filter(f.col('studyLocusId') == study_locus_id)\n", - " .select(\n", - " '*',\n", - " f.explode_outer('locus').alias('exploded_locus')\n", - " )\n", - " .select(\n", - " 'studyId',\n", - " f.col('variantId').alias('variantIdLead'),\n", - " f.col('studyLocusId'),\n", - " *[f'exploded_locus.{col}' for col in ['variantId', 'pValueMantissa', 'pValueExponent', 'beta', 'standardError']]\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "selected_locus.show(1, False, True)\n", - "selected_locus.count()" - ] - }, - { - "cell_type": "code", - "execution_count": 189, - "id": "0e571433", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T13:49:41.356331Z", - "start_time": "2023-10-27T13:49:40.463119Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "| studyId| studyLocusId| variantIdLead| variantIdLeft| variantIdRight|pValueMantissaRight|pValueExponentRight| betaRight|standardErrorRight| r|\n", - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27792793_C_T|15_27772290_T_C| 9.979| -6| 0.0730063| 0.0165261| 0.3188276023578284|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27950388_C_T|15_27778556_C_T| 1.142| -2| 0.119731| 0.0473309| -0.1845689041174883|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28104601_A_T|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763| 0.01919714154020592|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27970325_G_A|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763|-0.12413267238343029|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27899878_T_C|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927|-0.45516734696600447|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27914364_C_T|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927| -0.4029686644067302|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27828335_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.09141477739652863|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27845815_A_G|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.7803430284267874|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27820229_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804|-0.08881336794530735|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27825631_G_C|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.13879209804155437|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28211160_A_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.05996001018362227|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28019021_G_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.03843623265438152|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28081390_A_T|15_27938863_T_A| 2.109| -3| 0.157002| 0.0510665|-0.04189151880774...|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27907664_A_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172|-0.16859090364294946|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27819940_C_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| 0.11697321459267764|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27853556_T_G|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| -0.1404576556679461|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28052911_T_C|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04461220378655805|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27790520_G_A|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04420892575950266|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27879868_C_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896| 0.2404542405419156|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27822551_G_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896|-0.04613729472121665|\n", - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "only showing top 20 rows\n", - "\n", - "385641\n", - "621.0\n" - ] - }, - { - "data": { - "text/plain": [ - "621" - ] - }, - "execution_count": 189, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Filtering matrix:\n", - "processed_matrix = (\n", - " ld_matrix\n", - " .join(\n", - " selected_locus.select(f.col('variantId').alias('variantIdLeft')),\n", - " on='variantIdLeft', how='inner'\n", - " )\n", - " .join(\n", - " selected_locus.withColumnRenamed('variantId', 'variantIdRight'), \n", - " on='variantIdRight', how='inner'\n", - " )\n", - " .select(\n", - " 'studyId',\n", - " 'studyLocusId',\n", - " 'variantIdLead',\n", - " 'variantIdLeft',\n", - " 'variantIdRight',\n", - " f.col('pValueMantissa').alias('pValueMantissaRight'),\n", - " f.col('pValueExponent').alias('pValueExponentRight'),\n", - " f.col('beta').alias('betaRight'),\n", - " f.col('standardError').alias('standardErrorRight'),\n", - " 'r'\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "processed_matrix.show()\n", - "print(processed_matrix.count())\n", - "print(sqrt(processed_matrix.count()))\n", - "processed_matrix.select('variantIdRight').distinct().count()" - ] - }, - { - "cell_type": "code", - "execution_count": 167, - "id": "381f093b", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:29:01.779404Z", - "start_time": "2023-10-27T11:28:57.285168Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "data": { - "text/plain": [ - "array([[1. , 0.88019644, 0.28333008, 0.25666969, 0.26345801],\n", - " [0.88019644, 1. , 0.26027515, 0.24115952, 0.2442993 ],\n", - " [0.28333008, 0.26027515, 1. , 0.85898573, 0.89168227],\n", - " [0.25666969, 0.24115952, 0.85898573, 1. , 0.96268566],\n", - " [0.26345801, 0.2442993 , 0.89168227, 0.96268566, 1. ]])" - ] - }, - "execution_count": 167, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pivoted_matrix = (\n", - " processed_matrix\n", - " .orderBy(f.col('variantIdLeft'), f.col('variantIdRight'))\n", - " .groupBy('variantIdLeft')\n", - " .pivot(\"variantIdRight\")\n", - " .agg(f.first('r'))\n", - " .orderBy('variantIdLeft')\n", - " # Convert to numpy array ingested by SuSie:\n", - " .toPandas().set_index('variantIdLeft').to_numpy()\n", - ")\n", - "\n", - "pivoted_matrix[0:5, 0:5]" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "id": "444e2ca2", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-26T08:49:13.002374Z", - "start_time": "2023-10-26T08:49:12.604741Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 1. , 0.99851182, 0.85089485, ..., 0.04532387,\n", - " 0.02258468, 0.02476075],\n", - " [ 0.99851182, 1. , 0.85111292, ..., 0.0465783 ,\n", - " 0.02253374, 0.02470884],\n", - " [ 0.85089485, 0.85111292, 1. , ..., 0.04748182,\n", - " 0.01191697, 0.01652519],\n", - " ...,\n", - " [ 0.04532387, 0.0465783 , 0.04748182, ..., 1. ,\n", - " -0.05908013, -0.05417476],\n", - " [ 0.02258468, 0.02253374, 0.01191697, ..., -0.05908013,\n", - " 1. , 0.96019982],\n", - " [ 0.02476075, 0.02470884, 0.01652519, ..., -0.05417476,\n", - " 0.96019982, 1. ]])" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pivoted_matrix.toPandas().set_index('variantIdLeft').to_numpy()" - ] - }, - { - "cell_type": "code", - "execution_count": 190, - "id": "8ed590f1", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T13:50:01.812451Z", - "start_time": "2023-10-27T13:49:58.985895Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "(\n", - " processed_matrix\n", - " # Convert to numpy array ingested by SuSie:\n", - " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/processed-ld-matrix-{study_locus_id}')\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "id": "5fc2f7ac", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T11:30:11.297300Z", - "start_time": "2023-10-27T11:30:09.400659Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "# selected_locus.write.mode('overwrite').parquet('gs://ot-team/dsuveges/selected_studyLocus_2224601896262245870')\n", - "(\n", - " processed_matrix\n", - " .select(\n", - " 'studyId',\n", - " f.col('variantIdRight').alias('variantId'),\n", - " f.col('pValueMantissaRight').alias('pValueMantissa'),\n", - " f.col('pValueExponentRight').alias('pValueExponent'),\n", - " f.col('betaRight').alias('beta'),\n", - " f.col('standardErrorRight').alias('standardError'),\n", - " )\n", - " .distinct()\n", - " .write.mode('overwrite').parquet(f'gs://ot-team/dsuveges/selected_studyLocus_{study_locus_id}')\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 187, - "id": "a4d47348", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T13:33:39.686914Z", - "start_time": "2023-10-27T13:33:39.682284Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.00, 0.18, 0.18, 0.97, 0.97, 0.15, 0.18, 0.11, 0.13, 0.12\n", - "0.18, 1.00, 0.99, 0.15, 0.15, 0.03, 0.03, 0.02, 0.01, 0.02\n", - "0.18, 0.99, 1.00, 0.15, 0.15, 0.03, 0.03, 0.02, 0.01, 0.02\n", - "0.97, 0.15, 0.15, 1.00, 1.00, 0.14, 0.17, 0.11, 0.12, 0.12\n", - "0.97, 0.15, 0.15, 1.00, 1.00, 0.14, 0.17, 0.11, 0.12, 0.12\n", - "0.15, 0.03, 0.03, 0.14, 0.14, 1.00, 0.32, 0.45, 0.50, 0.25\n", - "0.18, 0.03, 0.03, 0.17, 0.17, 0.32, 1.00, 0.29, 0.33, 0.52\n", - "0.11, 0.02, 0.02, 0.11, 0.11, 0.45, 0.29, 1.00, 0.91, 0.29\n", - "0.13, 0.01, 0.01, 0.12, 0.12, 0.50, 0.33, 0.91, 1.00, 0.33\n", - "0.12, 0.02, 0.02, 0.12, 0.12, 0.25, 0.52, 0.29, 0.33, 1.00\n" - ] - } - ], - "source": [ - "print(\n", - " '\\n'.join(\n", - " [\n", - " ', '.join([f'{value**2:.2f}' for value in row]) \n", - " for row in\n", - " (\n", - " pivoted_matrix\n", - " [[291, 293, 295, 322, 323, 508, 514, 529, 534, 515]]\n", - " [:,[291, 293, 295, 322, 323, 508, 514, 529, 534, 515]]\n", - " )\n", - " ]\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 188, - "id": "f3910534", - "metadata": { - "ExecuteTime": { - "end_time": "2023-10-27T13:45:22.792801Z", - "start_time": "2023-10-27T13:45:22.721043Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "| studyId| studyLocusId| variantIdLead| variantIdLeft| variantIdRight|pValueMantissaRight|pValueExponentRight| betaRight|standardErrorRight| r|\n", - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27792793_C_T|15_27772290_T_C| 9.979| -6| 0.0730063| 0.0165261| 0.3188276023578284|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27950388_C_T|15_27778556_C_T| 1.142| -2| 0.119731| 0.0473309| -0.1845689041174883|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28104601_A_T|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763| 0.01919714154020592|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27970325_G_A|15_27809200_G_A| 1.397| -2|-0.0286999| 0.0116763|-0.12413267238343029|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27899878_T_C|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927|-0.45516734696600447|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27914364_C_T|15_27851307_A_G| 5.606| -4|-0.0424098| 0.0122927| -0.4029686644067302|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27828335_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.09141477739652863|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27845815_A_G|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804| 0.7803430284267874|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27820229_G_A|15_27858692_G_A| 3.599| -4| 0.0427448| 0.0119804|-0.08881336794530735|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27825631_G_C|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.13879209804155437|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28211160_A_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.05996001018362227|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28019021_G_T|15_27915426_C_A| 1.001| -6| 0.0654293| 0.0133765| 0.03843623265438152|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28081390_A_T|15_27938863_T_A| 2.109| -3| 0.157002| 0.0510665|-0.04189151880774...|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27907664_A_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172|-0.16859090364294946|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27819940_C_T|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| 0.11697321459267764|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27853556_T_G|15_27938914_G_T| 2.725| -2| 0.0355862| 0.0161172| -0.1404576556679461|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_28052911_T_C|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04461220378655805|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27790520_G_A|15_27951206_G_A| 1.437| -2| 0.0695541| 0.0284131| 0.04420892575950266|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27879868_C_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896| 0.2404542405419156|\n", - "|FINNGEN_R9_C3_BAS...|-8027743839728879857|15_27983407_C_T|15_27822551_G_A|15_27989264_G_T| 2.454| -17| 0.147291| 0.0173896|-0.04613729472121665|\n", - "+--------------------+--------------------+---------------+---------------+---------------+-------------------+-------------------+----------+------------------+--------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "processed_matrix.show()" - ] - } - ], - "metadata": { - "_draft": { - "nbviewer_url": "https://gist.github.com/DSuveges/df6768b7d5637842e009aa945f3ea062" - }, - "gist": { - "data": { - "description": "Issue-3131-Productionizing_LD_matrix.ipynb", - "public": false - }, - "id": "df6768b7d5637842e009aa945f3ea062" - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/README.md b/notebooks/README.md new file mode 100644 index 000000000..35132b6bf --- /dev/null +++ b/notebooks/README.md @@ -0,0 +1,3 @@ +# Notebooks + +The notebooks in listed in this directory are not actively maintained and updated. diff --git a/notebooks/Release_QC_metrics.ipynb b/notebooks/Release_QC_metrics.ipynb new file mode 100644 index 000000000..5f9bf77c0 --- /dev/null +++ b/notebooks/Release_QC_metrics.ipynb @@ -0,0 +1,984 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook Title: Exploratory Data Analysis for Release QC Metrics\n", + "\n", + "## Description:\n", + "This notebook provides an exploratory data analysis for release quality control (QC) metrics. The notebook utilizes PySpark and pandas for data processing and visualization.\n", + "\n", + "## Notebook Workflow:\n", + "1. Import necessary modules and set up the release path and version.\n", + "2. Load and analyze the variant index data:\n", + " - Count the number of unique variants.\n", + "3. Load and analyze the study index data for different data sources (FinnGen, GWASCat, eQTLcat):\n", + " - Count the number of unique studies for each data source.\n", + "4. Analyze the credible sets for each datasource (Finngen, gwascat, eqtlcat):\n", + " - Analyze the credible sets:\n", + " - Count the number of unique credible sets and unique study IDs.\n", + " - Plot a scatter plot of the credible set size vs. the top posterior probability.\n", + " - Count the number of credible sets with a top SNP posterior probability > 0.9..\n", + "5. Analyze colocalization data:\n", + " - Count the total number of colocalizations and the number with clpp > 0.8.\n", + " - Calculate the average number of overlaps per credible set.\n", + "6. Analyze locus-to-gene (L2G) predictions:\n", + " - Load the locus-to-gene predictions data.\n", + " - How many Studylocus contains a \"good\" l2g prediction? (l2g_score > 0.5)\n", + " - How does l2g perform based on different datasource inputs? (impossible to tell)\n", + " \n", + "Note: This notebook assumes that the necessary data files are available in the specified release path and version.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup steps\n", + "##### 1. Import necessary modules and set up the release path and version." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/03/20 13:24:56 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + } + ], + "source": [ + "\"\"\"notebook for release qc metrics.\"\"\"\n", + "\n", + "import sys\n", + "\n", + "from pyspark.sql import functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "\n", + "sys.path.append(\"../../gentropy/src/\")\n", + "release_path=\"../../otg_releases\"\n", + "release_ver=\"2403\"\n", + "\n", + "session=Session()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2. Load and analyze the variant index data:\n", + " - Count the number of unique variants." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:> (0 + 8) / 9]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variant index contains 5468737 unique variants.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "\n", + "variant_index_path = f\"{release_path}/{release_ver}/variant_index\"\n", + "variant_index=session.spark.read.parquet(variant_index_path, recursiveFileLookup=True)\n", + "\n", + "# How many variants?\n", + "\n", + "# How many variants with MAF>=0.01 for EUR population?\n", + "#variant_index.filter(variant_index[\"alleleFrequencies.populationName\"] > 0.05).show(10, False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 5. Analyze the credible sets:\n", + "For each datasource and finemapping methods:\n", + "- Count the number of unique credible sets and unique study IDs.\n", + "- Plot a scatter plot of the credible set size vs. the top posterior probability.\n", + "- Count the number of credible sets with a top SNP posterior probability > 0.9.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique finngen susie CSs: 13966\n", + "Ingested 13966 Credible sets from 2408 finngen studies\n", + "Summary of finngen sample sizes: Mean: 355917.896179402 L.quart: 316100.0 Median: 392089.0 U.quart: 409683.0\n", + "Number of finngen studies with at least one CS: 1194\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of CS with top SNP PP > 0.9: 1898\n", + "Summary of finngen credible set sizes: L.quart: 4.0 Median: 14.0 U.quart: 41.0\n" + ] + }, + { + "data": { + "image/png": "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tWoVQ0NDO93v97//PYceeuiU22q1Gi984Qt54QtfSJ7n/Nmf/Rnvfve7eetb3zpjj6eJdOT69et363c97LDD+NWvfrXg+01+7v7+/jmfe926dVQqlU5EaTK33HLLTrdJKTn55JM5+eSTufTSS7n44ot529vexg033NBJwf785z/n5JNP3mUvprl+vqu/WyDQy4SUWSCwgpnwm1x22WVTbv/oRz865XulFM997nP50pe+NONmv2XLlkVZj7WW4eHhKbetX7+e/fbbb0pU5LDDDuO///u/yfO8c9tXv/pV7rrrrin33bZt25Tv4zjm4Q9/ON57iqKYcQ2nnnoq/f39XHzxxTMes6vf9bnPfS4///nP+Zd/+Zedfrar6Nixxx7LYYcdxvvf/37GxsZmfW6lFKeeeipf/vKXufPOOzs//81vfsPXv/71KffZvn37To8zEX2aeE1f8IIXcPfdd/PpT396p2ObzSbj4+Od72u12k5idL5/t0CglwkRokBgBXPsscfy3Oc+lw996ENs27atU3b/29/+FpgaDXjve9/LDTfcwPHHH88555zDwx/+cLZv385Pf/pTvvWtb8248S6U0dFRDjjgAJ73vOdx9NFHU6/X+da3vsWPfvQjPvCBD3SOO/vss/niF7/In/zJn/CCF7yA3/3ud3zuc5+bYjYH+OM//mM2btzIiSeeyIYNG/jNb37Dxz72MU477TT6+vpmXEN/fz+f+MQneOlLX8oxxxzDn//5n7Nu3TruvPNOrr32Wk488UQ+9rGPzfo7vPnNb+aLX/wiz3/+83n5y1/Osccey/bt2/nKV77C5ZdfztFHHz3rfaWUXHHFFTz96U/nEY94BGeddRb7778/d999NzfccAP9/f3827/9GwAXXngh119/PU984hM599xzMcZ0ei794he/6DzmRRddxHe/+11OO+00Dj74YB544AEuu+wyDjjgAJ7whCcA8NKXvpSrr76aV77yldxwww2ceOKJWGu5+eabufrqq/n617/OYx/7WKB8z3zrW9/i0ksvZb/99uOQQw7hoQ996Lz+boFAT7OMFW6BwD7BQsvuZyptnl6GPnHf6aXW00vMvfd+fHzcn3feeX716tW+Xq/7Zz/72f6WW27xgH/ve9875f7333+/P++88/yBBx7ooyjyGzdu9CeffLL/1Kc+tcvf54477vCA/8xn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0Ud3hvBKKXdKSU50Hgc48MADueWWW7jsssuoVCqce+65nHTSSVOOmbz+TZs2TVn/TTfdxC233MKb3/zmGdd3xBFHMDw8PG/xctRRR3Huuefyuc99jm9+85t885vf5D/+4z8A+MxnPsONN97I4x//eD7/+c9zxBFH8N///d/zety9xbIKorGxsc4fBcqy+ptuuok777wTKNNdL3vZyzrHv/KVr+T222/nr/7qr7j55pu57LLLuPrqq3nDG96wHMsPBAKBfQIpBEoKzLRIkHEeJQWyy7wgC+WhD33oTh6l6d8fc8wx3HLLLTzkIQ/Z6UvK3d9KtdaccsopXHLJJfziF7/gf//3f/n3f/93oKwSmyxGRkZGuOOOO6bcv1KpcPrpp/ORj3yE73znO51IzXSOOeYY7rvvPrTWO61/7dq1M67tec97HnEcc8kll8z48wnhNhMPf/jDgbK9zgSPecxjeOtb38p//dd/cdRRR/FP//RPs95/OVjWsvsf//jHPOUpT+l8/8Y3vhGAM844g6uuuop77723I44ADjnkEK699lre8IY38OEPf5gDDjiAK664IpTcBwKBwBIipSDVsu0hcui2OLLWU0sUUva2IHrNa17DSSedxKWXXsrpp5/Ov//7v3PddddNSRedf/75PPOZz+Sggw7iec97HlJKfv7zn/OrX/2Kv/3bv92t5/3qV7/K7bffzkknncSqVav42te+hnOOhz70oQA89alP5aqrruL0009ncHCQ888/H6VU5/5XXXUV1lqOP/54qtUqn/vc56hUKhx88ME7Pdcpp5zCCSecwLOf/WwuueQSjjjiCO655x6uvfZanvOc5/DYxz52p/sceOCBfPCDH+TVr341IyMjvOxlL2Pz5s384Q9/4B/+4R+o1+t84AMf4FWvehX77bcfT33qUzsm+L/9279l3bp1nHDCCdxxxx186lOf4lnPehb77bcft9xyC7feeuuUgEc3sKyC6MlPfvKcFQozdaF+8pOfzM9+9rMlXFUgEAgEppNG5UbcMo7MOJQU1BLVub2XOfHEE7n88su58MILefvb386pp57KG97wBj72sY91jjn11FP56le/ykUXXcT73vc+oijiYQ97GGefffZuP+/g4CDXXHMNF1xwAa1Wi8MPP5x//ud/5hGPeARQZknuuOMOnvnMZzIwMMC73vWuKRGiwcFB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eMPwfR4FnmhBdOnSJYwxvPrqqyd+/uqrr/Lcc8+d+pnnnnvuvt5fliVlWT6cDd7iDYv76Y6d5zN3e8/DXMzuKPrutq1aRnGnFWmnvf+sglZrhT0jue5+9u08230/uJ9zWGjLJWfZC2lT3Gmjztze40XXaVyTs/b1tZzr+zqGD+G43e37HgVp9kEKheqMY327seDD7n68luN8r2P3sM8dnDwOG85ReXJk+Ch+7xsFZ/c8HwOKouDd7343H/nIRzY/SynxkY98hJdffvnUz7z88ssn3g/wYz/2Y2e+f4stnlYcH++90X7vk9q3+4W1MvYqCnOu7T1tv86zr6/leDxNx/Bhbsu6UNitHHu125B8192v9e+yVp/7WN/rO58kHud5fJqPw+sBT3xk9t3f/d18+7d/O+95z3t473vfy5/9s3+W5XLJH/yDfxCA/+6/++948cUX+eAHPwjAd33Xd/EN3/AN/Jk/82f45m/+Zj70oQ/xsz/7s/x//9//9yR3Y4sttthii/vAo+hUbLsfgu1xeG144gXRt3zLt3Dt2jW+//u/n1deeYXf/Jt/M//iX/yLDXH6c5/7HPqYRfrXf/3X83f+zt/h//w//0/+2B/7Y7zzne/kwx/+8Bvag2iLLbbYYosttni0eOI+RI8bb1Yfoi222GKLLbZ4PeNRr99PlEO0xRZbbLHFFlts8TRgWxBtscUWW2yxxRZvemwLoi222GKLLbbY4k2PbUG0xRZbbLHFFlu86bEtiLbYYosttthiizc9tgXRFltsscUWW2zxpse2INpiiy222GKLLd702BZEW2yxxRZbbLHFmx7bgmiLLbbYYosttnjT44lHdzxurI25Z7PZE96SLbbYYostttjivFiv248qYONNVxDduHEDgLe+9a1PeEu22GKLLbbYYov7xY0bN9jd3X3o3/umK4guXLgASGjsozigW5wfs9mMt771rXz+85/f5so9Bdiej6cH23Px9GB7Lp4eHB0d8dJLL23W8YeNN11BpLXQpnZ3d7cX91OCnZ2d7bl4irA9H08Ptufi6cH2XDw9WK/jD/17H8m3brHFFltsscUWW7yOsC2Itthiiy222GKLNz3edAVRWZb8wA/8AGVZPulNedNjey6eLmzPx9OD7bl4erA9F08PHvW5UPlR6de22GKLLbbYYostXid403WItthiiy222GKL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55/7uZ/Lv/f3/t5TZfdf+7Vfm3/6p386/9RP/VR+5zvfuZXdvwb8z//z/5x3d3fzT/zET5yQta5Wq817/vAf/sP5pZdeyj/+4z+ef/Znfza//PLL+eWXX968vpa1/vbf/tvzJz7xifwv/sW/yM8888xWXnyf+J7v+Z78kz/5k/kzn/lM/rmf+7n8Pd/zPVkplf/lv/yXOefteXjSOK4yy3l7Ph4X/ugf/aP5J37iJ/JnPvOZ/G//7b/N73//+/OlS5fy1atXc86P9zy8qQqinHP+C3/hL+SXXnopF0WR3/ve9+Z//+///ZPepDcc/tW/+lcZuOOfb//2b885i/T++77v+/Kzzz6by7LM3/iN35g/+clPnviOGzdu5G/91m/Nk8kk7+zs5D/4B/9gns/nT2BvXt847TwA+Yd+6Ic272maJv8v/8v/kvf39/NoNMq///f//nzlypUT3/PZz342f9M3fVOu6zpfunQp/9E/+kez9/4x783rG//D//A/5Le97W25KIr8zDPP5G/8xm/cFEM5b8/Dk8btBdH2fDwefMu3fEt+/vnnc1EU+cUXX8zf8i3fkj/96U9vXn+c50HlnPNr7m1tscUWW2yxxRZbvAHwpuEQbbHFFltsscUWW5yFbUG0xRZbbLHFFlu86bEtiLbYYosttthiizc9tgXRFltsscUWW2zxpse2INpiiy222GKLLd702BZEW2yxxRZbbLHFmx7bgmiLLbbYYosttnjTY1sQbbHFFk8VPvvZz6KU4hOf+MST3pRToZTiwx/+8JPejC222OIhY5t2v8UWW7yh8d//9/89h4eHD62IuXLlCvv7+w/lu7bYYounB9uCaIsttngk8N7jnHvSm/HQsU0y32KLNya2I7Mtttji3Egp8af+1J/iy77syyjLkpdeeon/+//+vzdjrr/39/4e3/AN30BVVfztv/23Afjrf/2v85Vf+ZVUVcVXfMVX8Jf/8l8+8Z0/8zM/w9d+7ddSVRXvec97+PjHP37i9YODA77t276NZ555hrqueec738kP/dAPbV7//Oc/z3/73/637O3tceHCBX7v7/29fPaznwXgB3/wB/mbf/Nv8o//8T9GKYVSip/4iZ+46z72fc93fud38vzzz1NVFW9729v44Ac/uHn9+MjsB3/wBzffe/yfH/7hH94crw9+8IO84x3voK5r3vWu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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# study_index='gs://genetics_etl_python_playground/releases/24.03/study_index'\n", + "# Study Index. It has different files for different datasource (FinnGen, GWASCat, eQTLcat).\n", + "# Credible_set. Please use Daniels’ notebook as a reference. For each subfolder:\n", + "\n", + "finngen_index_path=f\"{release_path}/{release_ver}/study_index/finngen\"\n", + "# finngen susie:\n", + "finngen_susie_path=f\"{release_path}/{release_ver}/credible_set/finngen_susie\"\n", + "\n", + "finngen_susie=session.spark.read.parquet(finngen_susie_path, recursiveFileLookup=True)\n", + "\n", + "# FinnGen:\n", + "finngen_index=session.spark.read.parquet(finngen_index_path, recursiveFileLookup=True)\n", + "# Number of CSs, studies.\n", + "sample_size_quartiles = finngen_index.stat.approxQuantile(\"nSamples\", [0.25, 0.5, 0.75], 0.01)\n", + "# Number of unique studyids with at leas one CS.\n", + "# Number of CSs with at leas one SNP with PIP>0.9\n", + "# The descriptive summary of 99% CS size and histogram/density plot\n", + "\n", + "credset_size_quartiles = finngen_susie.select(\"studyId\", \"region\", \"credibleSetIndex\", \"locus.posteriorProbability\").withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\"))).stat.approxQuantile(\"credset_size\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "finngen_susie.select(\"studyId\", \"region\", \"credibleSetIndex\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\"))).toPandas().plot.scatter(x=\"credset_size\", y=\"top_PP\", xlim=[0, 500], alpha=0.05, label=\"finngen susie CSs\", title=\"finngen susie credsets\")\n", + "\n", + "finngen_susie_fm=finngen_susie.select(\"studyId\", \"studyLocusId\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\")))\n", + "# The histogram/density plot for total sample size\n", + "#finngen_index.select(f.col(\"nSamples\")).toPandas().plot.hist(bins=10, alpha=0.5, label=\"FinnGen sample size\", title=\"FinnGen sample sizes\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique finngen pics CSs: 19967 in 1342 studies.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of finngen_pics CS with top SNP PP > 0.9: 7239\n", + "Summary of finngen_pics sample sizes: L.quart: 316100.0 Median: 392089.0 U.quart: 409683.0\n", + "Summary of finngen_pics credset sizes: Mean: 36.04337156307908 L.quart: 1.0 Median: 7.0 U.quart: 30.0\n" + ] + }, + { + "data": { + "image/png": "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fOQjufvd785Xv/rVNT13JBIJREEUiWxxzjrrrMPu27Zt22GemsWO3bZtG8DcsTfffDNSSs4999wFx93tbndbcPvOO+9kcnKS97znPezatWvB16WXXgocbg5e6bnXwt3vfvcFtzudDqeeeio//OEPlzzne9/7Hve4xz2WNaa/4AUv4LzzzuNxj3scZ5xxxpxwWYmxsTEAZmZmVvcDABdffDGf//znmZyc5Etf+hIvfOELufnmm3n84x8fjdWRyBEQPUSRyBZHKbXo/X6RjhxrOXY5nHMA/K//9b945jOfuegx97vf/Y7Lcx9Pdu/ezY033sjnP/95PvvZz/LZz36W97///TzjGc/gAx/4wJLn3fOe9wTgX//1X+ciX6ul1WrxyEc+kkc+8pHs3LmTq666is9+9rNLvq6RSGRxYoQoEokcM84++2ycc/zgBz9YcP+h1WC7du2i2+1ireXCCy9c9Ot4Vkv913/914LbvV6PW2+9lXPOOWfJc+5617ty00030TTNstdO05RLLrmEa6+9lu9973v85m/+Jh/84AeXrYi75JJLAPjzP//z1f8Qi/DgBz8YgFtvvfWorhOJbEWiIIpEIseMiy++GIBrr712wf3veMc7FtxWSvHEJz6Rj3/84/zbv/3bYde58847j98igfe85z0LhM2f/MmfYIzhcY973JLnPPGJT2Tv3r28853vPOyx2SjVvn37FtwvpZyLdFVVteS1H/rQh/ILv/ALvPe97+WTn/zkYY/Xdc1LX/rSuds33HDDoteZ9UDd4x73WPK5IpHI4sSUWSQSOWY86EEP4olPfCJvfetb2bdv31zZ/ezYifkl7X/wB3/AF77wBc4//3wuu+wy7n3ve7N//36++c1v8rd/+7fs37//uK2zrmse+9jH8uu//uvcdNNNXHvttTziEY/gl3/5l5c85xnPeAYf/OAHeclLXsLXvvY1HvnIR9Lv9/nbv/1bXvCCF/CEJzyB5zznOezfv5/HPOYxnHHGGdx888284x3v4AEPeAD3ute9ll3TBz/4QX7+53+eX/3VX+WSSy7hsY99LO12m//6r//iwx/+MLfeeutcL6InPOEJnHvuuVxyySXc9a53nVvH//2//5eHPOQhcxGnSCSyeqIgikQix5QPfvCDnHLKKfyf//N/+Ku/+isuvPBCPvKRj3CPe9xjwdiQPXv28LWvfY3XvOY1fOITn+Daa69lx44d/NRP/dSCvkbHg3e+85186EMf4tWvfjVN0/CUpzyFt7/97csOv1VK8ZnPfIZrrrmGv/iLv+DjH/84O3bs4BGPeAT3ve99geCJes973sO1117L5OQkp5xyCk960pO48sorkXL5gPyuXbv46le/yrXXXstHPvIRXvnKV1LXNWeffTa//Mu/vKCP0Xvf+17++q//mo9+9KPccssteO+5y13uwitf+Upe9rKXxY7kkcgREGeZRSKR486NN97IAx/4QP78z/+cpz3taeu2juuuu45LL72Ur3/963N+m0gkEoHoIYpEIseY4XB42H1vfetbkVLycz/3c+uwokgkElmZGFeNRCLHlDe+8Y184xvf4NGPfjRa67ny8+c+97mceeaZx+U5h8MhU1NTyx6zffv24/LckUjk5CAKokgkckx52MMexvXXX8/VV19Nr9fjrLPO4sorr1wwrf1Y85GPfGSuoeNSfOELXzhuzx+JRDY/0UMUiUQ2Pbfeeiv/3//3/y17zIMe9KC57taRSCRyKFEQRSKRSCQS2fJEU3UkEolEIpEtz5bzEDnnuOWWW+h2u8v2HIlEIpFIJLJx8N4zMzPDaaedtmJfryNhywmiW2655bhVukQikUgkEjm+/PjHP+aMM8445tfdcoKo2+0C4QUdGxtb59VEIpFIJBJZDdPT05x55plz+/ixZssJotk02djYWBREkUgkEolsMo6X3SWaqiORSCQSiWx5oiCKRCKRSCSy5YmCKBKJRCKRyJZny3mIIpFIJLIyzjnqul7vZUS2GGmaHpeS+tUQBVEkEolEFlDXNT/4wQ9wzq33UiJbDCkl5557LmmanvDnjoIoEolEInN477n11ltRSnHmmWeu26f1yNZjtnHyrbfeyllnnXXCmydHQRSJRCKROYwxDAYDTjvtNFqt1novJ7LF2LVrF7fccgvGGJIkOaHPHaV/JBKJROaw1gKsS8oiEpn9u5v9OzyRREEUiUQikcOIsx4j68F6/t1FQRSJRCKRSGTLs66C6Etf+hKXXHIJp512GkIIPvnJT654zhe/+EV++qd/mizLuNvd7sZ11113RM99nys+zzkv//QRnRuJRCKRjYX3nuc+97ls374dIQQ33ngjF1xwAS960YvWe2mRTcK6CqJ+v8/9739//viP/3hVx//gBz/gl37pl3j0ox/NjTfeyIte9CKe85zn8PnPf/6I13DOyz8dhVEkEolscj73uc9x3XXX8Td/8zfceuut3Oc+9+ETn/gEV1999Xov7ZhxwQUXIIRACEGe59z73vfm2muvnXv8uuuuY2JiYsE5dV3zxje+kfvf//60Wi127tzJwx/+cN7//vfTNA0Ad955J89//vM566yzyLKMU045hYsvvpi///u/X3Y909PTvPKVr+Se97wneZ5zyimncOGFF/KJT3wC7z0Q9u2nPvWpnHbaaeR5zhlnnMETnvAEvvOd7xzbF+cYsK5VZo973ON43OMet+rj3/Wud3Huuefypje9CYB73etefOUrX+Etb3kLF1988fFaZiQSiUQ2ON/73vc49dRTedjDHjZ33/bt29dxRceHyy67jNe85jUMBgM++MEP8sIXvpBt27bxlKc85bBj67rm4osv5tvf/jZXX301D3/4wxkbG+Mf//Ef+aM/+iMe+MAH8oAHPIAnPvGJ1HXNBz7wAe5yl7tw++23c8MNN7Bv374l1zE5OckjHvEIpqameO1rX8tDHvIQtNb83d/9Hb/7u7/LYx7zGNrtNhdddBH3uMc9+MQnPsGpp57Kf//3f/PZz36WycnJ4/gqHSF+gwD4v/qrv1r2mEc+8pH+8ssvX3Df+973Pj82NrbkOWVZ+qmpqbmvH//4xx7wZ77oo/7sl/3Ngq9IJBLZ6gyHQ//v//7vfjgcHvW1rHW+MdZb647Bypbmmc98pgfmvs4++2zvvfePetSjFuwZZ599tr/mmmv8pZde6judjj/zzDP9u9/97rnHf/CDH3jAf/zjH/cXXHCBL4rC3+9+9/Nf/epXFzzfe97zHn/GGWf4oij8r/zKr/g3velNfnx8fMExn/zkJ/0DH/hAn2WZP/fcc/2VV17pm6aZexzwf/qnf+p/5Vd+xRdF4e92t7v5v/7rv1725zz05/He+7vf/e7+yU9+svfe+/e///0L1vGGN7zBSyn9N7/5zcOuVde17/V6/sCBAx7wX/ziF5d97kN5/vOf79vttv/JT35y2GMzMzO+aRr/rW99ywP+hz/84aqvu9zf39TUlAf81NTUmta6WjaVqfq2225jz549C+7bs2cP09PTDIfDRc95/etfz/j4+NzXmWeeueT1nfPHdL2RSCSyFfHeM6wNU2XD5LBhqmwY1mYujXKsedvb3sZrXvMazjjjDG699Va+/vWvL3nsm970Jh784AfzrW99ixe84AU8//nP56abblpwzCtf+Upe+tKXcuONN3LeeefxlKc8BWMMAH//93/P8573PC6//HJuvPFGLrroIq655poF53/5y1/mGc94Bpdffjn//u//zrvf/W6uu+66w4676qqr+PVf/3X+5V/+hV/8xV/kaU97Gvv371/Tz14UxZIjVj70oQ9x4YUX8sAHPvCwx5Ikod1u0+l06HQ6fPKTn6SqqlU9p3OOD3/4wzztaU/jtNNOO+zxTqeD1ppdu3YhpeRjH/vYupTRr5VNJYiOhFe84hVMTU3Nff34xz9e8tif7JuhXzbH7T9tJBKJbAXKxtKvwgaY6bDN9CtL2RyfTXF8fJxut4tSilNOOYVdu3Yteewv/uIv8oIXvIC73e1uvOxlL2Pnzp184QtfWHDMS1/6Un7pl36J8847j6uuuoqbb76Z7373uwC84x3v4HGPexwvfelLOe+883jBC15wmPXjqquu4uUvfznPfOYzuctd7sJFF13E1Vdfzbvf/e4Fxz3rWc/iKU95Cne729143eteR6/X42tf+9qqfmZrLX/+53/Ov/zLv/CYxzxm0WP+67/+i3ve857LXkdrzXXXXccHPvABJiYmePjDH87v/d7v8S//8i9LnrN3714OHDiw4rVPP/103v72t/PqV7+abdu28ZjHPIarr76a73//+yv/gOvAphJEp5xyCrfffvuC+26//XbGxsYoimLRc7IsY2xsbMHXUrzuE1/hmz+8gzsm+1S1oawMdWNj5CgSiURWiXOe0jiUEiRKIkT4rpSgNG7d30/vd7/7zf1bCMEpp5zCHXfcseQxp556KsDcMTfddBM/8zM/s+D4Q29/+9vf5jWvec1c9KXT6XDZZZdx6623MhgMFn2edrvN2NjYYWs5lGuvvZZOp0NRFFx22WW8+MUv5vnPf/6ix672w/0Tn/hEbrnlFj71qU/xC7/wC3PV3EtVca8laPDCF76Q2267jQ996EM89KEP5S//8i/5qZ/6Ka6//vpVX+NEsalGdzz0oQ/lM5/5zIL7rr/+eh760Icek+t/9gee03bfwp0zFadtb6OUJFOK7a2U7Z2MItWrbhrlnMd5jxQCKWODs0gksjVw3mOdn4sMzaKloDIuvC+yfu+Jh46DEEIcNsR2/jGz7/lrGXTb6/W46qqr+NVf/dXDHsvzfE1rOZSnPe1pvPKVr6QoCk499dRlZ82dd955q67myvOciy66iIsuuohXvepVPOc5z+GKK67gWc961mHH7tq1i4mJiVVfu9vtcskll3DJJZfw2te+losvvpjXvva1XHTRRas6/0SxrhGiXq/HjTfeyI033giE8rwbb7yRH/3oR0BIdz3jGc+YO/55z3se3//+9/nd3/1dvvOd73Dttdfy0Y9+lBe/+MXHbE3/eNMdfP37+7np1klumy659cCAm/f1+NH+Pv2yWXCscx5jwyee2X9b605o7jwSiUQ2ElIIlBSYQyJBxnmUFMhN3gH7Hve4x2EepUNv//RP/zQ33XQTd7vb3Q77OtphuePj49ztbnfj9NNPX/FaT33qU/nbv/1bvvWtbx32WNM09Pv9Jc+9973vveTjUkqe/OQn86EPfYhbbrnlsMd7vd6c5+pQhBDc8573XPa514t1jRD98z//M49+9KPnbr/kJS8B4JnPfCbXXXcdt95665w4Ajj33HP59Kc/zYtf/GLe9ra3ccYZZ/De9773mJbc3zQJ8id3kGiB9SCFJB1IZsqGxljO2dGlnWsq4yiNw1hHYx0C0EJQGovz0C0SMi0xzs/l0ov06F/uGHmKRCIbGSkFuZaj9z2HHokjaz3tTG36963f/u3f5ud+7ud485vfzCWXXML/+3//j89+9rMLsgevfvWrefzjH89ZZ53F//yf/xMpJd/+9rf5t3/7N1772teesLW+6EUv4tOf/jSPfexjufrqq3nEIx5Bt9vln//5n3nDG97An/3Zn3HmmWfya7/2azz72c/mfve739zjb3zjG3nCE56w5LWvueYavvjFL3L++edzzTXX8OAHP5gkSfjyl7/M61//er7+9a/zwx/+kCuuuIKnP/3p3Pve9yZNU/7u7/6O973vfbzsZS87Ya/DallXQXTBBRcsGzlZLH95wQUXLKp2jxUGuO2AZ+9EHyEE1jh0ojh1IqdXWpCC7UVKqjVaS7z39GtDXVu0FAyMxXuBELCtnZEoCQTxlGm/4pvBUoLHe0/ZWErjsKNPWrmW5ImKM4cikciGIk8UAKVxVMahpKCdqbn7NzMPf/jDede73sVVV13F7//+73PxxRfz4he/mHe+851zx1x88cX8zd/8Da95zWt4wxveQJIk3POe9+Q5z3nO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dHyHcNZliDo6Ojo6Ojo67koXEHV0dHR0dHSc9XQBUUdHR0dHR8dZTxcQdXR0dHR0dJz1nHUB0e/+7u/ykIc8hDRNufzyy/nUpz51pnfpu46/+qu/4kd/9Ec599xzUUrx/ve/f8fzIQRe/epXc84555BlGVdeeSX/+I//uGOb9fV1rrnmGkajEcvLy7zgBS9gOp2exqP47uC6667j+77v+xgOh+zZs4fnPOc53HzzzTu2KYqCF7/4xezatYvBYMCP//iPc/DgwR3b3HbbbTzzmc+k1+uxZ88efv7nf56maU7noXzH86Y3vYnHPe5xC4G//fv386EPfWjxfHcdzhy//uu/jlKKn/3Zn1081l2P08NrX/talFI7fh75yEcunj+t1yGcRbzrXe8KcRyH//W//lf44he/GF74wheG5eXlcPDgwTO9a99VfPCDHwy/9Eu/FN773vcGILzvfe/b8fyv//qvh6WlpfD+978//MM//EP4sR/7sfDQhz405Hm+2ObpT396uOSSS8InPvGJ8Nd//dfh4Q9/eHje8553mo/kO5+rrroqvPWtbw1f+MIXwk033RR+5Ed+JFx44YVhOp0utnnRi14ULrjggnD99deHT3/60+H7v//7w5Of/OTF803ThMc+9rHhyiuvDDfeeGP44Ac/GNbW1sIrX/nKM3FI37H8yZ/8SfjTP/3T8P/+3/8LN998c/jFX/zFEEVR+MIXvhBC6K7DmeJTn/pUeMhDHhIe97jHhZe+9KWLx7vrcXp4zWteEx7zmMeEO++8c/Fz+PDhxfOn8zqcVQHRk570pPDiF7948f/OuXDuueeG66677gzu1Xc3dw2IvPdh37594fWvf/3isc3NzZAkSfg//+f/hBBC+NKXvhSA8Pd///eLbT70oQ8FpVS44447Ttu+fzdy6NChAISPf/zjIQQ591EUhfe85z2Lbb785S8HINxwww0hBAlwtdbhwIEDi23e9KY3hdFoFMqyPL0H8F3GyspK+P3f//3uOpwhJpNJuPjii8OHP/zh8JSnPGUREHXX4/Txmte8JlxyySUnfO50X4ezpmRWVRWf+cxnuPLKKxePaa258sorueGGG87gnp1d3HLLLRw4cGDHdVhaWuLyyy9fXIcbbriB5eVlnvjEJy62ufLKK9Fa88lPfvK07/N3E1tbW8Axk+PPfOYz1HW943o88pGP5MILL9xxPf7ZP/tn7N27d7HNVVddxXg85otf/OJp3PvvHpxzvOtd72I2m7F///7uOpwhXvziF/PMZz5zx3mH7nNxuvnHf/xHzj33XB72sIdxzTXXcNtttwGn/zqcNeauR44cwTm346QB7N27l6985StnaK/OPg4cOABwwuuw/dyBAwfYs2fPjuettayuri626bjveO/52Z/9WX7gB36Axz72sYCc6ziOWV5e3rHtXa/Hia7X9nMdp87nP/959u/fT1EUDAYD3ve+9/HoRz+am266qbsOp5l3vetdfPazn+Xv//7v7/Zc97k4fVx++eW87W1v4xGPeAR33nknr3vd6/ihH/ohvvCFL5z263DWBEQdHWc7L37xi/nCF77A3/zN35zpXTlrecQjHsFNN93E1tYWf/RHf8S1117Lxz/+8TO9W2cdt99+Oy996Uv58Ic/TJqmZ3p3zmqe8YxnLP79uMc9jssvv5yLLrqIP/zDPyTLstO6L2dNyWxtbQ1jzN260w8ePMi+ffvO0F6dfWyf65Ndh3379nHo0KEdzzdNw/r6enetvkVe8pKX8IEPfICPfvSjnH/++YvH9+3bR1VVbG5u7tj+rtfjRNdr+7mOUyeOYx7+8Idz2WWXcd1113HJJZfw3//7f++uw2nmM5/5DIcOHeIJT3gC1lqstXz84x/nt37rt7DWsnfv3u56nCGWl5f53u/9Xr761a+e9s/FWRMQxXHMZZddxvXXX794zHvP9ddfz/79+8/gnp1dPPShD2Xfvn07rsN4POaTn/zk4jrs37+fzc1NPvOZzyy2+chHPoL3nssvv/y07/N3MiEEXvKSl/C+972Pj3zkIzz0oQ/d8fxll11GFEU7rsfNN9/MbbfdtuN6fP7zn98RpH74wx9mNBrx6Ec/+vQcyHcp3nvKsuyuw2nmiiuu4POf/zw33XTT4ueJT3wi11xzzeLf3fU4M0ynU772ta9xzjnnnP7PxX1uCf8O5l3veldIkiS87W1vC1/60pfCv/23/zYsLy/v6E7v+PaZTCbhxhtvDDfeeGMAwm/+5m+GG2+8MXz9618PIcjY/fLycvjjP/7j8LnPfS48+9nPPuHY/eMf//jwyU9+MvzN3/xNuPjii7ux+2+Bn/7pnw5LS0vhYx/72I6x1vl8vtjmRS96UbjwwgvDRz7ykfDpT3867N+/P+zfv3/x/PZY69Oe9rRw0003hT/7sz8Lu3fv7saL7yOveMUrwsc//vFwyy23hM997nPhFa94RVBKhb/4i78IIXTX4Uxz/JRZCN31OF383M/9XPjYxz4WbrnllvC3f/u34corrwxra2vh0KFDIYTTex3OqoAohBB++7d/O1x44YUhjuPwpCc9KXziE58407v0XcdHP/rRANzt59prrw0hyOj9q171qrB3796QJEm44oorws0337zjNY4ePRqe97znhcFgEEajUXj+858fJpPJGTia72xOdB2A8Na3vnWxTZ7n4d/9u38XVlZWQq/XC//iX/yLcOedd+54nVtvvTU84xnPCFmWhbW1tfBzP/dzoa7r03w039n863/9r8NFF10U4jgOu3fvDldcccUiGAqhuw5nmrsGRN31OD1cffXV4ZxzzglxHIfzzjsvXH311eGrX/3q4vnTeR1UCCF8y7mtjo6Ojo6Ojo7vAs6aHqKOjo6Ojo6OjnuiC4g6Ojo6Ojo6znq6gKijo6Ojo6PjrKcLiDo6Ojo6OjrOerqAqKOjo6Ojo+OspwuIOjo6Ojo6Os56uoCoo6Ojo6Oj46ynC4g6OjoeVNx6660opbjpppvO9K6cEKUU73//+8/0bnR0dNzPdG73HR0d39X81E/9FJubm/dbEHPnnXeysrJyv7xWR0fHg4cuIOro6HhAqOuaKIrO9G7c73RO5h0d3510JbOOjo5TxnvPf/2v/5WHP/zhJEnChRdeyH/+z/95UeZ697vfzVOe8hTSNOUd73gHAL//+7/Pox71KNI05ZGPfCT/43/8jx2v+alPfYrHP/7xpGnKE5/4RG688cYdz29sbHDNNdewe/dusizj4osv5q1vfevi+dtvv53nPve5LC8vs7q6yrOf/WxuvfVWAF772tfyv//3/+aP//iPUUqhlOJjH/vYSY+xqipe8pKXcM4555CmKRdddBHXXXfd4vnjS2avfe1rF697/M/b3va2xfm67rrreOhDH0qWZVxyySX80R/90bdw5js6Oh5ougxRR0fHKfPKV76St7zlLfy3//bf+MEf/EHuvPNOvvKVryyef8UrXsFv/MZvLAKcd7zjHbz61a/md37nd3j84x/PjTfeyAtf+EL6/T7XXnst0+mUZz3rWTz1qU/lD/7gD7jlllt46UtfuuM9X/WqV/GlL32JD33oQ6ytrfHVr36V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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# finngen (PICs):\n", + "finngen_index_path=f\"{release_path}/{release_ver}/study_index/finngen\"\n", + "finngen_index=session.spark.read.parquet(finngen_index_path, recursiveFileLookup=True)\n", + "finngen_pics_path=f\"{release_path}/{release_ver}/credible_set/finngen_pics\"\n", + "# Number of CSs.\n", + "finngen_pics=session.spark.read.parquet(finngen_pics_path, recursiveFileLookup=True)\n", + "#gwascat_sumstats.printSchema()\n", + "# keep only credible sets snps\n", + "\n", + "finngen_pics_fm=finngen_pics.select(\"studyId\", \"studyLocusId\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\")))\n", + "finngen_pics_fm.select(\"credset_size\", \"top_PP\").toPandas().plot.scatter(x=\"credset_size\", y=\"top_PP\", alpha=0.05, xlim=[0, 500], label=\"finngen PICS CS\", title=\"finngen_pics CS\")\n", + "sample_size_quartiles = finngen_index.stat.approxQuantile(\"nSamples\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "sample_size_quartiles = finngen_pics_fm.stat.approxQuantile(\"credset_size\", [0.25, 0.5, 0.75], 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 9966 common loci between finngen susie and finngen pics\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "correlation coef: 0.6244595901320829\n" + ] + }, + { + "data": { + "image/png": "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9Et505vexAte8AK+8iu/km/6pm86tn0uX77MX/trf41nPetZPPe5z+Xf/Jt/w/d93/fxuZ/7uXzVV33VwndP0i8/9VM/xXd+53fyJV/yJbziFa/g7rvv5uu//uvZ2trizjvvnH0vxsjXfu3X8iu/8it827d9G49//OP5/d//fV7zmtfwp3/6p/zCL/zCwr1PM3YPw9X02WG4//77edrTnsatt97K3/t7f4/NzU3uvvtu3vGOdxz5u9POhXm8613vwnvPC17wghM946Me9Sh+7dd+jT/4gz/gcz7nc07zeis8lHCzrasVVjgtuhP12972toXPD/PcZFm24Hn4vd/7vQSkn/zJnzzw25e85CULv3/mM5+Zzp8/P/v7b//2bycgffd3f/fC9170ohcdOK1+8zd/c3rYwx6WLly4sPDd5z//+WljYyNNJpOF93n84x+fqqqafe///X//3wSk3//93z9Js6SU9k7aT3ziE1Nd17PPf+RHfiQB6d/+2387+2y/V+Ff/It/kYD0Yz/2YweuG2NMKaX08pe/PK2vryfv/YmfKaWU3vOe9yQg/eIv/uLC53/9r//19NjHPnb296/7uq9LT3jCE0517Q60no55HOa5AdIb3/jG2WdVVaU77rgjPfvZzz7w2+P6paqqdP78+fSkJz0pNU0z+94b3vCGBc9iSim96U1vSlrr9N/+239beM5/+k//aQLSr/7qry68z0nG7nE4SZ+d1HPzzne+MwHpAx/4wJH3vNq5sAyveMUrEpD+x//4H0fes8N//I//MRljkjEmfeEXfmH63u/93vSe97xnYT6s8NDHimG3wkMeT33qU3nc4x43+/tf+At/gfX1df7X//pfB7777d/+7Qt//5Iv+RIuXrzIzs4OAO9+97sBeOlLX7rwve/6ru9a+HtKibe//e084xnPIKXEhQsXZn+e/vSns729ze/8zu8s/ObFL37xglfjS77kSwCWPudx+LZv+zacc7O//x//x/+BtZZf+qVfOvQ3b3/727nlllsOvAsw8/Zsbm4yHo9573vfe6rnecpTnsItt9zCW97yltlnly9f5r3vfS/Pe97zZp9tbm7ysY99jA984AOnuv5pMRwO+Vt/62/N/p5lGZ//+Z+/tK2P65ff+q3f4uLFi3zrt37rAufrG7/xG9na2lq41tve9jYe//jH81mf9VkLY+Ip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73vfzPPf/e53XRAE7pOf/KT78Y9/7C655BK5Cj5PC53ryy67zEVR5L7yla+4HTt2zPyanJxcqW/huLDQeT6Q3Jaan4XO80MPPeRarZZ75zvf6e699173ta99za1bt859/OMfX6lv4biw0Hm+5JJLXKvVcl/+8pfd/fff777xjW+4LVu2uDe+8Y0r9S0cFyYnJ92dd97p7rzzTge4T33qU+7OO+90P//5z51zzr3vfe9z559//szz01fB3/Oe97gf//jH7qqrrpKr4MeaT3/60+7Xfu3XXBRF7vnPf7777//+75mPvfSlL3UXXHDBfs//y7/8i9u6dauLosg9/elPd1//+teXecTHr4XM9ebNmx1w0K9LLrlk+Qd+nFnon+nZJLiZv4XO86233uq2b9/u4jh2J598svvrv/5rV1XVMo/6+LOQeS7L0n34wx92W7ZscUmSuE2bNrl3vOMdbu/evcs/8OPIf/3Xf8359+303F5wwQXupS996UHvefazn+2iKHInn3yyu/rqq5d8nMo52X8TQgghxOohOTdCCCGEWFUkuBFCCCHEqiLBjRBCCCFWFQluhBBCCLGqSHAjhBBCiFVFghshhBBCrCoS3AghhBBiVZHgRghx3Pr1X/91/vzP/3ylhyGEOMZIcCOEOG5dd911i9bF+ZZbbkEpNfNrbGyM3/3d3+X++++feeakk06a+Xij0eA5z3kO11577aJ8fSHE4pHgRghx3BoZGaHVai3q57z33nt5+OGHufbaa/nRj37Ea1/7Wuq6nvn4Rz/6UXbs2MGdd97J8573PM477zxuvfXWRR2DEOLoSHAjhFhyX/nKV9i2bRtpmrJmzRrOPvts2u32nMdKr3vd63jb294289+f+cxnOPXUU0mShLGxMd7whjfMfOzA9+d5zrvf/W5OOOEEGo0G27dv55ZbblnQWNetW8eGDRt4yUtewoc+9CHuuece7rvvvpmPt1ot1q9fz9atW7nqqqtI05R///d/X9DXEEIsrWClByCEWN127NjBm970Ji6//HJe//rXMzk5ybe//W3m09buBz/4AX/6p3/KP/3TP3HWWWexZ88evv3tbx/y+Xe+853cc889XHPNNWzcuJHrr7+eV77yldx9992ceuqpCx57mqYAFEUx58eDICAMw0N+XAixMiS4EUIsqR07dlBVFb/zO7/D5s2bAdi2bdu83vvQQw/RaDR4zWteQ6vVYvPmzZx++umHfPbqq6/moYceYuPGjQC8+93v5sYbb+Tqq6/mE5/4xILH/clPfpITTjiBpz71qQd9vCgKrrjiCsbHx3n5y1++oM8thFhaEtwIIZbUs571LH7jN36Dbdu2cc455/CKV7yCN7zhDQwPDz/he3/zN3+TzZs3c/LJJ/PKV76SV77ylbz+9a8ny7KDnr377rup65qtW7fu93qe56xZs2be4z3xxBNxztHpdHjWs57Fv/7rvxJF0czH3/ve9/LBD36QXq9Hs9nksssu49xzz5335xdCLD0JboQQS8oYw0033cStt97KN77xDT796U9z8cUX873vfQ+t9UHHU2VZzvx7q9Xijjvu4JZbbuEb3/gGH/rQh/jwhz/M//zP/zA0NLTf+6ampjDGcPvtt2OM2e9jzWZz3uP99re/zcDAAOvWrZszWfk973kPb3vb22g2m4yNjaGUmvfnFkIsD0koFkIsOaUUL3zhC/nIRz7CnXfeSRRFXH/99axdu5YdO3bMPFfXNf/3f/+333uDIODss8/m8ssv53//93958MEH+eY3v3nQ1zj99NOp65pHHnmEU045Zb9f69evn/dYn/KUp7Bly5ZD3sIaHR2d+ZwS2AhxbJKdGyHEkvre977HzTffzCte8QrWrVvH9773PR599FGe9rSn0Wg0uOiii/j617/Oli1b+NSnPsW+fftm3vu1r32N+++/n5e85CUMDw9zww03YK2dMwdm69atvOUtb+Gtb30rV1xxBaeffjqPPvooN998M8985jPl6EiIJxEJboQQS2pgYIBvfetbXHnllUxMTLB582auuOIKXvWqV1GWJT/84Q9561vfShAEvOtd7+JlL3vZzHuHhoa47rrr+PCHP0yv1+PUU0/ly1/+Mk9/+tPn/FpXX301H//4x/mLv/gLfvWrXzE6OsoLXvACXvOa1yzXtyuEOAYoN5/7mEIIIYQQxwnJuRFCCCHEqiLBjRDiSeFVr3oVzWZzzl8LrYEjhDi2ybGUEOJJ4Ve/+hXdbnfOj42MjDAyMrLMIxJCLBUJboQQQgixqsixlBBCCCFWFQluhBBCCLGqSHAjhBBCiFVFghshhBBCrCoS3AghhBBiVZHgRgghhBCrigQ3QgghhFhVJLgRQgghxKry/wFTgEOM42+e8AAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "finngen_matching=finngen_pics_fm.withColumnRenamed(\"top_PP\", \"pics_PP\").join(finngen_susie_fm.withColumnRenamed(\"top_PP\", \"susie_PP\"), on=[\"studyId\", \"studyLocusId\"], how=\"inner\")\n", + "finngen_matching.select(\"pics_PP\", \"susie_PP\").toPandas().plot.scatter(x=\"susie_PP\", y=\"pics_PP\", alpha=0.05, title=\"finngen_pics vs finngen_susie CS\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique eQTLcat studies: 1801315\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unqiue eQTLcat tissues: 76\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ingested 2055350 Credible sets from 1801315 eQTL catalog studies\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of eQTL catalog sample sizes: Mean: 336.1455965527037 L.quart: 190.0 Median: 322.0 U.quart: 483.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of eQTL catalog studies with at least one CS: 1801315\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of CS with top SNP PP > 0.9: 386227\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 146:===============================================> (32 + 5) / 37]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of eQTL credible set sizes: L.quart: 3.0 Median: 10.0 U.quart: 27.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "eqtl_index_path=f\"{release_path}/{release_ver}/study_index/eqtl_catalogue\"\n", + "# eQTLcat:\n", + "# Number of studies\n", + "eqtl_index=session.spark.read.parquet(eqtl_index_path, recursiveFileLookup=True)\n", + "# Number of tissues, list of tissues\n", + "#eqtl_index.select(f.col(\"biosampleFromSourceId\")).distinct().show(truncate=False)\n", + "\n", + "# Credible_set. Please use Daniels’ notebook as a reference. For each subfolder:\n", + "# eqtl catalog susie:\n", + "eqtlcat_susie_path=f\"{release_path}/{release_ver}/credible_set/eqtl_catalogue_susie\"\n", + "# Number of CSs.\n", + "eqtlcat_susie=session.spark.read.parquet(eqtlcat_susie_path, recursiveFileLookup=True)\n", + "\n", + "\n", + "# Number of CSs, studies.\n", + "sample_size_quartiles = eqtl_index.stat.approxQuantile(\"nSamples\", [0.25, 0.5, 0.75], 0.01)\n", + "# Number of unique studyids with at leas one CS.\n", + "# Number of CSs with at leas one SNP with PIP>0.9\n", + "# The descriptive summary of 99% CS size and histogram/density plot\n", + "\n", + "credset_size_quartiles = eqtlcat_susie.select(\"studyId\", \"region\", \"credibleSetIndex\", \"locus.posteriorProbability\").withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\"))).stat.approxQuantile(\"credset_size\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "# Out of mem error:\n", + "#eqtlcat_susie.select(\"studyId\", \"region\", \"credibleSetIndex\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\"))).toPandas().plot.scatter(x=\"credset_size\", y=\"top_PP\", xlim=[0, 500], alpha=0.05, label=\"finngen susie CSs\", title=\"finngen susie credsets\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique gwascat studies: 79858\n", + "Number of unique SUMSTATS gwascat studies: 18435\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique gwas catalog sumstats CSs: 247782 in 9679 studies.\n", + "Summary of SUMSTATS gwas sample sizes: L.quart: 88329.0 Median: 357580.0 U.quart: 445573.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of SUMSTATS CS with top SNP PP > 0.9: 77721\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of SUMSTATS gwascat pics credset sizes: Mean: 39.7659733230078 L.quart: 1.0 Median: 8.0 U.quart: 35.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique gwas catalog curated CSs: 531198 in 35662 studies.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of CURATED CS with top SNP PP > 0.9: 92000\n", + "Summary of CURATED gwas sample sizes: L.quart: 687.0 Median: 4960.0 U.quart: 21282.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of CURATED gwascat pics credset sizes: Mean: 35.42119007174911 L.quart: 1.0 Median: 8.0 U.quart: 34.0\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADywElEQVR4nOzdd5ydVZ348c8552m3TElPKBLAIE0BUfjRdYkiQmxbsCzNVVdFF8WC/FBAdgFdBbuyq4i61h8soCtYAEUBaQJZC006SBLSpt3ylHPO749n5pJJY5JMMpPk+345hnnmufeee5O59/uc8z3fr/Lee4QQQgghthF6ogcghBBCCDGeJLgRQgghxDZFghshhBBCbFMkuBFCCCHENkWCGyGEEEJsUyS4EUIIIcQ2RYIbIYQQQmxTJLgRQgghxDZFghshhBBCbFMkuBFCCCHENkWCGyHEGp555hnOO+88Fi5cONFD2SzG4/ldd911nHfeeeM2JgClVOdLa80OO+zAq1/9am666aZR582dO5fjjz9+jdu3220+97nPcfDBB9PT00OSJOyxxx68733v46GHHhp17i233MKxxx7LjjvuSJIkvOAFL2DBggV8//vfH/N4r776ao499limT59OFEXssMMO/MM//AO/+tWvRp33+OOPc+qpp7L77ruTJAmzZ8/myCOP5Nxzzx37iyPEBlDSW0oIsbrf//73vPzlL+fyyy/nlFNOmejhjLvxeH7ve9/7+MpXvsJ4voUqpXjVq17FSSedhPeexx57jK9+9as8++yzXHvttRx77LFAGdzsu+++/PSnP+3cdtmyZbzmNa/h7rvv5vjjj2f+/PnU63UefPBBfvjDH7J48WKyLAPgiiuu4IQTTmD//ffnzW9+M1OmTOGxxx7jt7/9LWEY8utf/3q94/Te8/a3v51vfetbHHDAAfzd3/0ds2fPZtGiRVx99dXcfffd3HrrrRx66KE8/PDDvPzlL6dSqfD2t7+duXPnsmjRIu655x5+9rOf0W63x+31E2JEMNEDEEII8Zw99tiDf/zHf+x8/8Y3vpGXvOQlfP7zn+8EN2tzyimncO+993LllVfyt3/7t6N+9q//+q+cffbZne/PO+889t57b26//XaiKBp17rPPPvu8Y7z44ov51re+xQc+8AEuueQSlFKdn5199tn813/9F0FQfrx87nOfY2hoiIULF7LLLrts8GMJsVG8EGK9fv3rX/sDDzzQx3Hsd9ttN3/ppZf6c88916/66/PGN77RH3DAAaNud/zxx3vA//jHP+4cu/322z3gr7vuOu+998uXL/cf+tCH/L777utrtZrv6uryr3nNa/zChQvXGMcXv/hFv/fee/tKpeJ7e3v9gQce6L/3ve+NOufpp5/2b3/72/2cOXN8FEV+7ty5/t3vfrdP03TMj/frX//aA2t8XX755et8jQYGBvzpp5/ud9llFx9FkZ8xY4afP3++v/vuuzvn7LLLLv7kk09e47ZHHXWUP+qoo9Z4/B/96Ef+vPPO8zvssIOv1+v+b//2b31fX59vt9v+9NNP9zNmzPC1Ws2fcsopvt1uj7rPX/7yl/6www7zPT09vlar+T322MOfddZZY3p+v/3tb/3f/d3f+Z133tlHUeR32mkn/4EPfMA3m83O/Z988slrvY8RP/jBD/xLX/pSX6/XfVdXl99333395z//+XW+fiMAf9ppp61xfPr06X7evHmjXsvjjjuu8/3Iv6t3vvOdz/sY3nsfx7E/5ZRTxnTu6prNpp86darfc889fVEUz3v+Mccc4+fOnbtRjyXExpKZGyHW49577+U1r3kNc+bM4ZOf/CTWWs4//3xmzJgx6rwjjjiCH//4xwwMDNDd3Y33nltvvRWtNTfffDOve93rALj55pvRWnPYYYcB8Oijj3LNNdfw93//9+y6664sWbKE//iP/+Coo47ivvvuY4cddgDg61//Ov/yL//C3/3d33H66afTbrf5wx/+wB133MFb3/pWoMwjOeigg+jr6+Nd73oXe+65J3/961+58soraTabRFE0psfba6+9OP/88znnnHN417vexRFHHAHAoYceus7X6d3vfjdXXnkl73vf+9h7771Zvnw5t9xyC/fffz8vfelLN+q1v+iii6hUKnzsYx/j4Ycf5ktf+hJhGKK1ZuXKlZx33nncfvvtfOtb32LXXXflnHPOAeDPf/4zxx9/PC95yUs4//zzieOYhx9+mFtvvRXgeZ/fFVdcQbPZ5D3veQ/Tpk3jzjvv5Etf+hJPP/00V1xxBQD//M//zDPPPMP111/Pf/3Xf40a9/XXX89b3vIWjj76aD796U8DcP/993Prrbdy+umnb/DrsHLlSlauXMkLX/jCdZ7zk5/8BIATTzxxTPe5yy67cOONN/L000+z0047bdB4brnlFlasWMEHPvABjDFjeqwbbriBX/3qV/zN3/zNBj2WEBttoqMrISazBQsW+Gq16v/61792jv3lL3/xQRCMulK/6667Rs3I/OEPf/CA//u//3t/8MEHd8573eteN2qGp91ue2vtqMd87LHHfBzH/vzzz+8ce/3rX+/32Wef9Y71pJNO8lprf9ddd63xM+fcBj3eyPNZ32zNqnp6etY647CqDZ252XfffX2WZZ3jb3nLW7xSyh977LGjbn/IIYf4XXbZpfP95z73OQ/4pUuXrnMs63t+q87QjLjooou8Uso/8cQTnWOnnXaaX9tb6Omnn+67u7vHNKuxOsD/0z/9k1+6dKl/9tln/R133OGPPvpoD/iLL764c97qMzdvfOMbPeBXrlw5pse57LLLPOCjKPKvfOUr/Sc+8Ql/8803r/FvY22+8IUveMBfffXVY3qsP/3pT75SqXjA77///v7000/311xzjW80GmO6vRAbQ3ZLCbEO1lpuuOEG3vCGN3RmUABe+MIXrpH7cMABB1Cv1/ntb38LlDM0O+20EyeddBL33HMPzWYT7z233HJLZ6YAII5jtNadx1u+fDn1ep0XvehF3HPPPZ3zent7efrpp7nrrrvWOlbnHNdccw0LFizgZS972Ro/H8mJGOvjbaje3l7uuOMOnnnmmY2+j9WddNJJhGHY+f7ggw/uJLKu6uCDD+app56iKIrOWAB+/OMf45zb4MetVCqd/240GixbtoxDDz0U7z333nvv896+t7eXRqPB9ddfv8GPDXDZZZcxY8YMZs6cycEHH8ytt97KGWecwQc+8IF13mZgYACArq6uMT3G29/+dn7+85/zile8gltuuYV//dd/5YgjjmDevHn87ne/W+9tN/Sx9tlnHxYuXMg//uM/8vjjj/OFL3yBN7zhDcyaNYuvf/3rY7oPITaUBDdCrMOzzz5Lq9Va63LA6seMMRxyyCHcfPPNQBncHHHEERx++OFYa7n99tu57777WLFixajgxjnH5z73OebNm0ccx0yfPp0ZM2bwhz/8gf7+/s55Z555JvV6nYMOOoh58+Zx2mmndZZZAJYuXcrAwAD77rvvep/TWB9vQ/37v/87f/rTn9h555056KCDOO+883j00Uc3+v4AXvCCF4z6vqenB4Cdd955jePOuc74TzjhBA477DDe8Y53MGvWLN785jfz//7f/xtzoPPkk09yyimnMHXqVOr1OjNmzOCoo44CGNNr9N73vpc99tiDY489lp122qkTSIzV61//eq6//npuuOEG7rjjDpYtW8bFF1/cCUrXpru7G4DBwcExP84xxxzDL37xC/r6+vjtb3/LaaedxhNPPMHxxx+/3kTfjXmsPfbYg//6r/9i2bJl/OEPf+DCCy8kCALe9a53ccMNN4z5foQYKwluhBgnhx9+OHfddRftdrsT3PT29rLvvvty8803dwKfVYObCy+8kDPOOIMjjzyS7373u/ziF7/g+uuvZ5999hn1YbzXXnt1tvQefvjh/Pd//zeHH374BtcJGevjbah/+Id/4NFHH+VLX/oSO+ywA5/5zGfYZ599+NnPftY5Z9UdNauy1q71+LryOdZ13A9vya5UKvz2t7/lhhtu4MQTT+QPf/gDJ5xwAq961avW+VirjuVVr3oV1157LWeeeSbXXHMN119/Pd/61rcAxvQazZw5k4ULF/KTn/yE173udfz617/m2GOP5eSTT37e2wLstNNOzJ8/n6OPPpqDDjqIWq32vLfZc889AfjjH/84psdYVbVa5YgjjuDLX/4yH//4x1m5cuWov7fxfCxjDC9+8Ys566yzuPrqqwH43ve+t8H3I8TzkeBGiHWYOXMmSZLw8MMPr/GztR074ogjyLKMH/zgB/z1r3/tBDFHHnlkJ7jZY489mDVrVuc2V155Ja985Su57LLLePOb38yrX/1q5s+fT19f3xr3X6vVOOGEE7j88st58sknOe6447jgggtot9vMmDGD7u5u/vSnP633OY318dYViKzPnDlzeO9738s111zDY489xrRp07jgggs6P58yZcpan9cTTzyxwY/1fLTWHH300VxyySXcd999XHDBBfzqV7/q1G9Z1/P74x//yEMPPcTFF1/MmWeeyetf/3rmz58/allyxPpeoyiKWLBgAV/96ld55JFH+Od//me+853vrPXfzXhYsGABAN/97nc36X5GljQXLVq0znMOP/xwpkyZwg9+8IPnDRY39bGE2FgS3AixDsYY5s+fzzXXXDMql+Thhx9e65XtwQcfTBiGfPrTn2bq1Knss88+QBn03H777fzmN78ZNWsz8hh+tSJwV1xxBX/9619HHVu+fPmo76MoYu+998Z7T57naK15wxvewP/8z//w+9//fo2xjTzGWB9vZLZgbcHI6qy1ayzXzJw5kx122IE0TTvHdt99d26//fZOITmAn/70pzz11FPP+xgbYsWKFWsc23///QE641nX8xuZFVr1NfLe84UvfGGN+1zXfaz+d6W15iUvecmoxx9vhxxyCK95zWv4xje+wTXXXLPGz7Ms48Mf/nDn+xtvvHGt93PdddcB8KIXvWidj1WtVjnzzDO5//77OfPMM9daxPC73/0ud955J1Au0eZ5vlGPJcTGkq3gQqzHeeedxy9/+UsOO+ww3vOe92Ct5ctf/jL77rvvGqX7q9UqBx54ILfffjsLFizoXNkfeeSRNBoNGo3GGsHN8ccfz/nnn8+pp57KoYceyh//+Ee+973vsdtuu40679WvfjWzZ8/msMMOY9asWdx///18+ctf5rjjjuskdl544YX88pe/5KijjuJd73oXe+21F4sWLeKKK67glltuobe3d8yPt/vuu9Pb28ull15KV1cXtVqNgw8+mF133XWN12hwcJCddtqJv/u7v2O//fajXq9zww03cNddd3HxxRd3znvHO97BlVdeyWte8xr+4R/+gUceeYTvfve77L777hv997M2559/Pr/97W857rjj2GWXXXj22Wf56le/yk477cThhx++3ue35557svvuu/PhD3+Yv/71r3R3d/Pf//3frFy5co3HOfDAAwH4l3/5F4455hiMMbz5zW/mHe94BytWrOBv/uZv2GmnnXjiiSf40pe+xP77789ee+01rs91Vd/5znd49atfzZve9CYWLFjA0UcfTa1W4y9/+Qs//OEPWbRoEZ/97GeBMq9n1113ZcGCBey+++40Gg1uuOEG/ud//oeXv/zlnZmgdfnIRz7Cn//8Zy6++GJ+/etfdyoUL168mGuuuYY777yzk5j86U9/mrvvvps3velNnSDvnnvu4Tvf+Q5Tp05db6K0EBttgnZpCbHVuPHGG/0BBxzgoyjyu+++u//GN77hP/ShD/kkSdY49yMf+YgH/Kc//elRx1/4whd6wD/yyCOjjrfbbf+hD33Iz5kzx1cqFX/YYYf52267bY3t0f/xH//hjzzySD9t2jQfx7Hffffd/Uc+8hHf398/6v6eeOIJf9JJJ/kZM2Z0ig6edtppnSJ+Y308773/8Y9/7Pfee+/Otvd1bQtP09R/5CMf8fvtt5/v6urytVrN77fffv6rX/3qGudefPHFfscdd/RxHPvDDjvM//73v1/nVvArrrhi1G0vv/xyD6yx1X2koOLI1u8bb7zRv/71r/c77LCDj6LI77DDDv4tb3mLf+ihh8b0/O677z4/f/58X6/X/fTp0/073/lO/7//+79rvAZFUfj3v//9fsaMGV4p1dkWfuWVV/pXv/rVfubMmT6KIv+CF7zA//M//7NftGjRWl+/VbGOIn6rW30r+Ihms+k/+9nP+pe//OW+Xq/7KIr8vHnz/Pvf/37/8MMPd877wQ9+4N/85jf73Xff3VcqFZ8kid9777392Wef7QcGBp738UeMPNepU6f6IAj8nDlz/AknnOBvuummzjm33nqrP+200/y+++7re3p6fBiG/gUveIE/5ZRT1vh9EGK8SG8pITbCG97wBv785z/zl7/8ZaKHIoQQYjWScyPE82i1WqO+/8tf/sJ1113HK17xiokZkBBCiPWSmRshnsecOXM45ZRT2G233XjiiSf42te+Rpqm3HvvvcybN2+ihyeEEGI1klAsxPN4zWteww9+8AMWL15MHMcccsghXHjhhRLYCCHEJCUzN0IIIYTYpkjOjRBCCCG2KRLcCCGEEGKbst3l3DjneOaZZ+jq6tqoEvNCCCGE2PK89wwODrLDDjust5EsbIfBzTPPPLNGV2EhhBBCbB2eeuopdtppp/Wes90FNyOl6p966im6u7sneDRCCCGEGIuBgQF23nnnzuf4+mx3wc3IUlR3d7cEN0IIIcRWZiwpJZJQLIQQQohtigQ3QgghhNimSHAjhBBCiG3KdpdzI4QQANZa8jyf6GEIIVYRRdHzbvMeCwluhBDbFe89ixcvpq+vb6KHIoRYjdaaXXfdlSiKNul+JLgRQmxXRgKbmTNnUq1WpZinEJPESJHdRYsW8YIXvGCTfjcluBFCbDestZ3AZtq0aRM9HCHEambMmMEzzzxDURSEYbjR9yMJxUKI7cZIjk21Wp3gkQgh1mZkOcpau0n3I8GNEGK7I0tRQkxO4/W7KcGNEEIIIbYpExrc/Pa3v2XBggXssMMOKKW45pprnvc2N910Ey996UuJ45gXvvCFfOtb39rs4xyruR+7tvMlhBBCiIkxocFNo9Fgv/324ytf+cqYzn/sscc47rjjeOUrX8nChQv5wAc+wDve8Q5+8YtfbOaRrt/aAhoJcoQQYu3OO+889t9//4kexgZ7/PHHUUqxcOHCDb7tWC/g12fu3LkopVBKUavVeOlLX8oVV1zR+fnaXteBgQHOPvts9txzT5IkYfbs2cyfP5+rrroK7z1Qfra+9a1vZYcddiBJEnbaaSde//rX88ADD6x3PIsXL+b9738/u+22G3Ecs/POO7NgwQJuvPHGzjn/+7//y+te9zpmzpxJkiTMnTuXE044gWeffXaTXovnM6G7pY499liOPfbYMZ9/6aWXsuuuu3LxxRcDsNdee3HLLbfwuc99jmOOOWZzDVMIIYSYFM4//3ze+c53MjAwwMUXX8wJJ5zAjjvuyKGHHrrGuX19fRx++OH09/fzb//2b7z85S8nCAJ+85vf8NGPfpS/+Zu/oVar8apXvYoXvehFXHXVVcyZM4enn36an/3sZ+utBfX4449z2GGH0dvby2c+8xle/OIXk+c5v/jFLzjttNN44IEHWLp0KUcffTTHH388v/jFL+jt7eXxxx/nJz/5CY1GYzO+SoCfJAB/9dVXr/ecI444wp9++umjjn3zm9/03d3d67xNu932/f39na+nnnrKA76/v38cRu39Lmf+9Hm/hBCTQ6vV8vfdd59vtVqbfF/WOp8X1lvrxmFk6zcwMODf+ta3+mq16mfPnu0vueQSf9RRR3XeD7/0pS/5ffbZp3P+1Vdf7QH/ta99rXPs6KOP9meffbb33vuHH37Yv+51r/MzZ870tVrNv+xlL/PXX3/9qMf8yle+4l/4whf6OI79zJkz/d/+7d92fmat9Z/+9Kf97rvv7qMo8jvvvLP/t3/7t87PP/rRj/p58+b5SqXid911V//xj3/cZ1nmvff+8ssv98Cor8svv3ytz/vXv/61f/nLX+6r1arv6enxhx56qH/88ce9996ffPLJ/vWvf/2o808//XR/1FFHdb4/6qij/Pve9z5/+umn+97eXj9z5kz/n//5n35oaMifcsopvl6v+913391fd911ndusWLHCv/Wtb/XTp0/3SZL4F77whf6b3/ym996vMe6Rx7rzzjv9/Pnz/bRp03x3d7c/8sgj/d133925z1122WXU7XbZZRfvvfcLFy70r3jFK3y9XvddXV3+pS99qb/rrrvW+lqM3M/nPve5zvd5nvtqteo/9rGPee+9P/fcc/1+++3X+fl73vMeX6vV/F//+tc17mtwcNDnee7vvfdeD3Re17E69thj/Y477uiHhobW+NnKlSu99+W/wyAIfJ7nY77f9f2O9vf3j/nze6tKKF68eDGzZs0adWzWrFkMDAzQarXWepuLLrqInp6eztfOO++8JYY6inN+iz/m+jjnKaybdOMSYmvgvaeVFfS3c/paOf3tnFZWdKb4N4czzjiDW2+9lZ/85Cdcf/313Hzzzdxzzz2dnx911FHcd999LF26FIDf/OY3TJ8+nZtuugkot8DfdtttvOIVrwBgaGiI1772tdx4443ce++9vOY1r2HBggU8+eSTAPz+97/nX/7lXzj//PN58MEH+fnPf86RRx7ZebyzzjqLT33qU3ziE5/gvvvu4/vf//6o9+auri6+9a1vcd999/GFL3yBr3/963zuc58D4IQTTuBDH/oQ++yzD4sWLWLRokWccMIJazznoih4wxvewFFHHcUf/vAHbrvtNt71rndt8G6ab3/720yfPp0777yT97///bznPe/h7//+7zn00EO55557ePWrX82JJ55Is9kE6Dynn/3sZ9x///187WtfY/r06QDceeedANxwww0sWrSIq666CoDBwUFOPvlkbrnlFm6//XbmzZvHa1/7WgYHBwG46667ALj88stZtGhR5/u3ve1t7LTTTtx1113cfffdfOxjH9ug2i5BEBCGIVmWrfEz5xw//OEPedvb3sYOO+ywxs/r9TpBEDBjxgy01lx55ZVj3n69YsUKfv7zn3PaaadRq9XW+Hlvby8As2fPpigKrr766s36+7FWYw6nNjPGMHMzb948f+GFF446du2113rAN5vNtd5mMszcrGikvpnm3rnNf4W3Ps4530xzv6KR+qWD7UkzLiG2lPGYuWmmuV86UP7+DLSy8vdpoO2b6divTjfEwMCAD8PQX3HFFZ1jfX19vlqtdmZunHN+2rRpnXP2339/f9FFF/nZs2d7772/5ZZbfBiGvtForPNx9tlnH/+lL33Je+/9f//3f/vu7m4/MDCw1vHEcey//vWvj/k5fOYzn/EHHnhg5/vVZxjWZvny5R7wN91001p/PtaZm8MPP7zzfVEUvlar+RNPPLFzbNGiRR7wt912m/fe+wULFvhTTz11rY/52GOPecDfe++96x27tdZ3dXX5//mf/+kcW9tnXFdXl//Wt7613vta1aozN2ma+gsvvNAD/qc/LVcIVn1dlyxZ4gF/ySWXPO/9fvnLX/bVatV3dXX5V77ylf7888/3jzzyyDrPv+OOOzzgr7rqque97//7f/+vD4LAT5061b/mNa/x//7v/+4XL168zvO3y5mb2bNns2TJklHHlixZQnd3N5VKZa23ieOY7u7uUV9b2tPL+ukbSmmmxYTOmLRzSyMtI/M4KP/qG6mlnW9asaTNQWaXxGTknKddOIxRhEajVPmnMYp2sXn+vT766KPkec5BBx3UOdbT08OLXvSizvdKKY488khuuukm+vr6uO+++3jve99LmqY88MAD/OY3v+HlL395p3jh0NAQH/7wh9lrr73o7e2lXq9z//33d2ZuXvWqV7HLLruw2267ceKJJ/K9732vM7Nx//33k6YpRx999DrH/KMf/YjDDjuM2bNnU6/X+fjHP96577GaOnUqp5xyCscccwwLFizgC1/4AosWLdqg+wB4yUte0vlvYwzTpk3jxS9+cefYyIzTSILre97zHn74wx+y//7789GPfpTf/e53z/sYS5Ys4Z3vfCfz5s2jp6eH7u5uhoaGnvc5n3HGGbzjHe9g/vz5fOpTn+KRRx553sc688wzqdfrVKtVPv3pT/OpT32K4447bo3z/AbMlJx22mksXryY733vexxyyCFcccUV7LPPPlx//fVrPX9D7vuCCy5g8eLFXHrppeyzzz5ceuml7Lnnnvzxj38c831sjK0quDnkkENGZWEDXH/99RxyyCETNKKx+eGtD3PHI8/y0OJ+lg21O9PY1rot9gE+EW/KG8NPwJS/EGPlvMc6T6BHL40EWmGdx03gv9NXvOIV3HTTTdx8880ccMABdHd3dwKe3/zmNxx11FGdcz/84Q9z9dVXc+GFF3LzzTezcOFCXvziF3eWN7q6urjnnnv4wQ9+wJw5czjnnHPYb7/96OvrW+eF5IjbbruNt73tbbz2ta/lpz/9Kffeey9nn332WpdOns/ll1/ObbfdxqGHHsqPfvQj9thjD26//XagbLC4+vvC2rq8r77Mo5QadWxkmcs5B5QbXZ544gk++MEP8swzz3D00Ufz4Q9/eL3jPPnkk1m4cCFf+MIX+N3vfsfChQuZNm3a8z7n8847jz//+c8cd9xx/OpXv2Lvvffm6quvXu9tPvKRj7Bw4UKefvppVq5cyZlnnrnW82bMmEFvb+/z7nga0dXVxYIFC7jgggv43//9X4444gj+7d/+ba3nzps3D6XUmO972rRp/P3f/z2f/exnuf/++9lhhx347Gc/O6bbbqwJDW6GhoZYuHBhZ1vdY489xsKFCzvR7llnncVJJ53UOf/d7343jz76KB/96Ed54IEH+OpXv8r/+3//jw9+8IMTMfwx++UfVnDTA3/lwUUr6W9mWOdYNpjy7GB7i32AT+Y35VVtTbNLYvxN9hk7rRRGK4rVxlc4j9EKvRkqH++2226EYdjJ0wDo7+/noYceGnXeSN7NFVdc0cmtecUrXsENN9zArbfe2jkGcOutt3LKKafwxje+kRe/+MXMnj2bxx9/fNT9BUHA/Pnz+fd//3f+8Ic/8Pjjj/OrX/2KefPmUalU1rjQHPG73/2OXXbZhbPPPpuXvexlzJs3jyeeeGLUOVEUjTm/44ADDuCss87id7/7Hfvuuy/f//73gfLDe/WZnI3Zor02M2bM4OSTT+a73/0un//85/nP//zPzrhhzdYAt956K//yL//Ca1/7WvbZZx/iOGbZsmWjzgnDcK3PeY899uCDH/wgv/zlL3nTm97E5Zdfvt6xTZ8+nRe+8IXMnj17vflHWmve/OY3873vfY9nnnlmjZ8PDQ1RFMVab6uUYs8991znjqapU6dyzDHH8JWvfGWt56xvl1UURey+++6bfbfUhAY3v//97znggAM44IADgHKK7oADDuCcc84BYNGiRaOm9XbddVeuvfZarr/+evbbbz8uvvhivvGNb0z6beBLPfzpmX4eXDTIE8sbLOlvsrKd0s4tBiisY7BVbNYP8Il4U95QW8vskhh/W8uMndaKJNBY68mtw/vyT2s9SaDRevx/j7q6ujj55JP5yEc+wq9//Wv+/Oc/80//9E9orUd9uL3kJS9hypQpfP/73x8V3FxzzTWkacphhx3WOXfevHlcddVVLFy4kP/93//lrW99a2fmAuCnP/0pX/ziF1m4cCFPPPEE3/nOd3DO8aIXvYgkSTjzzDP56Ec/yne+8x0eeeQRbr/9di677LLOfT/55JP88Ic/5JFHHuGLX/ziGrMRc+fO7VzMLlu2jDRN13jejz32GGeddRa33XYbTzzxBL/85S/5y1/+wl577QXA3/zN3/D73/+e73znO/zlL3/h3HPP5U9/+tMmv97nnHMOP/7xj3n44Yf585//zE9/+tPOY86cOZNKpcLPf/5zlixZQn9/f+c5/9d//Rf3338/d9xxB29729vWmOGaO3cuN954I4sXL2blypW0Wi3e9773cdNNN/HEE09w6623ctddd3UeazxccMEF7Lzzzhx88MF85zvf4b777uMvf/kL3/zmNznggAM6Ewyvf/3rufLKK7nvvvt4+OGHueyyy/jmN7/J61//+nXe91e+8hWstRx00EH893//N3/5y1+4//77+eIXv9hZTfnpT3/KP/7jP/LTn/6Uhx56iAcffJDPfvazXHfddeu97/EwoXVuXvGKV6z3zWtt1Ydf8YpXcO+9927GUW0ei1fCo0v7mTWlgveeSmhoBDnWOYwxKMB6R2Q0xox/zDnyplzOijiC4UDHWk8tNpvlTXlDjcwujczYjAi0Ii0czns0Ez9OMf5GZuyMUcSBpnC+M4NXicbnbWpkVmhT46UkNAC0C0daOIxW1GLTOb45XHLJJbz73e/m+OOPp7u7m49+9KM89dRTJEnSOUcpxRFHHMG1117L4YcfDpQBT3d3Ny960YtG7Wq55JJLePvb386hhx7K9OnTOfPMMxkYGOj8vLe3l6uuuorzzjuPdrvNvHnz+MEPfsA+++wDlDuKgiDgnHPO4ZlnnmHOnDm8+93vBuB1r3sdH/zgB3nf+95HmqYcd9xxfOITn+C8887r3P/f/u3fctVVV/HKV76Svr4+Lr/8ck455ZRRz7larfLAAw/w7W9/m+XLlzNnzhxOO+00/vmf/xmAY445hk984hN89KMfpd1u8/a3v52TTjppk3M5oijirLPO4vHHH6dSqXDEEUfwwx/+EChns774xS9y/vnnc84553DEEUdw0003cdlll/Gud72Ll770pey8885ceOGFayxlXXzxxZxxxhl8/etfZ8cdd+Shhx5i+fLlnHTSSSxZsoTp06fzpje9iU9+8pObNP5VTZ06ldtvv51PfepT/Nu//RtPPPEEU6ZM4cUvfjGf+cxn6OnpYaeddmLu3Ll88pOf7BQpHPl+fasiu+22G/fccw8XXHABH/rQh1i0aBEzZszgwAMP5Gtf+xoAe++9N9VqlQ996EM89dRTxHHMvHnz+MY3vsGJJ544bs9zbZSfbJdGm9nAwAA9PT309/ePS3LxhlQhnluHg144jX13mopRCqsUu0/vorcWEQxXnZzTW6GrEm3yuNbG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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADi20lEQVR4nOzdd5xkVZn4/88J995KHSYPechJASWJCIiiiDoYd1n1B2IOLCqIgS8oiAq66yK+RECR4H7XwNeAiwtGVhQQI6AoCJIESRM7VbjhnPP743YX0xN7hpnp7pnn/XrVC7rqVt1b3VO3nnvOc55HhRACQgghhBBbCD3ZByCEEEIIsTFJcCOEEEKILYoEN0IIIYTYokhwI4QQQogtigQ3QgghhNiiSHAjhBBCiC2KBDdCCCGE2KJIcCOEEEKILYoEN0IIIYTYokhwI4QQG8nDDz+MUoqrr756sg9FiK2aBDdCiPXy+OOPc+6553LnnXdO9qFssEsuuWRSA5CbbroJpVT3FkURu+yyCyeddBIPPvhgd7uxYOlzn/vcKq/x1FNPccYZZ7DXXntRq9Wo1+sceOCBfOpTn2JgYKC7nfee//zP/+TQQw9l5syZ9PT0sMcee3DSSSfx61//ekLH2+l0+PznP8+hhx5KX18flUqFPfbYg3/913/lvvvuG7ftLbfcwnHHHcd2221HpVJhxx13ZOHChXzjG9/YsF+WEBvATvYBCCGml8cff5xPfOITLFiwgAMOOGCyD2eDXHLJJcyePZuTTz55Uo/jfe97HwcffDB5nnP77bfzla98heuvv5677rqLbbfddo3P+93vfsfLX/5yRkZG+P/+v/+PAw88EIDf//73fOYzn+GXv/wlP/nJT7r7+NKXvsSrXvUq3vSmN2Gt5d577+WHP/whu+yyC8973vPWeoxLlizhZS97GX/4wx945StfyRvf+EYajQb33nsv3/rWt/jKV75ClmUAfPvb3+aEE07ggAMO4P3vfz8zZszgoYce4pe//CWXX345b3zjGzfSb06ItZPgRggxrYUQ6HQ6VKvVyT6U9XbEEUfw+te/HoC3vOUt7LHHHrzvfe/ja1/7GmeeeeZqnzMwMMBrXvMajDHccccd7LXXXuMe//SnP83ll18OlKM7l1xyCe94xzv4yle+Mm67iy66iMWLF6/zGE8++WTuuOMOvvOd7/C6171u3GOf/OQnOeuss7o/n3vuueyzzz78+te/Jo7jcdsuWrRonfsSYmORaSkhnoGbbrqJgw46iEqlwq677sqXv/xlzj33XJRS3W1e+9rX8tznPnfc8xYuXIhSiuuuu657329+8xuUUvzwhz8EYNmyZZxxxhk8+9nPptFo0Nvby3HHHccf//jHVY7ji1/8Ivvuuy+1Wo0ZM2Zw0EEHrTIN8Nhjj/G2t72NbbfdliRJ2HnnnXnPe97TveqeyP5uuukmDj74YKD8Mh6bVlnXFM+69r3y72zM1VdfjVKKhx9+uHvfggULeOUrX8mPf/xjDjroIKrVKl/+8pcBuOqqq3jRi17E3LlzSZKEffbZh0svvXTcay5YsIC//OUv/OIXv+ge/wtf+MLu4wMDA3zgAx9ghx12IEkSdtttNz772c/ivR/3OgMDA5x88sn09fXR39/Pm9/85nHTQRviRS96EQAPPfTQGrf58pe/zGOPPcaFF164SmADMG/ePM4+++zu64QQOPzww1fZTinF3Llz13o8v/nNb7j++ut529vetkpgA5AkybgpswceeICDDz54lcAGWOe+hNiYZORGiA10xx138LKXvYxtttmGT3ziEzjnOO+885gzZ8647Y444gj++7//m6GhIXp7ewkhcOutt6K15uabb+b4448H4Oabb0Zr3f0ievDBB/n+97/PP/3TP7Hzzjvz1FNP8eUvf5mjjjqKu+++uzttcfnll/O+972P17/+9bz//e+n0+nwpz/9id/85jfdaYDHH3+cQw45hIGBAd75zney11578dhjj/Gd73yHVqtFHMcT2t/ee+/Neeedx8c//nHe+c53csQRRwDw/Oc/f42/p4nse33de++9vOENb+Bd73oX73jHO9hzzz0BuPTSS9l33305/vjjsdbygx/8gPe+97147znllFOAcsTi1FNPpdFodEcd5s2bB0Cr1eKoo47iscce413vehc77rgjv/rVrzjzzDN54oknuOiii4BytOhVr3oVt9xyC+9+97vZe++9ufbaa3nzm9+83u9lRQ888AAAs2bNWuM21113HdVqtTviszY77bQTUE4X/dM//RO1Wm29jmcs+D7xxBMntP1OO+3EjTfeyD/+8Q+233779dqXEBtVEEJskIULF4ZarRYee+yx7n1/+9vfgrU2rPjR+t3vfheAcMMNN4QQQvjTn/4UgPBP//RP4dBDD+1ud/zxx4fnPOc53Z87nU5wzo3b50MPPRSSJAnnnXde975XvepVYd99913rsZ500klBax1+97vfrfKY93699jf2fq666qq17nN99n3OOeeE1Z2OrrrqqgCEhx56qHvfTjvtFIDwox/9aJXtW63WKvcde+yxYZdddhl337777huOOuqoVbb95Cc/Ger1erjvvvvG3f/Rj340GGPCI488EkII4fvf/34Awr/92791tymKIhxxxBET+t38/Oc/D0C48sorw+LFi8Pjjz8err/++rBgwYKglOr+rh566KEAhH//93/vPnfGjBlh//33X+vrr+ikk04KQJgxY0Z4zWteEz73uc+Fe+65Z0LPfc1rXhOAsHz58gltf8UVVwQgxHEcjj766PCxj30s3Hzzzav8uxJiU5NpKSE2gHOOn/3sZ7z61a8el/i52267cdxxx43b9jnPeQ6NRoNf/vKXQDlCs/3223PSSSdx++2302q1CCFwyy23dEdCoBzy11p397d06VIajQZ77rknt99+e3e7/v5+/vGPf/C73/1utcfqvef73/8+Cxcu5KCDDlrl8bHpoInub31MdN/ra+edd+bYY49d5f4V824GBwdZsmQJRx11FA8++CCDg4PrfN1vf/vbHHHEEcyYMYMlS5Z0b8cccwzOue7f8IYbbsBay3ve857uc40xnHrqqev1Pt761rcyZ84ctt12W17xilfQbDb52te+ttrf1ZihoSF6enomvI+rrrqKiy++mJ133plrr72WM844g7333psXv/jFPPbYY2t97tDQEMCE9/fWt76VH/3oR7zwhS/klltu4ZOf/CRHHHEEu+++O7/61a8mfMxCPFMyLSXEBli0aBHtdpvddtttlcdWvs8Yw2GHHcbNN98MlMHNEUccwQte8AKcc/z6179m3rx5LFu2bFxw473nC1/4ApdccgkPPfQQzrnuYytOW3zkIx/hZz/7GYcccgi77bYbL33pS3njG9/Ynd5avHgxQ0NDPOtZz1rre5ro/tbHRPe9vnbeeefV3n/rrbdyzjnncNttt9FqtcY9Njg4SF9f31pf929/+xt/+tOfVplaHDOWFPv3v/+dbbbZhkajMe7xsemxifr4xz/OEUccgTGG2bNns/fee2Pt2k/Lvb29DA8PT3gfWmtOOeUUTjnlFJYuXcqtt97KZZddxg9/+EP+5V/+pfvvck37AhgeHqa/v39C+zv22GM59thjabVa/OEPf+Caa67hsssu45WvfCV//etfJfdGbBYyciPEZvCCF7yA3/3ud3Q6nW5w09/fz7Oe9Sxuvvnm7hfMisHN+eefz+mnn86RRx7Jf/3Xf/HjH/+Yn/70p+y7777jklv33nvv7rLcF7zgBXz3u9/lBS94Aeecc856HeNE97cprGkEZ8UAa0WrWxn1wAMP8OIXv5glS5Zw4YUXcv311/PTn/6U0047DWBC78F7z0te8hJ++tOfrva2uqTaZ+LZz342xxxzDEcffTTPfvaz1xnYAOy1117cd9993WTs9TFr1iyOP/54brjhBo466ihuueUW/v73v691XwB33XXXeu+rVqtxxBFHcPHFF3P22WezfPnybrK8EJuajNwIsQHmzp1LpVLh/vvvX+Wx1d13xBFHkGUZ3/zmN3nssce6QcyRRx7JzTffzLx589hjjz26ia0A3/nOdzj66KO54oorxr3WwMAAs2fPHndfvV7nhBNO4IQTTiDLMl772tfy6U9/mjPPPJM5c+bQ29vLn//857W+p4nub32mkia67xkzZnT3teIIwdq+eFf2gx/8gDRNue6669hxxx279//85z9fZds1vYddd92VkZERjjnmmLXuayxxdmRkZNzozb333jvh491QCxcu5LbbbuO73/0ub3jDGzb4dQ466CB+8Ytf8MQTT3QTj1e3rwsuuID/+q//Ghd4b8i+AJ544okNfg0h1oeM3AixAYwxHHPMMXz/+9/n8ccf795///33r/bq9NBDDyWKIj772c8yc+ZM9t13X6AMen7961/zi1/8YpUvD2MMIYRx9337299eJU9i6dKl436O45h99tmHEAJ5nqO15tWvfjU/+MEP+P3vf7/KsY3tY6L7q9frABNa9jzRfe+6664A3ZwWoJt/MlHGmHGvCeVU1FVXXbXKtvV6fbXH/8///M/cdttt/PjHP17lsYGBAYqiAODlL385RVGMW2bunOOLX/zihI93Q7373e9mm2224YMf/OAq1YGhnDr71Kc+BcCTTz7J3Xffvco2WZZx4403orVe7dTqmMMOO4yXvexlfPWrX+X73//+al/njDPO6P584403rvZ1brjhBmD9p+2E2FAyciPEBjr33HP5yU9+wuGHH8573vMenHNcfPHFPOtZz1qlNUGtVuPAAw/k17/+dbfGDZQjN81mk2azuUpw88pXvpLzzjuPt7zlLTz/+c/nrrvu4utf/zq77LLLuO1e+tKXMn/+fA4//HDmzZvHPffcw8UXX8wrXvGKbiLo+eefz09+8hOOOuoo3vnOd7L33nvzxBNP8O1vf5tbbrmF/v7+Ce9v1113pb+/n8suu4yenh7q9TqHHnroGvNgJrLvl770pey444687W1v40Mf+hDGGK688krmzJnDI488MqG/x0tf+lLiOGbhwoW8613vYmRkhMsvv5y5c+euMmJw4IEHcumll/KpT32K3Xbbjblz5/KiF72ID33oQ1x33XW88pWv5OSTT+bAAw+k2Wxy11138Z3vfIeHH36Y2bNns3DhQg4//HA++tGP8vDDD7PPPvvwve99b0JJy8/UjBkzuPbaa3n5y1/OAQccMK5C8e233843v/lNDjvsMAD+8Y9/cMghh/CiF72IF7/4xcyfP59FixbxzW9+kz/+8Y984AMfWGUUcGX/+Z//yUtf+lJe+9rXsnDhQl784hdTr9f529/+xre+9S2eeOKJbq2bV73qVey8884sXLiQXXfdlWazyc9+9jN+8IMfcPDBB7Nw4cJN+8sRYswkrtQSYtq78cYbw3Oe85wQx3HYddddw1e/+tXwwQ9+MFQqlVW2/dCHPhSA8NnPfnbc/bvttlsAwgMPPDDu/k6nEz74wQ+GbbbZJlSr1XD44YeH2267LRx11FHjljF/+ctfDkceeWSYNWtWSJIk7LrrruFDH/pQGBwcHPd6f//738NJJ50U5syZE5IkCbvssks45ZRTQpqm67W/EEL47//+77DPPvt0l72va+nzuvYdQgh/+MMfwqGHHhriOA477rhjuPDCC9e4FPwVr3jFavdz3XXXhf322y9UKpWwYMGC8NnPfjZceeWVq7zGk08+GV7xileEnp6eAIx7f8PDw+HMM88Mu+22W4jjOMyePTs8//nPD5/73OdClmXd7ZYuXRpOPPHE0NvbG/r6+sKJJ54Y7rjjjvVaCv7tb397rdutbin4mMcffzycdtppYY899giVSiXUarVw4IEHhk9/+tPdv/3Q0FD4whe+EI499tiw/fbbhyiKQk9PTzjssMPC5Zdf3l2Kvy6tVit87nOfCwcffHBoNBohjuOw++67h1NPPTXcf//93e2++c1vhn/5l38Ju+66a6hWq6FSqYR99tknnHXWWWFoaGhC+xJiY1AhrDQOLYR4Rl796lfzl7/8hb/97W+TfShCCLFVkpwbIZ6Bdrs97ue//e1v3HDDDePK+QshhNi8ZORGiGdgm2224eSTT2aXXXbh73//O5deeilpmnLHHXew++67T/bhCSHEVkkSioV4Bl72spfxzW9+kyeffJIkSTjssMM4//zzJbARQohJJCM3QgghhNiiSM6NEEIIIbYoEtwIIYQQYouy1eXceO95/PHH6enp2eCOxEIIIYTYvEIIDA8Ps+2226L12sdmtrrg5vHHH2eHHXaY7MMQQgghxAZ49NFH2X777de6zVYX3IyVo3/00Ufp7e2d5KMRQgghxEQMDQ2xww47dL/H12arC27GpqJ6e3sluBFCCCGmmYmklEhCsRBCCCG2KBLcCCGEEGKLIsGNEEIIIbYoW13OjRBCTJRzjjzPJ/swhNhqxHG8zmXeEyHBjRBCrCSEwJNPPsnAwMBkH4oQWxWtNTvvvDNxHD+j15HgRgghVjIW2MydO5darSYFP4XYDMaK7D7xxBPsuOOOz+hzJ8GNEEKswDnXDWxmzZo12YcjxFZlzpw5PP744xRFQRRFG/w6klAshBArGMuxqdVqk3wkQmx9xqajnHPP6HUkuBFCiNWQqSghNr+N9bmT4EYIIYQQW5RJDW5++ctfsnDhQrbddluUUnz/+99f53Nuuukmnvvc55IkCbvtthtXX331Jj/OiVrw0eu7NyGEEGJ9LFiwgIsuumiyD2OLMKnBTbPZZP/99+dLX/rShLZ/6KGHeMUrXsHRRx/NnXfeyQc+8AHe/va38+Mf/3gTH+narS6gkSBHCCGemXPPPZcDDjhgsg9jrTZnQHLuueeilEIphbWWBQsWcNpppzEyMgLAww8/jFKKO++8c9zzvvvd7/LCF76Qvr4+Go0G++23H+eddx7Lli0DyvyWz3zmM+y1115Uq1VmzpzJoYceyle/+tW1Hk8Iga985SsceuihNBoN+vv7Oeigg7jooototVoAtFotzjzzTHbddVcqlQpz5szhqKOO4r//+783/i9oBZO6Wuq4447juOOOm/D2l112GTvvvDP/8R//AcDee+/NLbfcwuc//3mOPfbYTXWYQgghtiIhBJxzWDv1FhTvu+++/OxnP6MoCm699Vbe+ta30mq1+PKXv7za7c866yw++9nPctppp3H++eez7bbb8re//Y3LLruM//t//y/vf//7+cQnPsGXv/xlLr74Yg466CCGhob4/e9/z/Lly9d6LCeeeCLf+973OPvss7n44ouZM2cOf/zjH7noootYsGABr371q3n3u9/Nb37zG774xS+yzz77sHTpUn71q1+xdOnSTfHreVqYIoBw7bXXrnWbI444Irz//e8fd9+VV14Zent71/icTqcTBgcHu7dHH300AGFwcHAjHHUIO33kf9Z5E0JMH+12O9x9992h3W5vlNdzzoe8cME5v1Feb22GhobCG9/4xlCr1cL8+fPDhRdeGI466qjuefOLX/xi2HfffbvbX3vttQEIl156afe+F7/4xeGss84KIYRw//33h+OPPz7MnTs31Ov1cNBBB4Wf/vSn4/b5pS99Key2224hSZIwd+7c8LrXva77mHMufPaznw277rpriOM47LDDDuFTn/pU9/EPf/jDYffddw/VajXsvPPO4eyzzw5ZloUQQrjqqqsCMO521VVXrfG9X3HFFWGfffYJcRyH+fPnh1NOOSWEEMJDDz0UgHDHHXd0t12+fHkAws9//vMQQgg///nPAxBuuOGG8NznPjdEURR+/vOfr/P9H3XUUasc45ibb745vOAFLwiVSiVsv/324dRTTw0jIyPdx5966qnwyle+MlQqlbBgwYLwX//1X2GnnXYKn//859f4Hs8555yw//77j7vvHe94R5g/f/5q3+tvfvObAISLLrpota+3fPnyEEII+++/fzj33HPXuN/VueaaawIQvv/976/ymPc+DAwMhBBC6OvrC1dfffWEX3dtn7/BwcEJf39Pq4TiJ598knnz5o27b968eQwNDdFut1f7nAsuuIC+vr7ubYcddtgchzqO92Gz71MIMblCCLSzgsFOzkA7Z7CT084KQth054PTTz+dW2+9leuuu46f/vSn3Hzzzdx+++3dx4866ijuvvtuFi9eDMAvfvELZs+ezU033QSUy+Bvu+02XvjCFwIwMjLCy1/+cm688UbuuOMOXvayl7Fw4UIeeeQRAH7/+9/zvve9j/POO497772XH/3oRxx55JHd/Z155pl85jOf4WMf+xh333033/jGN8adw3t6erj66qu5++67+cIXvsDll1/O5z//eQBOOOEEPvjBD7LvvvvyxBNP8MQTT3DCCSes9n1feumlnHLKKbzzne/krrvu4rrrrmO33XZb79/fRz/6UT7zmc9wzz33sN9++63z/X/ve99j++2357zzzuseI8ADDzzAy172Ml73utfxpz/9iWuuuYZbbrmFf/3Xf+3u6+STT+bRRx/l5z//Od/5zne45JJLWLRo0Xofc7VaJcuy1T729a9/nUajwXvf+97VPt7f3w/A/Pnz+d///d/uv4uJ+PrXv86ee+7Jq171qlUeU0rR19fXfe0bbriB4eHhCb/2RjHhcGoTYwIjN7vvvns4//zzx913/fXXByC0Wq3VPmcqjNzc+9iyMNJOg/eb/spNCPHMbKyRm1aah8VDnbCsmYahdhaWNdOweKgTWmm+kY50vKGhoRBFUfj2t7/dvW9gYCDUarXuyI33PsyaNau7zQEHHBAuuOCC7pX/LbfcEqIoCs1mc4372XfffcMXv/jFEEII3/3ud0Nvb28YGhpa7fEkSRIuv/zyCb+Hf//3fw8HHnhg9+fVjVSszrbbbtsdbVrZ+ozcrG4UYmUrvv8QwmpHW972treFd77znePuu/nmm4PWOrTb7XDvvfcGIPz2t7/tPn7PPfcEYL1Gbn7/+9+H2bNnh9e//vWrfa/HHXdc2G+//db5nv7yl7+EvffeO2itw7Of/ezwrne9K9xwww1rfc7ee+8djj/++HW+9i9+8Yuw/fbbhyiKwkEHHRQ+8IEPhFtuuWWN22+VIzfz58/nqaeeGnffU089RW9vL9VqdbXPSZKE3t7ecbfN7aZ7H+eBpwZpZ8Vm3/dU4X2gcF5GscRWwftAp/AYo4iMRqnyv8YoOsWm+Rw8+OCD5HnOIYcc0r2vr6+PPffcs/uzUoojjzySm266iYGBAe6++27e+973kqYpf/3rX/nFL37BwQcf3C1gODIywhlnnMHee+9Nf38/jUaDe+65pzty8ZKXvISddtqJXXbZhRNPPJGvf/3r3UTSe+65hzRNefGLX7zGY77mmms4/PDDmT9/Po1Gg7PPPrv72hO1aNEiHn/88bXuZ6IOOuigcT+v6/2vyR//+EeuvvpqGo1G93bsscfiveehhx7innvuwVrLgQce2H3OXnvt1R1JWZu77rqLRqNBtVrlkEMO4bDDDuPiiy9e7bZhgqOE++yzD3/+85/59a9/zVvf+lYWLVrEwoULefvb377G50z0tY888kgefPBBbrzxRl7/+tfzl7/8hSOOOIJPfvKTE3r+hppWwc1hhx3GjTfeOO6+n/70pxx22GGTdEQT851bH+bn9zzBP5YO433Yqr7owyQMzQsx2XwIOB+wenxBMqsVzgf8JP77f+ELX8hNN93EzTffzHOe8xx6e3u7Ac8vfvELjjrqqO62Z5xxBtdeey3nn38+N998M3feeSfPfvazu9MgPT093H777Xzzm99km2224eMf/zj7778/AwMDa7zgHHPbbbfxpje9iZe//OX8z//8D3fccQdnnXXWGqdY1mRd+xnrML3iOWdNnd7r9fq4n9f1/tdkZGSEd73rXdx5553d2x//+Ef+9re/seuuu07kba3RnnvuyZ133sk999xDu93muuuuWyVdY8wee+zRDXrXRWvNwQcfzAc+8AG+973vcfXVV3PFFVfw0EMPrfG1//rXv07omKMo4ogjjuAjH/kIP/nJTzjvvPP45Cc/ud5/6/UxqcHNyMhI9w8P5VLvO++8sxsVn3nmmZx00knd7d/97nfz4IMP8uEPf5i//vWvXHLJJfy///f/OO200ybj8CfsvhG4/o5Hue6Ov3PP40tZ1uxsNV/0ndzRTMsy2okt/7k1U0cnf2altYWYyrRSGK0oVrqAKXzAaIXeBNWPd9llF6Io4ne/+133vsHBQe67775x243l3Xz729/u5ta88IUv5Gc/+xm33npr9z6AW2+9lZNPPpnXvOY1PPvZz2b+/Pk8/PDD417PWssxxxzDv/3bv/GnP/2Jhx9+mP/93/9l9913p1qtrnJBOuZXv/oVO+20E2eddRYHHXQQu+++O3//+9/HbRPH8TrL8Pf09LBgwYI17mfOnDkA3XwYYJWl0msykfe/umN87nOfy913381uu+22yi2OY/baay+KouAPf/hD9zn33nvvhLrQx3HMbrvtxoIFC9bZOfuNb3wjIyMjXHLJJat9fG3722effYCyZMuaXvu+++5b7ZLuEAKDg4Nrfe2iKOh0Oms5+mdmUte5/f73v+foo4/u/nz66acD8OY3v5mrr76aJ554Ytzw384778z111/Paaedxhe+8AW23357vvrVr06LZeD3DcLMBxeR2IgX7j2PHWf3kTnPYObIIkc1tlij0XrLKfm+8tA8QGQU4OkUnsSGLer9CjFGa0XF6tHA3mNHAx3nAvXEbJJ/9z09Pbz5zW/mQx/6EDNnzmTu3Lmcc845aK3HlbTfb7/9mDFjBt/4xjf4n//5H6AMbs444wyUUhx++OHdbXfffXe+973vsXDhQpRSfOxjH8N73338f/7nf3jwwQc58sgjmTFjBjfccAPee/bcc08qlQof+chH+PCHP0wcxxx++OEsXryYv/zlL7ztbW9j991355FHHuFb3/oWBx98MNdffz3XXnvtuPe0YMGC7kXv9ttvT09PD0mSrPLezz33XN797nczd+5cjjvuOIaHh7n11ls59dRTqVarPO95z+Mzn/kMO++8M4sWLeLss8+e0O90Xe9/7Bh/+ctf8i//8i8kScLs2bP5yEc+wvOe9zz+9V//lbe//e3U63XuvvtufvrTn3LxxRez55578rKXvYx3vetdXHrppVhr+cAHPrDOUaj1deihh/LhD3+YD37wgzz22GO85jWvYdttt+X+++/nsssu4wUveAHvf//7ef3rX8/hhx/O85//fObPn89DDz3EmWeeyR577MFee+212tf+53/+Z6699lre8IY3cPbZZ/PSl76UOXPmcNddd/H5z3+eU089lVe/+tW88IUv5A1veAMHHXQQs2bN4u677+b//J//w9FHH71p00TWmZWzhVmfhKSJmEhC8djtOR/5n/C+/7wlXPmLe8NdjywJd/9jWfjN/YvCr+9fFP72+EB4bHkzNDvZFpN4nBcuLB7uhKF2FoY7efc21M7C4uFOyAs32YcoxCo2VkKx9z600rxMJB4uE4tbab5JP9+rWwp+yCGHhI9+9KPjtnvVq14VrLVheHg4hFAu2Z4xY0Z43vOeN267hx56KBx99NGhWq2GHXbYIVx88cXjlpbffPPN4aijjgozZswI1Wo17LfffuGaa67pPt85Fz71qU+FnXbaKURRFHbcccdxi0I+9KEPhVmzZoVGoxFOOOGE8PnPfz709fV1H+90OuF1r3td6O/vX+dS8MsuuyzsueeeIYqisM0224RTTz21+9jdd98dDjvssFCtVsMBBxwQfvKTn6w2oXhsafRE338IIdx2221hv/32C0mSjFsK/tvf/ja85CUvCY1GI9Tr9bDffvuFT3/6093Hn3jiifCKV7wiJEkSdtxxx/Cf//mfG7QUfOXjZaXk6RDKZdtHHnlk6Onp6R7Leeed132/X/nKV8LRRx8d5syZE+I4DjvuuGM4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f+ihh1a9x/333++f85zn+Far5Xfv3u1/7Md+zDdNc6mn4r33/sMf/rAHHvZ3++23e+9DOvhP/dRP+X379vksy/zNN9/s77333lXvcezYMf/CF77Qd7td3+/3/fd+7/f6wWCw6ph/+Id/8N/8zd/ssyzzV155pX/jG9+4qXMbj8f+2c9+tt+zZ49PksRfe+21/qUvfenDjOutOre15gX4d7zjHdNjNupa/PCHP+xvuOEGn6apf9SjHrXqMzZjbg888IB/5jOf6efn532WZf7Rj360f+UrX7mqXspWnZv33n/f932fv/baa32apn7Pnj3+5ptvnho23m/f83a2uW3387YWpxo32/ncee+98N77i+8fikQikUgkErk0RM1NJBKJRCKRHUU0biKRSCQSiewoonETiUQikUhkRxGNm0gkEolEIjuKaNxEIpFIJBLZUUTjJhKJRCKRyI4iGjeRSCQSiUR2FNG4iUQiW4r7778fIcS0nP1WQwjB+9///s0eRiQSOQOxK3gkEtnRfM/3fA8LCwsbZpA89NBDW6qPWCQSeTjRuIlEIheFpmlIkmSzh7HhbKXu75FIZG1iWCoSiawb5xy/+Iu/yKMf/WiyLOOaa67hv//3/z4NJb3nPe/hWc96Fnme81u/9VsA/MZv/AaPfexjyfOcxzzmMfzqr/7qqvf82Mc+xpOe9CTyPOepT30qn/rUp1Y9f+LECV784hezZ88eWq0W1113He94xzumz3/lK1/h+c9/PrOzs8zPz/Pc5z6X+++/H4A3vOEN/J//83/4gz/4A4QQCCG46667zjjHuq55+ctfzoEDB8jznGuvvZY77rhj+vzKsNQb3vCG6fuu/HvnO985/b7uuOMOHvnIR9JqtXjiE5/I7/3e753HNx+JRM6JS9LBKhKJ7Ahe9apX+bm5Of/Od77Tf+ELX/B/9Vd/5d/+9rf7++67zwP+EY94hP/93/99/6Uvfcl/9atf9f/3//5ff+DAgeljv//7v+/n5+f9O9/5Tu996Ha+Z88e/6IXvcjfc889/v/9v//nH/WoR3nAf+pTn/Lee/+yl73M33DDDf7v//7v/X333ec/+MEP+j/8wz/03ntf17V/7GMf67/v+77Pf+Yzn/Gf//zn/Yte9CJ//fXX+6qq/GAw8M9//vP9bbfdNu3IXVXVGef4pje9yV999dX+L//yL/3999/v/+qv/sq/613vmj4P+Pe9733T8a/s9v3mN7/Zt9tt/9nPftZ77/3P/dzP+cc85jH+Ax/4gP/iF7/o3/GOd/gsy/xdd921wWcmEomsJBo3kUhkXSwtLfksy/zb3/72hz23bNy85S1vWfX413zN16wyDLz3/md/9mf9TTfd5L33/td//df9rl27fFEU0+ff9ra3rTJuvuM7vsN/7/d+75pj+s3f/E1//fXXe+fc9LGqqnyr1fJ/9md/5r33/vbbb/fPfe5z1z3PH/7hH/b/9t/+21XvuZKVxs1K7r77bp/nuX/Pe97jvfe+LEvfbrf93/7t36467vu///v9C1/4wnWPJxKJnDtRcxOJRNbFP/7jP1JVFTfffPNpj3nqU586/fdoNOKLX/wi3//9389LX/rS6ePGGGZmZqbv+YQnPIE8z6fP33TTTave84d+6If4ru/6Lj75yU/y7Gc/m+c973l84zd+IwD/8A//wBe+8AV6vd6q15RlyRe/+MXzmuf3fM/38C3f8i1cf/313HbbbXz7t387z372s8/4mgceeIDnPe95/PiP/zjPf/7zAfjCF77AeDzmW77lW1YdW9c1T3rSk85rbJFIZH1E4yYSiayLVqt11mM6nc7038PhEIC3v/3t3HjjjauOU0qt+3Of85zn8OUvf5k/+ZM/4YMf/CA333wzL3vZy3jzm9/McDjkKU95ylTfs5I9e/as+zNW8uQnP5n77ruPP/3TP+VDH/oQz3/+87nllltOq5UZjUZ853d+JzfddBM/8zM/M318ef5//Md/zJVXXrnqNVmWndfYIpHI+ojGTSQSWRfXXXcdrVaLO++8k//8n//zWY/ft28fV1xxBV/60pd48YtfvOYxj33sY/nN3/xNyrKcem/+7u/+7mHH7dmzh9tvv53bb7+dZzzjGbzyla/kzW9+M09+8pN5z3vew969e+n3+2t+RpqmWGvPYabQ7/d5wQtewAte8AK++7u/m9tuu43jx48zPz+/6jjvPf/xP/5HnHP85m/+JkKI6XOPe9zjyLKMBx54gGc961nn9PmRSOTCiMZNJBJZF3me8+pXv5pXvepVpGnKN33TN3HkyBE+97nPnTZU9dM//dP81//6X5mZmeG2226jqio+/vGPc+LECV7xilfwohe9iJ/8yZ/kpS99Ka997Wu5//77efOb37zqPV73utfxlKc8ha/7uq+jqir+6I/+iMc+9rEAvPjFL+ZNb3oTz33uc/mZn/kZrrrqKr785S/z3ve+l1e96lVcddVVPOIRj+DP/uzPuPfee9m1axczMzNnTFH/pV/6JQ4cOMCTnvQkpJT87u/+Lvv372d2dvZhx77hDW/gQx/6EH/+53/OcDicemtmZmbo9Xr8+I//OP/tv/03nHN88zd/M4uLi/zN3/wN/X6f22+//TzPRCQSOSubLfqJRCLbB2ut/7mf+zl/7bXX+iRJ/DXXXON//ud/fiooXhYBr+S3fuu3/A033ODTNPVzc3P+mc98pn/ve987ff7uu+/2T3ziE32apv6GG27wv//7v7/qvX72Z3/WP/axj/WtVsvPz8/75z73uf5LX/rS9PUPPfSQf8lLXuJ3797tsyzzj3rUo/xLX/pSv7i46L33/vDhw/5bvuVbfLfb9YD/8Ic/fMY5/q//9b/8DTfc4Dudju/3+/7mm2/2n/zkJ6fPs0JQ/KxnPcsDD/t7xzve4b333jnn3/KWt/jrr7/eJ0ni9+zZ42+99Vb/kY985Ny//Egksm6E995vmmUViUQikUgkssHEIn6RSCQSiUR2FNG4iUQilxU///M/T7fbXfPvOc95zmYPLxKJbAAxLBWJRC4rjh8/zvHjx9d8rtVqPSxtOxKJbD+icROJRCKRSGRHEcNSkUgkEolEdhTRuIlEIpFIJLKjiMZNJBKJRCKRHUU0biKRSCQSiewoonETiUQikUhkRxGNm0gkEolEIjuKaNxEIpFIJBLZUUTjJhKJRCKRyI7i/wcccfopXYV0zgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gwascat_path=f\"{release_path}/{release_ver}/study_index/gwas_catalog\"\n", + "# Gwas Catalog:\n", + "gwascat_index=session.spark.read.parquet(gwascat_path, recursiveFileLookup=True)\n", + "# Number of GWAS curated studies\n", + "# Number of studies with full GWAS sumstats\n", + "#gwascat_index\n", + "# The histogram/density plot for total sample size separately for curated studies and full GWAS\n", + "#gwascat_index.filter(f.col(\"hasSumstats\") == True).select(f.col(\"nSamples\")).toPandas().plot.hist(bins=25, alpha=0.5, label=\"Sumstats GWAScat sample size\", title=\"Sumstats GWAScat sample size\")\n", + "#gwascat_index.filter(f.col(\"hasSumstats\") == False).select(f.col(\"nSamples\")).toPandas().plot.hist(bins=25, alpha=0.5, label=\"Sumstats GWAScat sample size\", title=\"Curated GWAScat sample size\")\n", + "\n", + "# Credible_set. Please use Daniels’ notebook as a reference. For each subfolder:\n", + "# gwas catalog sumstats (PICs):\n", + "gwascat_sumstats_path=f\"{release_path}/{release_ver}/credible_set/gwas_catalog_PICSed_summary_statistics\"\n", + "# Number of CSs.\n", + "gwascat_sumstats=session.spark.read.parquet(gwascat_sumstats_path, recursiveFileLookup=True)\n", + "\n", + "\n", + "\n", + "sample_size_quartiles = gwascat_index.join(gwascat_sumstats, how=\"inner\", on=\"studyId\").stat.approxQuantile(\"nSamples\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "\n", + "gwascat_sumstats_fm=gwascat_sumstats.select(\"studyId\", \"studyLocusId\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\")))\n", + "gwascat_sumstats_fm.select(\"credset_size\", \"top_PP\").toPandas().plot.scatter(x=\"credset_size\", y=\"top_PP\", alpha=0.05, label=\"gwascat sumstats PICS CS\", title=\"gwascat sumstats PICS CS\")\n", + "\n", + "sample_size_quartiles = gwascat_sumstats_fm.stat.approxQuantile(\"credset_size\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "\n", + "# gwas catalog curated (PICs):\n", + "gwascat_curated_path=f\"{release_path}/{release_ver}/credible_set/gwas_catalog_PICSed_curated_associations\"\n", + "# Number of CSs.\n", + "gwascat_curated=session.spark.read.parquet(gwascat_curated_path, recursiveFileLookup=True)\n", + "#gwascat_sumstats.printSchema()\n", + "# keep only credible sets snps\n", + "\n", + "gwascat_curated_fm=gwascat_curated.select(\"studyId\", \"studyLocusId\", \"locus.posteriorProbability\").withColumn(\"top_PP\", f.col(\"posteriorProbability\").getItem(0)).withColumn(\"credset_size\", f.size(f.col(\"posteriorProbability\")))\n", + "gwascat_curated_fm.select(\"credset_size\", \"top_PP\").toPandas().plot.scatter(x=\"credset_size\", y=\"top_PP\", alpha=0.05, label=\"gwascat curated PICS CS\", title=\"gwascat curated PICS CS\")\n", + "sample_size_quartiles = gwascat_index.join(gwascat_sumstats, how=\"anti\", on=\"studyId\").stat.approxQuantile(\"nSamples\", [0.25, 0.5, 0.75], 0.01)\n", + "\n", + "sample_size_quartiles = gwascat_curated_fm.stat.approxQuantile(\"credset_size\", [0.25, 0.5, 0.75], 0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 6. Analyze colocalization data:\n", + " - Count the total number of colocalizations and the number with clpp > 0.8.\n", + " - Calculate the average number of overlaps per credible set." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of colocalisations: 46733065 , of which, 4031821 > 0.8 clpp ( 8.6 %)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 360:============================================> (12 + 3) / 15]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average number of overlaps per CS: 90.79159130338489\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "coloc_path=f\"{release_path}/{release_ver}/colocalisation\"\n", + "coloc=session.spark.read.parquet(coloc_path, recursiveFileLookup=True)\n", + "\n", + "Avg_overlaps=coloc.groupBy(\"leftStudyLocusId\").count().agg(f.avg(\"count\")).collect()[0][0]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 7. Analyze locus-to-gene (L2G) predictions:\n", + " - Histogram of l2g score distribution.\n", + " - Number of CS with at least one gene with L2G>=0.5\n", + " - Number of CS with more than one gene with L2G>=0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A total of 10561869 l2g predictions were computed.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 8591772 UNIQUE locus to gene predictions for 607372 unique studyloci\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Where 357875 studyloci contains at least one gene with score > 0.5\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Of these, 122485 studyloci contains more than one gene with score > 0.5\n" + ] + }, + { + "data": { + "image/png": "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lCk7duxQly5dFBMTowULFhS6AnFep06d9NNPP+nzzz/37Dt37pzefvvty54jLy+v0C2T8PBwRUVFKSsrS5LUvHlz1a5dW5MnT9apU6cKjDX//9M6kZGRatasmd5///0CY7Zt26alS5eqc+fOl83Ss2dP+fn56YUXXij0hXbGGP3yyy+SpPT0dOXm5hZ4vnHjxipXrpwnM4Dicc3c+rmUgwcPasaMGTp48KCioqIkSSNGjNDixYs1Y8YMjRs3Tvv27dOBAwc0Z84czZo1S3l5eRo2bJjuu+8+rVixwuF3ABS/jIwMderUSSdPntRzzz2nL774osDzdevWVevWrSVJjz/+uN544w317dtXQ4cOVWRkpD788ENVqFBBkgqtXfn9eWrWrKn77rtPTZs21XXXXafly5dr/fr1mjhxoiSpXLlymjZtmrp27apmzZpp4MCBioyM1I8//qgffvhBS5YskSS98sorio+PV+vWrTVo0CDPx5NDQ0M1ZsyYy77nunXrauzYsRo5cqT279+v7t27Kzg4WCkpKZo3b54ee+wxjRgxQitWrNCQIUPUq1cvxcbGKjc3V//zP/8jPz8//fGPf/RmugFcKYev6BQL/e7Wz4IFC4wkExQUVODh7+9vevfubYwx5tFHHy10CXjDhg1GEreDcE36/a2flJQUI+mij4SEhAKv37dvn+nSpYsJDAw01apVM88++6z59NNPjSSzbt26i543KyvLPPfcc6Zp06YmODjYBAUFmaZNm5o333yz0Ng1a9aYjh07esY1adLETJkypcCY5cuXm7i4OBMYGGhCQkJM165dzfbt2wuMuditn/M+/fRT06ZNG8/fDfXr1zeJiYmevw/27dtnHn74YVO3bl1ToUIFU7lyZdOuXTuzfPnyy00zgKvkMuba+wUeLpdL8+bNU/fu3SX99umFfv366Ycffii0YO66665TRESERo8erXHjxiknJ8fz3NmzZ1WxYkUtXbpUHTt2LMm3AJRKkydP1rBhw3T48GHVqFHD6TgArgFl4tbPzTffrLy8PB0/flxt27a94Ji4uDjl5uZq7969qlu3riRp165dkqRatWqVWFagtDh79myBNSznzp3TW2+9pXr16lFSAPjMNVNUTp8+rT179ni2U1JStHnzZlWuXFmxsbHq16+f+vfvr4kTJ+rmm2/WiRMnlJycrCZNmqhL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gLUoKgAAwFoUFQAAYC2KCgAAsBZFBQAAWIuiAgAArEVRAQAA1qKoAAAAa1FUAACAtSgqAADAWhQVAABgLYoKAACwFkUFAABYi6ICAACs5WhRGTNmjFwuV4FH/fr1nYwEAAAs4u90gIYNG2r58uWebX9/xyMBAABLON4K/P39FRER4XQMAABgIcfXqOzevVtRUVGqU6eO+vXrp4MHD150bFZWltLT0ws8AADAtcvRonLrrbdq5syZWrx4saZNm6aUlBS1bdtWGRkZFxyflJSk0NBQzyM6OrqEEwMAgJLkMsYYp0Ocd+rUKdWqVUuTJk3SoEGDCj2flZWlrKwsz3Z6erqio6OVlpamkJAQn+d5bdkunx+zuA3rGOt0BAAALik9PV2hoaFX9PPb8TUq/y4sLEyxsbHas2fPBZ93u91yu90lnAoAADjF8TUq/+706dPau3evIiMjnY4CAAAs4GhRGTFihL788kvt379fX331lXr06CE/Pz/17dvXyVgAAMASjt76OXz4sPr27atffvlF1apVU5s2bbRu3TpVq1bNyVgAAMASjhaV2bNnO3l6AABgOavWqAAAAPw7igoAALAWRQUAAFiLogIAAKxFUQEAANaiqAAAAGtRVAAAgLW8Kir79u3zdQ4AAIBCvCoqN9xwg9q1a6cPPvhA586d83UmAAAASV4WlY0bN6pJkyYaPny4IiIi9Pjjj+vbb7/1dTYAAFDGeVVUmjVrptdff11HjhzRe++9p9TUVLVp00aNGjXSpEmTdOLECV/nBAAAZdBVLab19/dXz549NWfOHL388svas2ePRowYoejoaPXv31+pqam+ygkAAMqgqyoq3333nZ588klFRkZq0qRJGjFihPbu3atly5bpyJEj6tatm69yAgCAMsir3548adIkzZgxQzt37lTnzp01a9Ysde7cWeXK/dZ7ateurZkzZyomJsaXWQEAQBnjVVGZNm2aHn74YQ0YMECRkZEXHBMeHq533333qsIBAICyzauisnv37suOCQgIUEJCgjeHBwAAkOTlGpUZM2Zozpw5hfbPmTNH77///lWHAgAAkLwsKklJSapatWqh/eHh4Ro3btxVhwIAAJC8LCoHDx5U7dq1C+2vVauWDh48eNWhAAAAJC+LSnh4uL7//vtC+7ds2aIqVapcdSgAAADJy6LSt29fPf3001q5cqXy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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "l2g_path=f\"{release_path}/{release_ver}/locus_to_gene_predictions\"\n", + "l2g=session.spark.read.parquet(l2g_path, recursiveFileLookup=True)\n", + "l2g.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"l2g scores\")\n", + "\n", + "# There are duplicated l2g predictions studyLocusId with finngen pics and susie" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are definitely duplicated studylocusIDs in the l2g predictions, and still around 20% of studylocus contains more than 1 gene with score>0.5. It is not possible to separate out these predictions based on whether they came from pics or susie, as the l2g outputs only contains the studylocusID (duplicated between pics and susie). \n", + "\n", + "If 20% is too high then it implies finngen pics and susie l2g are pointing (confidently) at different genes for the same studylocus.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 7. Analyze locus-to-gene (L2G) predictions:\n", + " - Consider only the top gene assignments from l2g:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pyspark.sql import Window\n", + "\n", + "window = Window.partitionBy(l2g[\"studyLocusId\"]).orderBy(l2g[\"score\"].desc())\n", + "l2g = l2g.withColumn(\"rn\", f.row_number().over(window))\n", + "l2g_max_scores = l2g.filter(l2g[\"rn\"] == 1).drop(\"rn\")\n", + "l2g_max_scores.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"l2g scores (top gene assignment)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 7. Analyze locus-to-gene (L2G) predictions:\n", + " - Consider only the top gene assignments from l2g:\n", + " - How does this look when separated by datasource?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of finngen PICS l2g scores: mean: 0.5615633023783144 L.quart: 0.2371208220720291 Median: 0.6145811676979065 U.quart: 0.8626531362533569\n" + ] + }, + { + "data": { + "image/png": "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UWBgILy9vVGrVi2kpqZi69atOHLkCA4cOIDbt29j69at6N69O6pVq4YLFy5g6tSp6NChA5o2bQoA8PT0hLOzM4YPH46QkBAkJCRg9uzZ8Pf3l77yGj9+PNasWYMZM2Zg9OjROHToEHbs2IGwsLBS24+8o1F5oYhKj4WFRaFnGRIREZUWnQaipKQkjBgxAvHx8TA3N0fTpk1x4MABdO3aFffv30dERARWrlyJ9PR02Nvbo3///pg9e7Z0f319fezduxcTJkyAm5sbTE1N4evrq3XdIkdHR4SFhWHq1KlYtWoVatasiQ0bNpTqNYgUCgVsbW1hZWWFrKysUluv3BkaGvLIEBERlQudXqm6sijOlS6JiIh0jVeqfqE47986H1RNREREpGsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHs6DUTr1q1D06ZNoVaroVar4ebmhn379knLnz9/Dn9/f1SrVg1VqlRB//79kZiYqLWOuLg4+Pj4wMTEBFZWVpg+fTqys7O12hw5cgQtWrSASqVC3bp1ERoaWh67R0RERJWETgNRzZo1sXjxYkRHR+PMmTPo0qULevfujcuXLwMApk6div/973/YuXMnjh49igcPHqBfv37S/XNycuDj44PMzEycPHkSmzdvRmhoKObMmSO1iY2NhY+PDzp37oyYmBhMmTIFY8aMwYEDB8p9f4mIiKhiUgghhK6LeJmlpSWWLl2KAQMGoEaNGti6dSsGDBgAALh27RoaNWqEqKgotGnTBvv27UOPHj3w4MEDWFtbAwDWr1+PmTNn4uHDh1AqlZg5cybCwsJw6dIlaRuDBw9GcnIy9u/f/0Y1aTQamJubIyUlBWq1uvR3moiIqBStCL+h6xKKbWrX+qW+zuK8f1eYMUQ5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YSgiIiJ6h1XoI0SvqlOnDqpXr45bt24BAGxsbJCUlKTVJjs7G48fP5bGHdnY2CAxMVGrTd50YWOTVCoV1Gq11o2IiIjeXZUqEP3555949OgRbG1tAQBubm5ITk5GdHS01ObQoUPIzc1F69atpTbHjh1DVlaW1CY8PBwNGjQocPwQERERyY9OA1FaWhpiYmIQExMDAIiNjUVMTAzi4uKQlpaG6dOn49SpU7h79y4iIyPRu3dv1K1bF15eXgCARo0aoVu3bhg7dix+//13nDhxApMmTcLgwYNhZ2cHABg6dCiUSiX8/Pxw+fJlbN++HatWrdL6SoyIiIjkTaeB6MyZM/jHP/6Bf/zjHwCAgIAA/OMf/8CcOXOgr6+PCxcuoFevXqhfvz78/Pzg6uqK3377TetaRFu2bEHDhg3h7u6O7t27o127dvj222+l5ebm5jh48CBiY2Ph6uqKadOmYc6cOTzlnoiIiCQ6HVTdqVOnIn/+48CBA69dh6WlpXQRxsI0bdoUv/32W7HrIyIiInmoVGOIiIiIiMoCAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREclehf5xV6LStCL8hq5LKLapXevrugQiIlngESIiIiKSPQYiIiIikj0GIiIiIpI9BiIiIiKSPQ6qJqJSxcHrRFQZ8QgRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyZ6BrgsgosKtCL+h6xKIiGSBgYiIZI/Bk4j4lRkRERHJnk4D0bFjx9CzZ0/Y2dlBoVDgp59+0louhMCcOXNga2sLY2NjeHh44ObNm1ptHj9+jGHDhkGtVsPCwgJ+fn5IS0vTanPhwgW0b98eRkZGsLe3R0hISFnvGhEREVUiOg1E6enpaNasGb7++usCl4eEhOCrr77C+vXrcfr0aZiamsLLywvPnz+X2gwbNgyXL19GeHg49u7di2PHjmHcuHHSco1GA09PTzg4OCA6OhpLly5FUFAQvv322zLfPyIiIqocFEIIoesiAEChUGDPnj3o06cPgBdHh+zs7DBt2jR89tlnAICUlBRYW1sjNDQUgwcPxtWrV+Hs7Iw//vgDLVu2BADs378f3bt3x59//gk7OzusW7cOs2bNQkJCApRKJQDgn//8J3766Sdcu3btjWrTaDQwNzdHSkoK1Gp1qe87xy8QEZHcTe1av9TXWZz37wo7hig2NhYJCQnw8PCQ5pmbm6N169aIiooCAERFRcHCwkIKQwDg4eEBPT09nD59WmrToUMHKQwBgJeXF65fv44nT54UuO2MjAxoNBqtGxEREb27KmwgSkhIAABYW1trzbe2tpaWJSQkwMrKSmu5gYEBLC0ttdoUtI6Xt/Gq4OBgmJubSzd7e/u33yEiIiKqsCpsINKlwMBApKSkSLf79+/ruiQiIiIqQxU2ENnY2AAAEhMTteYnJiZKy2xsbJCUlKS1PDs7G48fP9ZqU9A6Xt7Gq1QqFdRqtdaNiIiI3l0VNhA5OjrCxsYGkZGR0jyNRoPTp0/Dzc0NAODm5obk5GRER0dLbQ4dOoTc3Fy0bt1aanPs2DFkZWVJbcLDw9GgQQNUrVq1nPaGiIiIKjKdBqK0tDTExMQgJiYGwIuB1DExMYiLi4NCocCUKVOwYMEC/PLLL7h48SJGjBgBOzs76Uy0Ro0aoVu3bhg7dix+//13nDhxApMmTcLgwYNhZ2cHABg6dCiUSiX8/Pxw+fJlbN++HatWrUJAQICO9pqIiIgqGp3+dMeZM2fQuXNnaTovpPj6+iI0NBQzZsxAeno6xo0bh+TkZLRr1w779++HkZGRdJ8tW7Zg0qRJcHd3h56eHvr374+vvvpKWm5ubo6DBw/C398frq6uqF69OubMmaN1rSIiIiKStwpzHaKKjNchIiIiKlu8DhERERGRjjEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkexV6EAUFBQEhUKhdWvYsKG0/Pnz5/D390e1atVQpUoV9O/fH4mJiVrriIuLg4+PD0xMTGBlZYXp06cjOzu7vHeFiIiIKjADXRfwOo0bN0ZERIQ0bWDw/yVPnToVYWFh2LlzJ8zNzTFp0iT069cPJ06cAADk5OTAx8cHNjY2OHnyJOLj4zFixAgYGhpi0aJF5b4vREREVDFV+EBkYGAAGxubfPNTUlLw3XffYevWrejSpQsAYNOmTWjUqBFOnTqFNm3a4ODBg7hy5QoiIiJgbW2N5s2bY/78+Zg5cyaCgoKgVCoL3GZGRgYyMjKkaY1GUzY7R0RERBVChf7KDABu3rwJOzs71KlTB8OGDUNcXBwAIDo6GllZWfDw8JDaNmzYELVq1UJUVBQAICoqCi4uLrC2tpbaeHl5QaPR4PLly4VuMzg4GObm5tLN3t6+jPaOiIiIKoIKHYhat26N0NBQ7N+/H+vWrUNsbCzat2+P1NRUJCQkQKlUwsLCQus+1tbWSEhIAAAkJCRohaG85XnLChMYGIiUlBTpdv/+/dLdMSIiIqpQKvRXZt7e3tL/mzZtitatW8PBwQE7duyAsbFxmW1XpVJBpVKV2fqJiIioYqnQR4heZWFhgfr16+PWrVuwsbFBZmYmkpOTtdokJiZKY45sbGzynXWWN13QuCQiIiKSp0oViNLS0nD79m3Y2trC1dUVhoaGiIyMlJZfv34dcXFxcHNzAwC4ubnh4sWLSEpKktqEh4dDrVbD2dm53OsnIiKiiqlCf2X22WefoWfPnnBwcMCDBw8wd+5c6OvrY8iQITA3N4efnx8CAgJgaWkJtVqNTz75BG5ubmjTpg0AwNPTE87Ozhg+fDhCQkKQkJCA2bNnw9/fn1+JERERkaRCB6I///wTQ4YMwaNHj1CjRg20a9cOp06dQo0aNQAAK1asgJ6eHvr374+MjAx4eXlh7dq10v319fWxd+9eTJgwAW5ubjA1NYWvry/mzZunq10iIiKiCkghhBC6LqKi02g0MDc3R0pKCtRqdamvf0X4jVJfJxERUWUytWv9Ul9ncd6/K9UYIiIiIqKywEBEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyJ6tA9PXXX6N27dowMjJC69at8fvvv+u6JCIiIqoAZBOItm/fjoCAAMydOxdnz55Fs2bN4OXlhaSkJF2XRkRERDomm0C0fPlyjB07FqNGjYKzszPWr18PExMTbNy4UdelERERkY4Z6LqA8pCZmYno6GgEBgZK8/T09ODh4YGoqKh87TMyMpCRkSFNp6SkAAA0Gk2Z1Pc8Pa1M1ktERFRZlMV7bN46hRCvbSuLQPT3338jJycH1tbWWvOtra1x7dq1fO2Dg4PxxRdf5Jtvb29fZjUSERHJ2edluO7U1FSYm5sX2UYWgai4AgMDERAQIE3n5ubi8ePHqFatGhQKRaluS6PRwN7eHvfv34darS7VddP/Yz+XD/Zz+WFflw/2c/koq34WQiA1NRV2dnavbSuLQFS9enXo6+sjMTFRa35iYiJsbGzytVepVFCpVFrzLCwsyrJEqNVq/rGVA/Zz+WA/lx/2dflgP5ePsujn1x0ZyiOLQdVKpRKurq6IjIyU5uXm5iIyMhJubm46rIyIiIgqAlkcIQKAgIAA+Pr6omXLlmjVqhVWrlyJ9PR0jBo1StelERERkY7JJhANGjQIDx8+xJw5c5CQkIDmzZtj//79+QZalzeVSoW5c+fm+4qOShf7uXywn8sP+7p8sJ/LR0XoZ4V4k3PRiIiIiN5hshhDRERERFQUBiIiIiKSPQYiIiIikj0GIiIiIpI9BiIiIiKSPQaicvD111+jdu3aMDIyQuvWrfH7778X2X7nzp1o2LAhjIyM4OLigl9//bWcKq3citPP//73v9G+fXtUrVoVVatWhYeHx2sfF3qhuM/nPNu2bYNCoUCfPn3KtsB3SHH7Ojk5Gf7+/rC1tYVKpUL9+vX5+vEGitvPK1euRIMGDWBsbAx7e3tMnToVz58/L6dqK6djx46hZ8+esLOzg0KhwE8//fTa+xw5cgQtWrSASqVC3bp1ERoaWrZFCipT27ZtE0qlUmzcuFFcvnxZjB07VlhYWIjExMQC2584cULo6+uLkJAQceXKFTF79mxhaGgoLl68WM6VVy7F7eehQ4eKr7/+Wpw7d05cvXpVjBw5Upibm4s///yznCuvXIrbz3liY2PFe++9J9q3by969+5dPsVWcsXt64yMDNGyZUvRvXt3cfz4cREbGyuOHDkiYmJiyrnyyqW4/bxlyxahUqnEli1bRGxsrDhw4ICwtbUVU6dOLefKK5dff/1VzJo1S+zevVsAEHv27Cmy/Z07d4SJiYkICAgQV65cEatXrxb6+vpi//79ZVYjA1EZa9WqlfD395emc3JyhJ2dnQgODi6w/cCBA4WPj4/WvNatW4uPP/64TOus7Irbz6/Kzs4WZmZmYvPmzWVV4juhJP2cnZ0tPvjgA7Fhwwbh6+vLQPSGitvX69atE3Xq1BGZmZnlVeI7obj97O/vL7p06aI1LyAgQLRt27ZM63yXvEkgmjFjhmjcuLHWvEGDBgkvL68yq4tfmZWhzMxMREdHw8PDQ5qnp6cHDw8PREVFFXifqKgorfYA4OXlVWh7Klk/v+rp06fIysqCpaVlWZVZ6ZW0n+fNmwcrKyv4+fmVR5nvhJL09S+//AI3Nzf4+/vD2toaTZo0waJFi5CTk1NeZVc6JennDz74ANHR0dLXanfu3MGvv/6K7t27l0vNcqGL90LZ/HSHLvz999/IycnJ9/Mg1tbWuHbtWoH3SUhIKLB9QkJCmdVZ2ZWkn181c+ZM2NnZ5fsDpP9Xkn4+fvw4vvvuO8TExJRDhe+OkvT1nTt3cOjQIQwbNgy//vorbt26hYkTJyIrKwtz584tj7IrnZL089ChQ/H333+jXbt2EEIgOzsb48ePx+eff14eJctGYe+FGo0Gz549g7Gxcalvk0eISPYWL16Mbdu2Yc+ePTAyMtJ1Oe+M1NRUDB8+HP/+979RvXp1XZfzzsvNzYWVlRW+/fZbuLq6YtCgQZg1axbWr1+v69LeKUeOHMGiRYuwdu1anD17Frt370ZYWBjmz5+v69LoLfEIURmqXr069PX1kZiYqDU/MTERNjY2Bd7HxsamWO2pZP2c58svv8TixYsRERGBpk2blmWZlV5x+/n27du4e/cuevbsKc3Lzc0FABgYGOD69etwcnIq26IrqZI8p21tbWFoaAh9fX1pXqNGjZCQkIDMzEwolcoyrbkyKkk//+tf/8Lw4cMxZswYAICLiwvS09Mxbtw4zJo1C3p6PM5QGgp7L1Sr1WVydAjgEaIypVQq4erqisjISGlebm4uIiMj4ebmVuB93NzctNoDQHh4eKHtqWT9DAAhISGYP38+9u/fj5YtW5ZHqZVacfu5YcOGuHjxImJiYqRbr1690LlzZ8TExMDe3r48y69USvKcbtu2LW7duiWFTgC4ceMGbG1tGYYKUZJ+fvr0ab7QkxdCBX8rvdTo5L2wzIZrkxDixSmdKpVKhIaGiitXrohx48YJCwsLkZCQIIQQYvjw4eKf//yn1P7EiRPCwMBAfPnll+Lq1ati7ty5PO3+DRS3nxcvXiyUSqXYtWuXiI+Pl26pqam62oVKobj9/CqeZfbmitvXcXFxwszMTEyaNElcv35d7N27V1hZWYkFCxboahcqheL289y5c4WZmZn473//K+7cuSMOHjwonJycxMCBA3W1C5VCamqqOHfunDh37pwAIJYvXy7OnTsn7t27J4QQ4p///KcYPny41D7vtPvp06eLq1eviq+//pqn3b8LVq9eLWrVqiWUSqVo1aqVOHXqlLSsY8eOwtfXV6v9jh07RP369YVSqRSNGzcWYWFh5Vxx5VScfnZwcBAA8t3mzp1b/oVXMsV9Pr+Mgah4itvXJ0+eFK1btxYqlUrUqVNHLFy4UGRnZ5dz1ZVPcfo5KytLBAUFCScnJ2FkZCTs7e3FxIkTxZMnT8q/8Erk8OHDBb7m5vWtr6+v6NixY777NG/eXCiVSlGnTh2xadOmMq1RIQSP8REREZG8cQwRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREckeAxERERHJHgMRERERyR4DEREREcne/wHVGBQtmGPHqwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "l2g_finngen_pics=l2g_max_scores.join(finngen_pics.select(\"studyLocusId\", \"studyId\"), on=\"studyLocusId\", how=\"inner\")\n", + "l2g_finngen_pics.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"l2g scores (top gene assignment), finngen_pics\")\n", + "\n", + "sample_size_quartiles = l2g_finngen_pics.stat.approxQuantile(\"score\", [0.25, 0.5, 0.75], 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of l2g_finngen_susie: mean: 0.5593829938336615 L.quart: 0.2241434007883072 Median: 0.6244931817054749 U.quart: 0.8736903071403503\n" + ] + }, + { + "data": { + "image/png": "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qqlly5Z67bXXtH37dm3evFkDBw5U586d5efnJ0nq0qWLLBaL+vTpo/379+vHH3/Up59+qqFDh9rpqAEAQH5j14/MduzYoWbNmlnvp4eUHj16KCIiQsOHD9f169fVr18/XblyRc8++6xWrlypwoULW9eZN2+eBg4cqODgYDk6Oqpjx46aNm2adbmHh4dWr16tsLAwBQYGqlSpUho9ejSX3AMAACsHwzAMexeR3yUkJMjDw0Px8fFyd3fP8e0XxLktyBvMIcL98LqBx01uvN5l5f07384hAgAAyCsEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHoEIgAAYHrO9i4AAOyNX44HQCACkKMIFwAKIj4yAwAApkcgAgAApkcgAgAApsccIiAfYz4OAOQNzhABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTIxABAADTy9eBaOzYsXJwcLC5Va1a1br81q1bCgsLU8mSJVW0aFF17NhRcXFxNtuIiYlRmzZt5ObmJi8vL7399ttKSUnJ60MBAAD5mLO9C3iYGjVqaM2aNdb7zs7/V/KQIUO0fPlyLVy4UB4eHho4cKA6dOigzZs3S5JSU1PVpk0b+fj4aMuWLTp79qy6d++uQoUK6cMPP8zzYwEAAPlTvg9Ezs7O8vHxydAeHx+vb7/9VvPnz1fz5s0lSbNnz1a1atW0bds2NWjQQKtXr9aBAwe0Zs0aeXt7q06dOho/frxGjBihsWPHymKx5PXhAACAfChff2QmSUePHpWfn58qVqyorl27KiYmRpK0c+dOJScnKyQkxNq3atWqKlu2rLZu3SpJ2rp1q2rVqiVvb29rn9DQUCUkJGj//v333WdiYqISEhJsbgAA4PGVrwNR/fr1FRERoZUrV2rGjBmKjo5Wo0aNdPXqVcXGxspiscjT09NmHW9vb8XGxkqSYmNjbcJQ+vL0ZfczYcIEeXh4WG/+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "l2g_finngen_susie=l2g_max_scores.join(finngen_susie.select(\"studyLocusId\", \"studyId\"), on=\"studyLocusId\", how=\"inner\")\n", + "l2g_finngen_susie.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"(top gene assignment), l2g_finngen_susie\")\n", + "\n", + "sample_size_quartiles = l2g_finngen_susie.stat.approxQuantile(\"score\", [0.25, 0.5, 0.75], 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of l2g_gwas_curated PICS l2g scores: mean: 0.5761322645683256 L.quart: 0.22704362869262695 Median: 0.653652012348175 U.quart: 0.8937538862228394\n" + ] + }, + { + "data": { + "image/png": "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/361a9dO7u7ucnNzU4kSJfTiiy9K+t/rNSAgQOHh4frqq6/k6empkJAQTZo0KVPXU6UGYqvvkrxzbFItWrRIdevWlYuLi4oVK2Ze2pCRmjPzmj116pTKlSuX5nWW3nEyo+48bhYuXFi+vr73PG4eO3ZMFStWtPnP1J2yckx5FHBNFSxRvHhxJSUl6erVq+a1L9nN6je4lJQUVa9eXWPGjEl3+Z1v+Le/+d0u9Q04dQLUF1980ebsw+1Sry9Lz7Fjx9SsWTNVqlRJY8aMkb+/v5ycnLRkyRKNHTvW3L6dnZ2+//57/f777/r111+1fPlyvfzyyxo9erR+//13FS5cWF5eXtq1a5eWL1+upUuXaunSpZoxY4a6detm6V1t9xuT+/XLjjHNaE33khrAPD09M7xORsTExKhFixa6cuWKNmzYID8/P0u3n1W1atWSi4uL1q9fr1KlSsnLy0sVKlRQw4YNNXnyZMXHx2vDhg1q166duc6VK1fUuHFjubm56T//+Y/Kli0rFxcX7dixQwMGDLCZEHj06NHq0aOHfv75Z61YsUJvvvmmea1ketfqZdW9rhlKz+1npFJt2LBBbdq0UaNGjTR58mT5+vqqQIECmjFjhubMmXPfGh70OJBX5dQxJb8hVMESlSpVknTrLsDbDxB3O6iVLl1aknT48OE0yw4dOiRPT08VKlTIpv3o0aM2/5P8888/lZKSctezJrfv588//1STJk3M9qSkJJ08edKm1rJly2r37t1q1qyZJYGtRIkSKlKkiJKTk23uisyoX3/9VfHx8frll19szrbc+TFkqrp166pu3br6+OOPNWfOHHXt2lVz587VK6+8IunWbdOtW7dW69atlZKSor59++qLL77QBx98kO7ZisyMXU550DG9m/v9vk+cOCF7e3vzrKUVbt68qdatW+vIkSNauXJluh873f47uP21/88//2TqTFvqtlJSUnTixAmbsxd33p0p3XqtpN7pWapUKfMj04YNGyo+Pl6zZ89WdHS0GjVqZK6zdu1a/fPPP/rxxx9t2k+cOJFuPdWrV1f16tU1ePBgbdq0SfXr19fUqVP10Ucf3fe5PPbYY5J035nuixYtqitXrqRpTz0DmBE//PCDXFxctHz5cjk7O5vtM2bMSNM3vddRZl6zpUuX1r59+2QYhs220jtOZtTRo0dt/n6vXbumc+fO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "l2g_gwas_curated=l2g_max_scores.join(gwascat_curated.select(\"studyLocusId\", \"studyId\"), on=\"studyLocusId\", how=\"inner\")\n", + "l2g_gwas_curated.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"(top gene assignment), l2g_gwas_curated_pics\")\n", + "\n", + "sample_size_quartiles = l2g_gwas_curated.stat.approxQuantile(\"score\", [0.25, 0.5, 0.75], 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summary of l2g_gwas_sumstats PICS l2g scores: mean: 0.5751686123272477 L.quart: 0.23706066608428955 Median: 0.647024929523468 U.quart: 0.8808161020278931\n" + ] + }, + { + "data": { + "image/png": "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ah8yZIjGjBmjjh07Kjw8XNu3b1d4eLguXLiQ63088cQTmj9/vnr06KEWLVpo7dq1ioiIcOrToEED+fn5ad26dbrvvvskSevXr5erq6u2b99uzUFmZqY2btyop59+2npsTEyMvL29FR0dLW9vb61atUrDhg1TSkqKxo4dK0lKS0tTeHi4UlNT1b9/fwUEBOh///ufFi1apFOnTsnX19fWc+nSpYt27typ/v37q2bNmjp27JiWL1+ugwcPZvvdYVdWPa+//ro2bdqk9957T35+ftq4caOqV6+ut99+W99++63Gjh2rBg0a6PHHH5d0/Z+v1q1b67nnntPkyZP1yiuvKCgoSJKs/9qZt2u9TmfOnKnnnntODz74oAYMGKALFy7o559/1g8//KBHH300T3Pxt1fUqQ03tqFDhxpJ5vTp007tSUlJV/1rr3HjxqZy5crmzz//tNq2b99uXF1dzeOPP261Za003XfffU6P79u3r5Fktm/fftW6UlNTTYUKFcxtt91mLl68aLXHxMQYSU6rJf/973+Nq6urWb9+vdMYM2bMMJLMhg0brDZJxuFwmP379zvVLsm88847VluvXr1MlSpVzPHjx53G7Natm/H19TXnzp27au3GmBy3h4eHm5tuusm6/8UXXxhJ5qeffrrqOAMGDDA+Pj7Z/uK/3JUrTbmZu6zHBgUFmdTUVKt90qRJRpLZsWOH1Zb1F/OcOXOstj179hhJxtXV1WzatMlqX7ZsmZFkZs2aZbXZndPc1BQREZFtdelyc+bMMZLMDz/8cNU+13K1n4HL/fe//zWSnFbMEhISjLu7u3nggQec+o4YMcJIytVKU1xcnJFkBg4c6NT+xBNPZKsvIiLCaQWpc+fOpnPnzsbNzc1aTd2yZUu2FamcXq/PPPOMKV26tLVau3XrViPJWlnMi5MnTxpJZuzYsdfsd7V5v9pKU3h4uNMKUmhoqHFxcTF9+vSx2tLT0021atWcXv92fr4WLFiQ40quMfbmzZirv07vv/9+U79+/avuG7nHQQooUH/++afc3d2z/YV+NUePHtW2bdv0xBNPqHz58lZ7o0aNdOedd+rbb7/N9pislZUs/fv3l6Qc+2bZvHmz/vzzTz311FNyd///C67du3dXuXLlnPouWLBAQUFBqlevno4fP27d2rVrJ0lavXq1U/+wsDDVrl3bqXYfHx8dOHBA0qWVg88//1wdO3aUMcZpzPDwcCUnJ2vLli3XnCcvLy/r/5OTk3X8+HG1adNGBw4cUHJysiTJz89PkrRo0SJdvHgxx3H8/Px09uxZLV++/Jr7u1xu5i5Lz5495XA4rPutWrWSJGtOsnh7e6tbt27W/VtuuUV+fn4KCgpS8+bNrfas//8rc2q3pmvJer7Hjx+3/Zjc2LNnj6KiohQaGqrIyEirfeXKlUpPT1ffvn2d+me99nNj6dKlkmRrrFatWmnLli06e/aspEurqvfcc48aN26s9evXS7q0+uTi4qI77rjDetzlr9fTp0/r+PHjatWqlc6dO6c9e/ZIkrWStGzZMp07dy7XzyNrPw6HQ2vWrNHJkyfzNEZOevXqJRcXF+t+8+bNZYxRr169rDY3Nzc1bdrU6fWTl5+vy9mZt2vx8/PT4cOH9dNPP+Vp/8iO0IRi5Y8//pB06c3ySkFBQTp+/Lj1CztLnTp1nO7Xrl1brq6u1zwbJWs/N998s1O7u7t7tiX8X3/9VTt37lSlSpWcbnXr1pV06WOwy1WvXj3b/sqVK2f9Ek9KStKpU6f03nvvZRuzZ8+eOY55pQ0bNigsLExlypSRn5+fKlWqpFdeeUWSrNDUpk0bdenSRa+//roqVqyo+++/X7NmzVJqaqo1Tt++fVW3bl3dfffdqlatmp588knrTTQ/5u5qc5IVNq58Y6tWrZrTm5N06c00MDAwW9vlj8/LnNqt6VqMMZKUreb8kJCQoIiICPn6+uqzzz6Tm5ubte1q/wbly5e/anC9mj/++EOurq6qVauWU/uVY0uXQlN6erpiY2O1d+9eHTt2TK1atVLr1q2dQlNwcLDTHz07d+5Up06d5OvrKx8fH1WqVEmPPfaYpP//eq1Vq5aio6P1/vvvq2LFigoPD9fUqVOt7XZ4eHho9OjRWrJkifz9/dW6dWuNGTNGCQkJuZqTK135Wsl6/eX0urz89ZOXn6/L2Zm3axk8eLC8vb3VrFkz1alTR1FRUdqwYYPt/SM7jmlCgapQoYLS09N1+vRp69iTgpbfb2CZmZlq2LChxo8fn+P2K39xXv7mdrmsN9isC3w+9thjTqsHl8s6visnv/32m9q3b6969epp/PjxCgwMlMPh0LfffqsJEyZY47u4uOizzz7Tpk2b9M0332jZsmV68sknNW7cOG3atEne3t6qXLmytm3bpmXLlmnJkiVasmSJZs2apccffzxfzwq73pxcr19BzKndmq4l6w2yYsWKth9jR3Jysu6++26dOnVK69evV9WqVfN1/Lxq2rSpPD09tW7dOlWvXl2VK1dW3bp11apVK02bNk2pqalav369OnXqZD3m1KlTatOmjXx8fPTGG2+odu3a8vT01JYtWzR48GCnC96OGzdOTzzxhL766it99913eu6556xjFXM6Vi4nAwcOVMeOHfXll19q2bJleu211zRy5EitWrVK//znP6/52IyMjBzbc/O6vPz181d+vnIzb1cTFBSkvXv3atGiRVq6dKk+//xzTZs2TcOGDdPrr79+3ccjO0ITClS9evUkSfHx8U5vWlcLNjVq1JAk7d27N9u2PXv2qGLFiipTpoxT+6+//ur0V/L+/fuVmZl5zYM+s/azf/9+tW3b1mpPT0/X77//7lRr7dq1tX37drVv3z5fAlmlSpVUtmxZZWRkKCwsLNeP/+abb5Samqqvv/7a6S/gKz8mzNKiRQu1aNFC//73vzVnzhx1795dc+fOVe/evSVJDodDHTt2VMeOHZWZmam+ffvq3Xff1WuvvZbjakNu5q6w/NU5vZrr/XvHx8fL1dXVWnXMDxcuXFDHjh21b98+rVixQsHBwdn6XP5vcPlr/88//8z1x1I1atRQZmam4uPjnVZt9+/fn62vw+FQs2bNtH79elWvXt36SLNVq1ZKTU3VJ598osTERKdreq1Zs0Z//vmnFi5c6NQeHx+fYz0NGzZUw4YNNXToUG3cuFEtW7bUjBkz9NZbb9l+TrVr19bzzz+v559/Xr/++qsaN26scePG6eOPP5Z0aVXx1KlTTo9JS0vT0aNHbe/Druv9fF3tNZabebvW67RMmTLq2rWrunbtqrS0NHXu3Fn//ve/NWTIEC4Dkwd8PIcCFRoaKunScTCXK126tCRl+8VVpUoVNW7cWLNnz3ba9ssvv+i7777TPffck20fU6dOdbr/zjvvSJLuvvvuq9bVtGlTVahQQTNnzlR6errV/sknn2R703n44Yf1v//9TzNnzsw2zvnz57N9XHg9bm5u6tKliz7//PMcL1iYlJR03cdLzn/RJicna9asWU79Tp48mW3VpHHjxpJkfUT3559/Om13dXW1Qs/lH+NdLjdzV1j+6pxeTZkyZa75MUhcXJzq169v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Dx5UrVq1srXXqFFDBw8ezNVYDodDN998syQpJCREP/30kyZNmqSuXbsqLS1Np06dclptSkxMVEBAgCQpICAg21luWWfXXd7nyjPuEhMT5ePjIy8vL7m5ucnNzS3HPllj5MTDw0MeHh65eq4AAKDkytNKU+XKlfXzzz9na9++fbsqVKjwlwrKzMxUamqqQkJCVKpUKa1cudLatnfvXh08eFChoaGSpNDQUO3YscPpLLfly5fLx8dHwcHBVp/Lx8jqkzWGw+FQSEiIU5/MzEytXLnS6gMAAJCnlaZHHnlEzz33nMqWLavWrVtLktauXasBAwaoW7dutscZMmSI7r77blWvXl2nT5/WnDlztGbNGi1btky+vr7q1auXoqOjVb58efn4+Kh///4KDQ1VixYtJEkdOnRQcHCwevTooTFjxighIUFDhw5VVFSUtQrUp08fTZkyRS+99JKefPJJrVq1SvPnz9fixYutOqKjoxUZGammTZuqWbNmmjhxos6ePauePXvmZXoAAMANKE+h6c0339Tvv/+u9u3by9390hCZmZl6/PHHc3VM07Fjx6wrh/v6+qpRo0ZatmyZ7rzzTknShAkT5Orqqi5duig1NVXh4eGaNm2a9Xg3NzctWrRIzz77rEJDQ1WmTBlFRkbqjTfesPrUqlVLixcv1qBBgzRp0iRVq1ZN77//vsLDw60+Xbt2VVJSkoYNG6aEhAQ1btxYS5cuzXZwOAAA+PvK03Wasuzbt0/bt2+Xl5eXGjZsqBo1auRnbSUK12kCAJQkXKfpkty8f+dppSlL3bp1Vbdu/j8BAACA4iZPoSkjI0MxMTFauXKljh07pszMTKftq1atypfiAAAAios8haYBAwYoJiZGERERatCggVxcXPK7LgAAgGIlT6Fp7ty5mj9/vu655578rgcAAKBYytN1mi6/ICUAAMDfQZ5C0/PPP69JkybpL5x4BwAAUKLk6eO577//XqtXr9aSJUtUv359lSpVymn7woUL86U4AACA4iJPocnPz0+dOnXK71oAAChxSuL1jpA3eQpNs2bNyu86AAAAirU8HdMkSenp6VqxYoXeffddnT59WpJ05MgRnTlzJt+KAwAAKC7ytNL0xx9/6K677tLBgweVmpqqO++8U2XLltXo0aOVmpqqGTNm5HedAAAARSpPK00DBgxQ06ZNdfLkSXl5eVntnTp10sqVK/OtOAAAgOIiTytN69ev18aNG+VwOJzaa9asqf/973/5UhgAAEBxkqeVpszMTGVkZGRrP3z4sMqWLfuXiwIAAChu8hSaOnTooIkTJ1r3XVxcdObMGQ0fPpyvVgEAADekPH08N27cOIWHhys4OFgXLlzQo48+ql9//VUVK1bUp59+mt81AgAAFLk8haZq1app+/btmjt3rn7++WedOXNGvXr1Uvfu3Z0ODAcAALhR5Ck0SZK7u7see+yx/KwFAACg2MpTaProo4+uuf3xxx/PUzEAAADFVZ5C04ABA5zuX7x4UefOnZPD4VDp0qUJTQAA4IaTp7PnTp486XQ7c+aM9u7dqzvuuIMDwQEAwA0pz989d6U6depo1KhR2VahAAAAbgT5FpqkSweHHzlyJD+HBAAAKBbydEzT119/7XTfGKOjR49qypQpatmyZb4UBgAAUJzkKTQ98MADTvddXFxUqVIltWvXTuPGjcuPugAAAIqVPIWmzMzM/K4DAACgWMvXY5oAAABuVHlaaYqOjrbdd/z48XnZBQAAQLGSp9C0detWbd26VRcvXtQtt9wiSdq3b5/c3NzUpEkTq5+Li0v+VAkAAFDE8hSaOnbsqLJly2r27NkqV66cpEsXvOzZs6datWql559/Pl+LBAAAKGp5OqZp3LhxGjlypBWYJKlcuXJ66623OHsOAADckPIUmlJSUpSUlJStPSkpSadPn/7LRQEAABQ3eQpNnTp1Us+ePbVw4UIdPnxYhw8f1ueff65evXqpc+fO+V0jAABAkcvTMU0zZszQCy+8oEcffVQXL168NJC7u3r16qWxY8fma4EAAADFQZ5CU+nSpTVt2jSNHTtWv/32mySpdu3aKlOmTL4WBwAAUFz8pYtbHj16VEePHlWdOnVUpkwZGWPyqy4AAIBiJU+h6c8//1T79u1Vt25d3XPPPTp69KgkqVevXlxuAAAA3JDyFJoGDRqkUqVK6eDBgypdurTV3rVrVy1dujTfigMAACgu8nRM03fffadly5apWrVqTu116tTRH3/8kS+FAQAAFCd5Ck1nz551WmHKcuLECXl4ePzlopDdhOX7irqEv4VBd9Yt6hIAAMVUnj6ea9WqlT766CPrvouLizIzMzVmzBi1bds234oDAAAoLvK00jRmzBi1b99emzdvVlpaml566SXt3LlTJ06c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4uKigQMH6q233tLXX3+tHTt26PHHH1fVqlWtM+yCgoJ011136amnntKPP/6oDRs2qF+/furWrZuqVq0qSXr00UflcDjUq1cv7dy5U/PmzdOkSZMUHR1t1TFgwAAtXbpU48aN0549ezRixAht3rxZ/fr1K+wpAQAAxZR7Ue588+bNatu2rXU/K8hERkYqJiZGL730ks6ePaunn35ap06d0h133KGlS5fK09PTeswnn3yifv36qX379nJ1dVWXLl00efJka7uvr6++++47RUVFKSQkRBUrVtSwYcOcruV0++23a86cORo6dKheeeUV1alTR19++aUaNGhQCLMAAABKgmJznaaSjus0AQBQsLhOEwAAQAlAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdB0halTp6pmzZry9PRU8+bN9eOPPxZ1SQAAoBggNF1m3rx5io6O1vDhw7VlyxbdeuutCg8P17Fjx4q6NAAAUMQITZcZP368nnrqKfXs2VPBwcGaMWOGSpcurQ8//LCoSwMAAEXMvagLKC7S0tIUFxenIUOGWG2urq4KCwtTbGxstv6pqalKTU217icnJ0uSUlJSCqS+C2fPFMi4AACUFAXxHps1pjHmun0JTf/n+PHjysjIkL+/v1O7v7+/9uzZk63/yJEj9frrr2drDwwMLLAaAQD4O3ulAMc+ffq0fH19r9mH0JRHQ4YMUXR0tHU/MzNTJ06cUIUKFeTi4pJv+0lJSVFgYKAOHTokHx+ffBsX2THX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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "l2g_gwas_sumstats=l2g_max_scores.join(gwascat_sumstats.select(\"studyLocusId\", \"studyId\"), on=\"studyLocusId\", how=\"inner\")\n", + "l2g_gwas_sumstats.select(\"score\").toPandas().plot.hist(bins=10, alpha=0.5, title=\"(top gene assignment), l2g_gwas_sumstats\")\n", + "\n", + "sample_size_quartiles = l2g_gwas_sumstats.stat.approxQuantile(\"score\", [0.25, 0.5, 0.75], 0.01)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-NMtW8s8F-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/gwas_cat_benchmark.ipynb b/notebooks/gwas_cat_benchmark.ipynb new file mode 100644 index 000000000..a2ecf5455 --- /dev/null +++ b/notebooks/gwas_cat_benchmark.ipynb @@ -0,0 +1,1498 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"aa16b16c-6126-4fc3-bc14-75eb4b44b50e\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"aa16b16c-6126-4fc3-bc14-75eb4b44b50e\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# import matplotlib.pyplot as plt\n", + "import pyspark.sql.functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.common.spark_helpers import order_array_of_structs_by_field\n", + "from gentropy.dataset.ld_index import LDIndex\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "from gentropy.dataset.study_locus import StudyLocus\n", + "from gentropy.method.susie_inf import SUSIE_inf\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 13:43:18 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "24/08/07 13:43:20 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.\n", + "24/08/07 13:43:20 WARN Utils: Service 'SparkUI' could not bind on port 4041. Attempting port 4042.\n" + ] + } + ], + "source": [ + "session = Session(\n", + " extended_spark_conf={\n", + " \"spark.driver.memory\": \"10g\",\n", + " \"spark.executor.memory\": \"10g\",\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Context\n", + "\n", + "Gwas catalog studies with summary statistics were filtered using QC white-list \n", + "Locus breaker clumping was performed on the resulting studies\n", + "\n", + "Parameters: \n", + " lbc_baseline_pvalue: 1e-5, \n", + " lbc_distance_cutoff: 250_000, \n", + " lbc_pvalue_threshold: 1e-8, \n", + " lbc_flanking_distance: 100_000, \n", + " large_loci_size: 1_500_000, \n", + " wbc_clump_distance: 500_000, \n", + " wbc_pvalue_threshold: 1e-8, \n", + " collect_locus: bool = True, \n", + " remove_mhc: bool = True,\n", + "\n", + "Loci with less than 100 variants, or more than 15,000, were filtered out and fine-mapped with PICS.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 13:45:02 WARN SharedInMemoryCache: Evicting cached table partition metadata from memory due to size constraints (spark.sql.hive.filesourcePartitionFileCacheSize = 262144000 bytes). This may impact query planning performance.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "study_index = StudyIndex.from_parquet(\n", + " session, \"/Users/dc16/data/study_index/gwas_catalog/\"\n", + ")\n", + "ld_index = LDIndex.from_parquet(session, \"/Users/dc16/data/ld_index\")\n", + "susie_loci = StudyLocus(\n", + " session.spark.read.parquet(\"/Users/dc16/output/gwas_catalog/clean_loci.parquet\"),\n", + " StudyLocus.get_schema(),\n", + ")\n", + "pics_loci = StudyLocus(\n", + " session.spark.read.parquet(\"/Users/dc16/output/gwas_catalog/filtered_loci.parquet\"),\n", + " StudyLocus.get_schema(),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Susie fine mapping\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the total number of unique studyIds\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 7:==============> (1542 + 8) / 5556]\r" + ] + } + ], + "source": [ + "susie_loci.df.select(\"studyId\").distinct().count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the total number of loci for finemapping:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "176096" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "susie_loci.df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = susie_loci.df.withColumns(\n", + " {\n", + " \"locusSize\": f.size(\"locus\"),\n", + " \"locusLength\": f.col(\"locusEnd\") - f.col(\"locusStart\"),\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanLocusLength | 682633.2350024986 \n", + " q1LocusLength | 327752 \n", + " medianLocusLength | 517819 \n", + " q3LocusLength | 934946 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 21:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-----------------------------\n", + " meanLocusSize | 3517.7594266763585 \n", + " minLocusSize | 100 \n", + " q1LocusSize | 1383 \n", + " medianLocusSize | 2565 \n", + " q3LocusSize | 4859 \n", + " maxLocusSize | 15000 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "length = df.select(\n", + " f.mean(\"locusLength\").alias(\"meanLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.25).alias(\"q1LocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.5).alias(\"medianLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.75).alias(\"q3LocusLength\"),\n", + ")\n", + "size = df.select(\n", + " f.mean(\"locusSize\").alias(\"meanLocusSize\"),\n", + " f.min(\"locusSize\").alias(\"minLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.25).alias(\"q1LocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.5).alias(\"medianLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.75).alias(\"q3LocusSize\"),\n", + " f.max(\"locusSize\").alias(\"maxLocusSize\"),\n", + ")\n", + "length.show(vertical=True)\n", + "size.show(vertical=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0HUlEQVR4nO3de3zP9f//8fsOdnDY5rTNMrOcz4S0HEqWYZ+ifCqHhCYdprBCSoikVKKITyWr74eKPqVCWI7JcliWQ8hhkhgKG3KY7fn7o99evG3EbK/39t7term8L3m/Xo/36/14vrx77+m+18HNGGMEAAAAAAAA2Mjd2Q0AAAAAAACg+CGUAgAAAAAAgO0IpQAAAAAAAGA7QikAAAAAAADYjlAKAAAAAAAAtiOUAgAAAAAAgO0IpQAAAAAAAGA7QikAAAAAAADYjlAKAAAAAAAAtiOUAoqgqlWrqk+fPs5uw+W99tpruvHGG+Xh4aHGjRs7ux1chRUrVsjNzU2fffaZs1sBABRxzLfswXzrn8XHx8vNzU179+51ditAviOUApws+4fMhg0bcl1/++23q379+tf9PgsXLtTo0aOvezvFxZIlSzR06FC1bNlSM2fO1Msvv3zZ2j59+qh06dI2dlfwqlatqn/961/ObuOyZs+erUmTJjm7DQBAEcF8q3Aq7vOtc+fOafLkyWrSpIn8/PwUEBCgevXqqX///tq+fbuz2wNs4ensBgBcux07dsjd/doy5YULF2rq1KlMlK7SsmXL5O7urhkzZsjLy8vZ7eASs2fP1pYtWzRo0CBntwIAcFHMtwpecZ9vde3aVd988426d++uRx55RBkZGdq+fbvmz5+vW2+9VbVr15Yk9erVS926dZO3t7eTOwbyH6EUUAQVxR9Ip06dUqlSpZzdxlU7fPiwfH19i+UECQAAMN+yQ3Geb61fv17z58/XuHHj9NxzzzmsmzJlio4fP2499/DwkIeHh80dAvbg9D2gCLr0GgcZGRl68cUXVaNGDfn4+Kh8+fJq1aqVEhISJP19uPPUqVMlSW5ubtYj26lTp/T0008rNDRU3t7eqlWrll5//XUZYxze9/Tp03rqqadUoUIFlSlTRnfffbd+//13ubm5OfxGcPTo0XJzc9PPP/+sHj16qGzZsmrVqpUkadOmTerTp49uvPFG+fj4KDg4WA8//LD+/PNPh/fK3sYvv/yiBx98UP7+/qpYsaJeeOEFGWP022+/qXPnzvLz81NwcLDeeOONq9p358+f19ixY1WtWjV5e3uratWqeu6553T27Fmrxs3NTTNnztSpU6esfRUfH39V27+SuXPnqmnTpvL19VWFChX04IMP6vfff89Rt337dt1///2qWLGifH19VatWLT3//PPW+j59+qhq1ao5Xpe9zy6WkJCgVq1aKSAgQKVLl1atWrVyTHyux3//+19rTOXKlVO3bt3022+/OdRknxLx888/q23btipZsqRuuOEGTZgwIcf2fv31V919990qVaqUAgMDNXjwYC1evFhubm5asWKFtb0FCxbo119/tf5+Lt0fWVlZGjdunCpXriwfHx+1a9dOu3btyrdxAwBcH/Mt5lsFOd/avXu3JKlly5Y51nl4eKh8+fLW80uvKZXdQ26Piz+zWVlZmjRpkurVqycfHx8FBQXp0Ucf1bFjx67YG2AnjpQCCom0tDT98ccfOZZnZGT842tHjx6t8ePHq1+/frr55puVnp6uDRs26Mcff9Sdd96pRx99VAcOHFBCQoL+7//+z+G1xhjdfffdWr58uWJiYtS4cWMtXrxYQ4YM0e+//64333zTqu3Tp4/mzJmjXr166ZZbbtHKlSsVHR192b7uu+8+1ahRQy+//LI14UpISNCePXvUt29fBQcHa+vWrXr33Xe1detW/fDDDzl+yD/wwAOqU6eOXnnlFS1YsEAvvfSSypUrp//85z+644479Oqrr2rWrFl65pln1Lx5c7Vp0+aK+6pfv3768MMP9e9//1tPP/201q5dq/Hjx2vbtm364osvJEn/93//p3fffVfr1q3T+++/L0m69dZb//Hv4Uri4+PVt29fNW/eXOPHj9ehQ4c0efJkff/999q4caMCAgIk/T2JbN26tUqUKKH+/furatWq2r17t77++muNGzfumt5z69at+te//qWGDRtqzJgx8vb21q5du/T9999f11iyjRs3Ti+88ILuv/9+9evXT0eOHNHbb7+tNm3aOIxJko4dO6YOHTro3nvv1f3336/PPvtMw4YNU4MGDdSxY0dJf0/W77jjDh08eFADBw5UcHCwZs+ereXLlzu87/PPP6+0tDTt37/f+nxeeo2JV155Re7u7nrmmWeUlpamCRMmqGfPnlq7dm2+jB0AUDQx32K+JRWO+VZYWJgkadasWWrZsqU8Pa/+n+b33nuvqlev7rAsKSlJkyZNUmBgoLXs0UcftfbJU089pZSUFE2ZMkUbN27U999/rxIlSlzDSIECYgA41cyZM42kKz7q1avn8JqwsDDTu3dv63mjRo1MdHT0Fd8nNjbW5Pa//Lx584wk89JLLzks//e//23c3NzMrl27jDHGJCUlGUlm0KBBDnV9+vQxksyoUaOsZaNGjTKSTPfu3XO8319//ZVj2ccff2wkmVWrVuXYRv/+/a1l58+fN5UrVzZubm7mlVdesZYfO3bM+Pr6OuyT3CQnJxtJpl+/fg7Ln3nmGSPJLFu2zFrWu3dvU6pUqStu72prz507ZwIDA039+vXN6dOnreXz5883kszIkSOtZW3atDFlypQxv/76q8M2srKyHN4vLCwsx/tk77Nsb775ppFkjhw5clXjuFhYWNgVP1N79+41Hh4eZty4cQ7LN2/ebDw9PR2W33bbbUaS+eijj6xlZ8+eNcHBwaZr167WsjfeeMNIMvPmzbOWnT592tSuXdtIMsuXL7eWR0dH57oPli9fbiSZOnXqmLNnz1rLJ0+ebCSZzZs3X9X4AQCuhfkW863CNt/Kysqy5khBQUGme/fuZurUqTl6MubC5zclJSXXbR05csRUqVLFNGjQwJw8edIYY8x3331nJJlZs2Y51C5atCjX5YCzcPoeUEhMnTpVCQkJOR4NGzb8x9cGBARo69at2rlz5zW/78KFC+Xh4aGnnnrKYfnTTz8tY4y++eYbSdKiRYskSU888YRD3ZNPPnnZbT/22GM5lvn6+lp/PnPmjP744w/dcsstkqQff/wxR32/fv2sP3t4eKhZs2YyxigmJsZaHhAQoFq1amnPnj2X7UX6e6ySFBcX57D86aefliQtWLDgiq/Pqw0bNujw4cN64okn5OPjYy2Pjo5W7dq1rfc9cuSIVq1apYcfflhVqlRx2Malv9G8Gtm/Dfzyyy+VlZWV9wHk4vPPP1dWVpbuv/9+/fHHH9YjODhYNWrUyHF0U+nSpfXggw9az728vHTzzTc7/J0tWrRIN9xwg+6++25rmY+Pjx555JFr7q9v374O16do3bq1JP3jZwQA4NqYbzHfKizzLTc3Ny1evFgvvfSSypYtq48//lixsbEKCwvTAw884HBNqSvJzMxU9+7ddeLECX3xxRfWNcXmzp0rf39/3XnnnQ5ztaZNm6p06dI55mqAsxBKAYXEzTffrMjIyByPsmXL/uNrx4wZo+PHj6tmzZpq0KCBhgwZok2bNl3V+/76668KCQlRmTJlHJbXqVPHWp/9X3d3d4WHhzvUXXro8MUurZWko0ePauDAgQoKCpKvr68qVqxo1aWlpeWov3Sy4O/vLx8fH1WoUCHH8n86Pz57DJf2HBwcrICAAGus+S17u7Vq1cqxrnbt2tb67EleftySWvr7UPyWLVuqX79+CgoKUrdu3TRnzpx8Cah27twpY4xq1KihihUrOjy2bdumw4cPO9RXrlw5x0SvbNmyDn9nv/76q6pVq5aj7kqfscu59HOT/f8R11AAgOKN+RbzrcI03/L29tbzzz+vbdu26cCBA/r44491yy23aM6cORowYMBVvf+IESO0bNkyzZ49W9WqVbOW79y5U2lpaQoMDMwxVzt58mSOuRrgLFxTCnABbdq00e7du/Xll19qyZIlev/99/Xmm29q+vTpDr/5stvFv6XLdv/992vNmjUaMmSIGjdurNKlSysrK0sdOnTI9Yd3bncaudzdR8wlFwq9nLz8FqwwuVz/mZmZDs99fX21atUqLV++XAsWLNCiRYv06aef6o477tCSJUuu6y4uWVlZcnNz0zfffJPrdi69xtP1/p1dK7vfDwDg+phv/Y35VsHMtypVqqRu3bqpa9euqlevnubMmaP4+PgrXmtq3rx5evXVVzV27Fh16NDBYV1WVpYCAwM1a9asXF9bsWLFq+oLKGgcKQW4iHLlyqlv3776+OOP9dtvv6lhw4YOd2i53A/WsLAwHThwQCdOnHBYvn37dmt99n+zsrKUkpLiUHctdzQ7duyYli5dqmeffVYvvvii7rnnHt1555268cYbr3ob1yN7DJcedn/o0CEdP37cGmtBvK8k7dixI8e6HTt2WOuz98OWLVuuuL2yZcvmekh3br95dHd3V7t27TRx4kT9/PPPGjdunJYtW3bdh2xXq1ZNxhiFh4fn+hvn7FMErkVYWJh2796dY7Kb22esqE90AQBFE/Otf8Z86/rmWyVKlFDDhg2VkZGR60X5s/3yyy/q3bu3unTpkuud/qpVq6Y///xTLVu2zHWu1qhRo2vuDSgIhFKAC7j09r6lS5dW9erVHW67m31++aU/XDt16qTMzExNmTLFYfmbb74p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NpYsWaKff/5Z3377rYKCgtS4cWONHTtWw4YN0+jRo+Xl5aXp06crPDxcb7zxhiSpTp06Wr16td58801FRUVJkiZOnKhHHnlEffv2lSRNnz5dCxYs0AcffKBnn322IIYPAAAAAABQbBWqa0qlpaVJksqVK+ewfNasWapQoYLq16+v4cOH66+//rLWJSYmqkGDBgoKCrKWRUVFKT09XVu3brVqIiMjHbYZFRWlxMRESdK5c+eUlJTkUOPu7q7IyEir5lJnz55Venq6wwMAAAAAAABXx6lHSl0sKytLgwYNUsuWLVW/fn1reY8ePRQWFqaQkBBt2rRJw4YN044dO/T5559LklJTUx0CKUnW89TU1CvWpKen6/Tp0zp27JgyMzNzrdm+fXuu/Y4fP14vvvji9Q0aAAAAAACgmCo0oVRsbKy2bNmi1atXOyzv37+/9ecGDRqoUqVKateunXbv3q1q1arZ3aZl+PDhiouLs56np6crNDTUaf0AAAAAAAAUJYUilBowYIDmz5+vVatWqXLlylesbdGihSRp165dqlatmoKDg3PcJe/QoUOSZF2HKjg42Fp2cY2fn598fX3l4eEhDw+PXGsudy0rb29veXt7X/0gAQAAAAAAYHHqNaWMMRowYIC++OILLVu2TOHh4f/4muTkZElSpUqVJEkRERHavHmzw13yEhIS5Ofnp7p161o1S5cuddhOQkKCIiIiJEleXl5q2rSpQ01WVpaWLl1q1QAAAAAAACD/OPVIqdjYWM2ePVtffvmlypQpY10Dyt/fX76+vtq9e7dmz56tTp06qXz58tq0aZMGDx6sNm3aqGHDhpKk9u3bq27duurVq5cmTJig1NRUjRgxQrGxsdaRTI899pimTJmioUOH6uGHH9ayZcs0Z84cLViwwOolLi5OvXv3VrNmzXTzzTdr0qRJOnXqlHU3PgAAAAAAAOQfp4ZS06ZNkyTdfvvtDstnzpypPn36yMvLS99++60VEIWGhqpr164aMWKEVevh4aH58+fr8ccfV0REhEqVKqXevXtrzJgxVk14eLgWLFigwYMHa/LkyapcubLef/99RUVFWTUPPPCAjhw5opEjRyo1NVWNGzfWokWLclz8HAAAAAAAANfPqaGUMeaK60NDQ7Vy5cp/3E5YWJgWLlx4xZrbb79dGzduvGLNgAEDNGDAgH98PwAAAAAA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GBioIUOG6Pz58w41K1as0E033SRvb29Vr15d8fHxdgwPAAAAAACg2CrUoZQk1atXTwcPHrQeq1evttYNHjxYX3/9tebOnauVK1fqwIEDuvfee631mZmZio6O1rlz57RmzRp9+OGHio+P18iRI62alJQURUdHq23btkpOTtagQYPUr18/LV682NZxAgAAAAAAFCeezm7gn3h6eio4ODjH8rS0NM2YMUOzZ8/WHXfcIUmaOXOm6tSpox9++EG33HKLlixZop9//lnffvutgoKC1LhxY40dO1bDhg3T6NGj5eXlpenTpys8PFxvvPGGJKlOnTpavXq13nzzTUVFRdk6VsCZYuLX5/m1M/o0z8dOAAAAAADFQaE/Umrnzp0KCQnRjTfeqJ49e2rfvn2SpKSkJGVkZCgyMtKqrV27tqpUqaLExERJUmJioho0aKCgoCCrJioqSunp6dq6datVc/E2smuyt3E5Z8+eVXp6usMDAAAAAAAAV6dQh1ItWrRQfHy8Fi1apGnTpiklJUWtW7fWiRMnlJqaKi8vLwUEBDi8JigoSKmpqZKk1NRUh0Aqe332uivVpKen6/Tp05ftbfz48fL397ceoaGh1ztcAAAAAACAYqNQn77XsWNH688NGzZUixYtFBYWpjlz5sjX19eJnUnDhw9XXFyc9Tw9PZ1gCgAAAAAA4CoV6lDqUgEBAapZs6Z27dqlO++8U+fOndPx48cdjpY6dOiQdQ2q4OBgrVu3zmEb2Xfnu7jm0jv2HTp0SH5+flcMvry9veXt7Z0fwwKKPK5HBQAAAAC4VoX69L1LnTx5Urt371alSpXUtGlTlShRQkuXLrXW79ixQ/v27VNERIQkKSIiQps3b9bhw4etmoSEBPn5+alu3bpWzcXbyK7J3gYAAAAAAADyX6EOpZ555hmtXLlSe/fu1Zo1a3TPPffIw8ND3bt3l7+/v2JiYhQXF6fly5crKSlJffv2VUREhG655RZJUvv27VW3bl316tVLP/30kxYvXqwRI0YoNjbWOsrpscce0549ezR06FBt375d77zzjubMmaPBgwc7c+gAAAAAAAAurVCfvrd//351795df/75pypWrKhWrVrphx9+UMWKFSVJb775ptzd3dW1a1edPXtWUVFReuedd6zXe3h4aP78+Xr88ccVERGhUqVKqXfv3hozZoxVEx4ergULFmjw4MGaPHmyKleurPfff19RUVG2jxcAAAAAAKC4KNSh1CeffHLF9T4+Ppo6daqmTp162ZqwsDAtXLjwitu5/fbbtXHjxjz1CAAAAAAAgGtXqE/fAwAAAAAAgGsilAIAAAAAAIDtCKUAAAAAAABgO0IpAAAAAAAA2I5QCgAAAAAAALYr1HffA+D6YuLXX9frZ/Rpnk+dAAAAAADsxJFSAAAAAAAAsB2hFAAAAAAAAGxHKAUAAAAAAADbEUoBAAAAAADAdoRSAAAAAAAAsB2hFAAAAAAAAGxHKAUAAAAAAADbeTq7AQC4HjHx6/P82hl9mudjJwAAAACAa8GRUgAAAAAAALAdoRQAAAAAAABsRygFAAAAAAAA2xFKAQAAAAAAwHaEUgAAAAAAALAdoRQAAAAAAABs5+nsBgAAAAAARUdM/Po8v3ZGn+b52AmAoo5QCkCxxYQKAAAAAJyH0/cAAAAAAABgO0IpAAAAAAAA2I5QCgAAAAAAALYjlAIAAAAAAIDtCKUAAAAAAABgO0IpAAAAAAAA2M7T2Q0AAAAAAFCQYuLXX9frZ/Rpnk+dALgYoRQA5AETGwAAAAC4Ppy+BwAAAAAAANtxpBQAAAAAwBbXc7Q5R5oDrocjpQAAAAAAAGA7QikAAAAAAADYjtP3AMAJOHQdAAAAQHHHkVIAAAAAAACwHaEUAAAAAAAAbMfpewAAAACAQu96Ln8AoHDiSCkAAAAAAADYjiOlAKCI4SLpAAAAAFwBR0oBAAAAAADAdoRSAAAAAAAAsB2n7wEAAAAAcAVcPgEoGBwpBQAAAAAAANsRSgEAAAAAAMB2nL4HAMUIh54DAAAAKCwIpQAAV+V6Ai2JUAsAAACAI07fAwAAAAAAgO0IpQAAAAAAAGA7Tt8DANiC61kBAAAAuBhHSgEAAAAAAMB2HCkFAAAAAEAB4Whx4PI4UgoAAAAAAAC240gpAAAAAAAKoes5ykriSCsUfhwpBQAAAAAAANsRSgEAAAAAAMB2nL4HACj0uEAoAAAA4Ho4UgoAAAAAAAC240gpAIBL4wKhAACguOJocxR2HCkFAAAAAAAA2xFKAQAAAAAAwHacvgcAwBVw2DsAAABQMAilAAAoIARaAACgqGIeAzsQSgEAUAgxEQQAAEUV8xhcLUIpAAAAAABQKHDn5OKFUAoAADjgt5sAAACwA6EUAAAu5np/wwgAAADYgVAKAAAAAAAUexwtbj9CKQAAAAAA4BKK6hHjxTUQI5QCAAD5pqhOBAEAAK4Hc6C8IZQCAAAAAAAoooryUVbuTn13AAAAAAAAFEuEUgAAAAAAALAdoRQAAAAAAABsRygFAAAAAAAA2xFKXWLq1KmqWrWqfHx81KJFC61bt87ZLQEAABRqzJ8AAEBeEEpd5NNPP1VcXJxGjRqlH3/8UY0aNVJUVJQOHz7s7NYAAAAKJeZPAAAgrwilLjJx4kQ98sgj6tu3r+rWravp06erZMmS+uCDD5zdGgAAQKHE/AkAAOQVodT/d+7cOSUlJSkyMtJa5u7ursjISCUmJjqxMwAAgMKJ+RMAALgens5uoLD4448/lJmZqaCgIIflQUFB2r59e476s2fP6uzZs9bztLQ0SVJ6enqB9Hfu9MkC2S4AAK6ioH4GZ2/XGFMg2y/KrnX+JDGHAgCgMHH2/IlQKo/Gjx+vF198Mcfy0NBQJ3QDAAD++0TBbv/EiRPy9/cv2DcpBphDAQBQeDh7/kQo9f9VqFBBHh4eOnTokMPyQ4cOKTg4OEf98OHDFRcXZz3PysrS0aNHVb58ebm5ueVrb+np6QoNDdVvv/0mPz+/fN12Uce+yR375fLYN7ljv1we+yZ3xWm/GGN04sQJhYSEOLuVQuda509Swc+hitNnM1txHLNUPMddHMcsFc9xF8cxS8Vz3K465qudPxFK/X9eXl5q2rSpli5dqi5dukj6e5K0dOlSDRgwIEe9t7e3vL29HZYFBAQUaI9+fn4u9SHNT+yb3LFfLo99kzv2y+Wxb3JXXPYLR0jl7lrnT5J9c6ji8tm8WHEcs1Q8x10cxywVz3EXxzFLxXPcrjjmq5k/EUpdJC4uTr1791azZs108803a9KkSTp16pT69u3r7NYAAAAKJeZPAAAgrwilLvLAAw/oyJEjGjlypFJTU9W4cWMtWrQox8U7AQAA8DfmTwAAIK8IpS4xYMCAyx5u7ize3t4aNWpUjkPdwb65HPbL5bFvcsd+uTz2Te7YL7hYYZo/FcfPZnEcs1Q8x10cxywVz3EXxzFLxXPcxXHMF3Mz3N8YAAAAAAAANnN3dgMAAAAAAAAofgilAAAAAAAAYDtCKQAAAAAAANiOUKqQmDp1qqpWrSofHx+1aNFC69atu2zte++9p9atW6ts2bIqW7asIiMjr1hf1F3LvrnYJ598Ijc3N3Xp0qVgG3SSa90vx48fV2xsrCpVqiRvb2/VrFlTCxcutKlbe13rvpk0aZJq1aolX19fhYaGavDgwTpz5oxN3dpj1apVuuuuuxQSEiI3NzfNmzfvH1+zYsUK3XTTTfL29lb16tUVHx9f4H3a7Vr3y+eff64777xTFStWlJ+fnyIiIrR48WJ7mrVZXj4z2b7//nt5enqqcePGBdYfkJu8zhkKg/Hjx6t58+YqU6aMAgMD1aVLF+3YscOh5syZM4qNjVX58uVVunRpde3aVYcOHXKo2bdvn6Kjo1WyZEkFBgZqyJAhOn/+vENNYf1+f+WVV+Tm5qZBgwZZy1x1zL///rsefPBBlS9fXr6+vmrQoIE2bNhgrTfGaOTIkapUqZJ8fX0VGRmpnTt3Omzj6NGj6tmzp/z8/BQQEKCYmBidPHnSoWbTpk1q3bq1fHx8FBoaqgkTJtgyvktlZmbqhRdeUHh4uHx9fVWtWjWNHTtWF1/e2BXG/E8/O+0c49y5c1W7dm35+PioQYMGBTbvv9KYMzIyNGzYMDVo0EClSpVSSEiIHnroIR04cKBIj1m6tnnSY489Jjc3N02aNMlheVEcd4EwcLpPPvnEeHl5mQ8++MBs3brVPPLIIyYgIMAcOnQo1/oePXqYqVOnmo0bN5pt27aZPn36GH9/f7N//36bOy9417pvsqWkpJgbbrjBtG7d2nTu3NmeZm10rfvl7NmzplmzZqZTp05m9erVJiUlxaxYscIkJyfb3HnBu9Z9M2vWLOPt7W1mzZplUlJSzOLFi02lSpXM4MGDbe68YC1cuNA8//zz5vPPPzeSzBdffHHF+j179piSJUuauLg48/PPP5u3337beHh4mEWLFtnTsE2udb8MHDjQvPrqq2bdunXml19+McOHDzclSpQwP/74oz0N2+ha9022Y8eOmRtvvNG0b9/eNGrUqEB7BC6W1zlDYREVFWVmzpxptmzZYpKTk02nTp1MlSpVzMmTJ62axx57zISGhpqlS5eaDRs2mFtuucXceuut1vrz58+b+vXrm8jISLNx40azcOFCU6FCBTN8+HCrprB+v69bt85UrVrVNGzY0AwcONBa7opjPnr0qAkLCzN9+vQxa9euNXv27DGLFy82u3btsmpeeeUV4+/vb+bNm2d++uknc/fdd5vw8HBz+vRpq6ZDhw6mUaNG5ocffjDfffedqV69uunevbu1Pi0tzQQFBZmePXuaLVu2mI8//tj4+vqa//znP7aO1xhjxo0bZ8qXL2/mz59vUlJSzNy5c03p0qXN5MmTrRpXGPM//ey0a4zff/+98fDwMBMmTDA///yzGTFihClRooTZvHmzrWM+fvy4iYyMNJ9++qnZvn27SUxMNDfffLNp2rSpwzaK2pj/adwX+/zzz02jRo1MSEiIefPNNx3WFcVxFwRCqULg5ptvNrGxsdbzzMxMExISYsaPH39Vrz9//rwpU6aM+fDDDwuqRafJy745f/68ufXWW837779vevfu7ZKh1LXul2nTppkbb7zRnDt3zq4WneZa901sbKy54447HJbFxcWZli1bFmifznQ1AcPQoUNNvXr1HJY98MADJioqqgA7c65rCV4uVrduXfPiiy/mf0OFyLXsmwceeMCMGDHCjBo1ilAKtrre+VRhc/jwYSPJrFy50hjz9z/uSpQoYebOnWvVbNu2zUgyiYmJxpi//5Hk7u5uUlNTrZpp06YZPz8/c/bsWWNM4fx+P3HihKlRo4ZJSEgwt912mxVKueqYhw0bZlq1anXZ9VlZWSY4ONi89tpr1rLjx48bb29v8/HHHxtjjPn555+NJLN+/Xqr5ptvvjFubm7m999/N8YY884775iyZcta+yH7vWvVqpXfQ/pH0dHR5uGHH3ZYdu+995qePXsaY1xzzJf+7LRzjPfff7+Jjo526KdFixbm0UcfzdcxXupq5gvr1q0zksyvv/5qjCn6Yzbm8uPev3+/ueGGG8yWLVtMWFiYQyjlCuPOL5y+52Tnzp1TUlKSIiMjrWXu7u6KjIxUYmLiVW3jr7/+UkZGhsqVK1dQbTpFXvfNmDFjFBgYqJiYGDvatF1e9stXX32liIgIxcbGKigoSPXr19fLL7+szMxMu9q2RV72za233qqkpCTrFI89e/Zo4cKF6tSpky09F1aJiYkO+1GSoqKirvp7qbjIysrSiRMnXO77N69mzpypPXv2aNSoUc5uBcVMfsynCpu0tDRJsr5fkpKSlJGR4TDG2rVrq0qVKtYYExMT1aBBAwUFBVk1UVFRSk9P19atW62awvb9Hhsbq+jo6Bx9ueqYv/rqKzVr1kz33XefAgMD1aRJE7333nvW+pSUFKWmpjr07O/vrxYtWjiMOyAgQM2aNbNqIiMj5e7urrVr11o1bdq0kZeXl1UTFRWlHTt26NixYwU9TAe33nqrli5dql9++UWS9NNPP2n16tXq2LGjJNcc86XsHGNh+8xfLC0tTW5ubgoICJDkumPOyspSr169NGTIENWrVy/Helcdd154OruB4u6PP/5QZmamww9SSQoKCtL27duvahvDhg1TSEhIjg9jUZeXfbN69WrNmDFDycnJNnToHHnZL3v27NGyZcvUs2dPLVy4ULt27dITTzyhjIwMl/rHY172TY8ePfTHH3+oVatWMsbo/Pnzeuyxx/Tcc8/Z0XKhlZqamut+TE9P1+nTp+Xr6+ukzgqX119/XSdPntT999/v7FacbufOnXr22Wf13XffydOT6QXslR/zqcIkKytLgwYNUsuWLVW/fn1Jf38ve3l5Wf+QyxYUFKTU1FSrJrd9kL3uSjXO+n7/5JNP9OOPP2r9+vU51rnqmPfs2aNp06YpLi5Ozz33nNavX6+nnnpKXl5e6t27t9V3bj1fPKbAwECH9Z6enipXrpxDTXh4eI5tZK8rW7ZsgYwvN88++6zS09NVu3ZteXh4KDMzU+PGjVPPnj2tfi7u7+J+i+qYL2XnGC/3mc/ehrOcOXNGw4YNU/fu3eXn5yfJdcf86quvytPTU0899VSu61113HnBrLGIe+WVV/TJJ59oxYoV8vHxcXY7TnXixAn16tVL7733nipUqODsdgqVrKwsBQYG6t1335WHh4eaNm2q33//Xa+99ppLhVJ5sWLFCr388st655131KJFC+3atUsDBw7U2LFj9cILLzi7PRRis2fP1osvvqgvv/wyx6SiuMnMzFSPHj304osvqmbNms5uByjyYmNjtWXLFq1evdrZrRSo3377TQMHDlRCQkKxmsdmZWWpWbNmevnllyVJTZo00ZYtWzR9+nT17t3byd0VjDlz5mjWrFmaPXu26tWrp+TkZA0aNEghISEuO2Y4ysjI0P333y9jjKZNm+bsdgpUUlKSJk+erB9//FFubm7ObqfQ4/Q9J6tQoYI8PDxy3EXk0KFDCg4OvuJrX3/9db3yyitasmSJGjZsWJBtOsW17pvdu3dr7969uuuuu+Tp6SlPT0999NFH+uqrr+Tp6andu3fb1XqBystnplKlSqpZs6Y8PDysZXXq1FFqaqrOnTtXoP3aKS/75oUXXlCvXr3Ur18/NWjQQPfcc49efvlljR8/XllZWXa0XSgFBwfnuh/9/Pw4Skp//2a/X79+mjNnjssdpZoXJ06c0IYNGzRgwADr+3fMmDH66aef5OnpqWXLljm7Rbi465lPFTYDBgzQ/PnztXz5clWuXNlaHhwcrHPnzun48eMO9ReP8XLf3dnrrlTjjO/3pKQkHT58WDfddJP13bFy5Uq99dZb8vT0VFBQkMuNWfp7Xla3bl2HZXXq1NG+ffskXej7Sp/n4OBgHT582GH9+fPndfTo0WvaN3YZMmSInn32WXXr1k0NGjRQr169NHjwYI0fP96hH1ca86XsHOPlapy1D7IDqV9//VUJCQnWUVKSa475u+++0+HDh1WlShXru+3XX3/V008/rapVq1r9utq484pQysm8vLzUtGlTLV261FqWlZWlpUuXKiIi4rKvmzBhgsaOHatFixY5nIfqSq5139SuXVubN29WcnKy9bj77rvVtm1bJScnKzQ01M72C0xePjMtW7bUrl27HEKWX375RZUqVXI4R7moy8u++euvv+Tu7vhVmB3emYtuU1zcREREOOxHSUpISLji91Jx8fHHH6tv3776+OOPFR0d7ex2CgU/P78c37+PPfaYatWqpeTkZLVo0cLZLcLF5XU+VZgYYzRgwAB98cUXWrZsWY5TNpo2baoSJUo4jHHHjh3at2+fNcaIiAht3rzZ4R862f8AzA5BCtP3e7t27XJ8dzRr1kw9e/a0/uxqY5b+npft2LHDYdkvv/yisLAwSVJ4eLiCg4Mdek5PT9fatWsdxn38+HElJSVZNcuWLVNWVpb1nRsREaFVq1YpIyPDqklISFCtWrVsP43tcvOt7LmpK475UnaOsTB95rMDqZ07d+rbb79V+fLlHda74ph79eqlTZs2OXy3hYSEaMiQIVq8eLHVr6uNO8+ce511GPP3LYy9vb1NfHy8+fnnn03//v1NQECAdReRXr16mWeffdaqf+WVV4yXl5f57LPPzMGDB63HiRMnnDWEAnOt++ZSrnr3vWvdL/v27TNlypQxAwYMMDt27DDz5883gYGB5qWXXnLWEArMte6bUaNGmTJlypiPP/7Y7NmzxyxZssRUq1bN3H///c4aQoE4ceKE2bhxo9m4caORZCZOnGg2btxo3fnk2WefNb169bLqs2+fPWTIELNt2zYzderUQnHL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c62KFSvK3d1dn332mTIzM69q+5MnT9bBgwetx8CBAxUYGKjatWtL+udfTgBwIgMATta7d2/TuXPnXNc999xzplatWiYrK8taNnXqVFO6dGmTmZlp0tPTjbe3t3nvvfdyff3y5cuNJHPs2DFr2caNG40kk5KSYowxpkGDBmb06NFX3e9tt91mBg4cmOu6mJgY079/f4dl3333nXF3dzenT582xhgTFhZmHnzwQWt9VlaWCQwMNNOmTTPGGDNt2jRTvnx5q94YY9577z0jyWzcuPGy48rurVWrVg7LmjdvboYNG3bV4wOKMknmiy++sJ7Pnz/fSDKlSpVyeHh6epr777/fGGPMI488YiSZHTt2WK9LSkoyksz27dvtHgIA5LuiNteaMmWKKVmypClTpoxp27atGTNmjNm9e7e1PiUlxWFedLH//e9/xsfHx6xevdoYY8yvv/5qPDw8zO+//+5Q165dOzN8+PCr7glAweCaUgAKtW3btikiIkJubm7WspYtW+rkyZPav3+/UlNTdfbsWbVr1y7P7/HUU0/p8ccf15IlSxQZGamuXbuqYcOGedrWTz/9pE2bNmnWrFnWMmOMsrKylJKSojp16kiSw/bd3NwUHBysw4cPS/r76KeGDRvKx8fHqrmWCy5f2nulSpWsbQPFzcmTJ+Xh4aGkpCR5eHg4rMv+LX2lSpXk6empmjVrWuuy/1/dt2+fdZ0pAHBFhXGuFRsbq4ceekgrVqzQDz/8oLlz5+rll1/WV199pTvvvPOyr9u4caN69eqlKVOmqGXLlpKkzZs3KzMz0+E7Xvr7lL7y5cvneUwA8gen7wEo0nx9fa+43t397685Y4y1LCMjw6GmX79+2rNnj3r16qXNmzerWbNmevvtt/PUz8mTJ/Xoo48qOTnZevz000/auXOnqlWrZtWVKFHC4XVubm7KysrK03teqiC3DRQ1TZo0UWZmpg4fPqzq1as7PLIvktuyZUudP39eu3fvtl73yy+/SJLCwsKc0jcAFBbOmmuVKVNGd911l8aNG6effvpJrVu3djil8FKpqam6++671a9fP8XExFjLL/7lxMXzs23btjlc/gCAcxBKASjU6tSpo8TERIeJzvfff68yZcqocuXKqlGjhnx9fbV06dJcX1+xYkVJ0sGDB61l2RfFvFhoaKgee+wxff7553r66af13nvv5anfm266ST///HOOf/xWr15dXl5eV7WNWrVqafPmzTp79qy1bP369Q412du62mstAK7s5MmT1j8ypL9vJZ6cnKx9+/apZs2a6tmzpx566CF9/vnnSklJ0bp16zR+/HgtWLBAkhQZGambbrpJDz/8sDZu3KikpCQ9+uijuvPOO3P8Zh0AXE1RmGu5ubmpdu3aDjeOudiZM2fUuXNn1a5dWxMnTnRYdzW/nADgPIRSAAqFtLQ0h99eJScn67ffftMTTzyh3377TU8++aS2b9+uL7/8UqNGjVJcXJzc3d3l4+OjYcOGaejQofroo4+0e/du/fDDD5oxY4YkqXr16goNDdXo0aO1c+dOLViwQG+88YbDew8aNEiLFy9WSkqKfvzxRy1fvtw6dedyjhw5kqPfQ4cOadiwYVqzZo0GDBig5ORk7dy5U19++WWOC51fSY8ePZSVlaX+/ftr27ZtWrx4sV5//XVJsg6tDwsLk5ubm+bPn68jR47o5MmT17K7AZeyYcMGNWnSRE2aNJEkxcXFqUmTJho5cqQkaebMmXrooYf09NNPq1atWurSpYvWr1+vKlWqSPr7t/xff/21KlSooDZt2ig6Olp16tTRJ5984rQxAUB+KypzreTkZHXu3FmfffaZfv75Z+3atUszZszQBx98oM6dO+f6mkcffVS//fab3nrrLR05ckSpqalKTU3VuXPnruqXEwCcyKlXtAIA8/fFNyXleMTExBhjjFmxYoVp3ry58fLyMsHBwWbYsGEmIyPDen1mZqZ56aWXTFhYmClRooSpUqWKefnll631q1evNg0aNDA+Pj6mdevWZu7cuQ4X3xwwYICpVq2a8fb2NhUrVjS9evUyf/zxx2X7ve2223Ltd+zYscYYY9atW2fuvPNOU7p0aVOqVCnTsGFDM27cOOv1YWFh5s0333TYZqNGjcyoUaOs599//71p2LCh8fLyMk2bNjWzZ8/OcdHlMWPGmODgYOPm5mZ69+5t9XbpRdg7d+5srQcAAMVPUZprHTlyxDz11FOmfv36pnTp0qZMmTKmQYMG5vXXXzeZmZnGmJwXOg8LC8t1fMuXLzfGGHPu3DkzcuRIU7VqVVOiRAlTqVIlc88995hNmzbl854GcK3cjLnoOE0AQKE0a9Ys9e3bV2lpaf94bQcAAAAAKAq4+x4AFEIfffSRbrzxRt1www366aefNGzYMN1///0EUgAAAABcBqEUABRCqampGjlypFJTU1WpUiXdd999GjdunLPbAgAAAIB8w+l7AAAAAAAAsB133wMAAAAAAIDtCKUAAAAAAABgO0IpAAAAAAAA2I5QCgAAAAAAALYjlAIAAAAAAIDtCKUAAAAAAABgO0IpAAAAAAAA2I5QCgAAAAAAALYjlAIAAAAAAIDt/h+6l1M7S3yh3QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "panda_df = df.select(\"locusSize\", \"locusLength\").toPandas()\n", + "\n", + "# plt.figure(figsize=(12, 6))\n", + "\n", + "# # Histogram for locusLength\n", + "# plt.subplot(1, 2, 1) # 1 row, 2 columns, 1st subplot\n", + "# plt.hist(panda_df[\"locusLength\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Length\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Length\")\n", + "\n", + "# # Histogram for locusSize\n", + "# plt.subplot(1, 2, 2) # 1 row, 2 columns, 2nd subplot\n", + "# plt.hist(panda_df[\"locusSize\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Size\")\n", + "\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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k07in//5n/nYxz7GmjVrWLdu3VHv51SeeuopLr74YgqFAn/1V3+FaZr80z/9E5deeik///nPeelLXwpAtVrl4osv5umnn+bGG2/knHPOYXR0lB/84AccPHiwtY+LwfM8rrzySlzX5X3vex9Lly5lYGCAO+64g2KxSFtb25zf6+3tJZ1O88Mf/pD3ve99dHZ2Lnqdp5xyCrfddtu014rFIh/84AenOVy33XYb1113HVdeeSWf/OQnqdfrfPGLX+TlL385jz766Cwnq8l5553H2rVr+bd/+7eWc9vk9ttvp6OjgyuvvBKAd7/73fz7v/87733vezn11FMZGxvjvvvu4+mnn+acc85Z9D7NxQvp91wsR3sfeMtb3sKaNWv4xCc+wSOPPMKXv/xlent7+eQnP9n6zPXXX8+//du/8Ud/9EdccMEF/PznP+fqq6+etpzFXMf33Xcf3/nOd7jpppvI5/P83d/9HW984xvZv3//Ee8jCQkJzzIyISEh4TiwefNmqeu61HVdvuxlL5N/9Vd/Je+66y7ped60z+3YsUNqmiZf//rXyzAMp70XRVHr73q9Pmsd//W//leZyWSk4zit166++mq5atWqWZ996KGHJCC/8pWvzFrHhg0b5JVXXjlrfWvWrJFXXHFF67WPfvSjEpBvf/vbF3UM7r33XgnIf/mXf5EjIyNycHBQ/uhHP5KrV6+WQgj50EMPSSml3LNnz6xtO+uss2Rvb68cGxtrvfb4449LTdPku971rtZrn/70pyUg9+zZs+D2eJ4ne3t75emnny4bjUbr9TvuuEMC8iMf+Ujrta985SsSaG3jkVjMZ6+55hppWZbctWtX67XBwUGZz+flK17xitZrH/nIRyQgv/Od78xaRvP3aa5v5j43j/e9994rpZTy0UcflYD89re/veA+zKS5HdlsVl511VXy4x//uPztb38763Nz/XYzt/kP//APZS6Xk0899ZSUUspKpSLb29vln/7pn0777OHDh2VbW9us12fyoQ99SJqmKcfHx1uvua4r29vb5Y033th6ra2tTb7nPe9Z7C63+H38Pa+77jqZzWbnff9Y7gNTj7WUUr7+9a+XXV1drf//7W9/KwH5F3/xF9M+d/3110tAfvSjH229dqTrGJCWZcmdO3e2Xnv88cclIL/whS8suO8JCQnPHkmpXkJCwnHhiiuu4Fe/+hWve93rePzxx/nUpz7FlVdeybJly/jBD37Q+tz3vvc9oijiIx/5CJo2/RYkhGj9nU6nW39XKhVGR0e5+OKLqdfrbNu27Zi387HHHmPHjh1ce+21jI2NMTo6yujoKLVajVe96lX84he/IIqiad9597vffVTruPHGG+np6aG/v5+rr76aWq3G1772Nc4777w5P3/o0CEee+wxrr/++mnZjjPOOIMrrriC//zP/zz6HUWVeQ0PD3PTTTdN68u5+uqrOfnkk/nRj350TMtdiDAM2bx5M9dccw1r165tvd7X18e1117LfffdR7lcBuA//uM/OPPMM3n9618/azlTz4fF0MxA3HXXXbNKqBbilltu4Rvf+AZnn302d911Fx/+8Ic599xzOeecc6aVSy7Erbfeyh133MFXv/pVTj31VADuvvtuisUib3/721vn2+joKLqu89KXvpR77733iMt861vfiu/7fOc732m9tnnzZorFIm9961tbr7W3t/Pggw8eFxGSqbwQf8+FOB73gYsvvpixsbHWvjdL6W666aZpn3vf+9531Nt3+eWXT8v6nnHGGRQKheOmzpmQkHBsvKgdp1/84he89rWvpb+/HyEE3/ve9456GVJKPvOZz7Bx40Zs22bZsmV8/OMfP/4bm5DwAuD888/nO9/5DhMTE/zmN7/hQx/6EJVKhTe96U1s3boVUGVrmqa1jMr5eOqpp3j9619PW1sbhUKBnp4e3vnOdwL8Tv0NO3bsAOC6666jp6dn2r8vf/nLuK47a/lr1qw5qnV85CMf4e677+aee+7hiSeeYHBw8IgqbPv27QPgpJNOmvXeKaec0jLojpYjLffkk09uvX+8GRkZoV6vz7s/URRx4MABQJ0PC5V2LpY1a9bwwQ9+kC9/+ct0d3dz5ZVX8g//8A+LPl/e/va388tf/pKJiQk2b97Mtddey6OPPsprX/taHMdZ8Ps//vGPueWWW/jQhz7EG9/4xtbrzXPusssum3XObd68eUHxlDPPPJOTTz6Z22+/vfXa7bffTnd3d6t/DuBTn/oUW7ZsYcWKFbzkJS/h5ptvPi6G9gv19zwSx3IfWLly5bT/7+joAGBiYgJQ15umabPuF+vXrz/q7Zu5rub6mutKSEg4Mbyoe5xqtRpnnnkmN954I294wxuOaRl//ud/zubNm/nMZz7Dpk2bGB8fZ3x8/DhvaULCCwvLsjj//PM5//zz2bhxIzfccAPf/va3+ehHP7qo7xeLRS655BIKhQIf+9jHWLduHalUikceeYT/8T/+x6xI8NHQ/O6nP/1pzjrrrDk/M3P+y9Ts12LYtGkTl19++TFtX8Js5stUTBUKafLZz36W66+/nu9///ts3ryZ97///XziE5/g17/+NcuXL1/U+gqFAldccQVXXHEFpmnyta99jQcffJBLLrlk3u/s2bOHd7zjHVxxxRX89V//9bT3mufcbbfdxtKlS2d91zAWfhS/9a1v5eMf/zijo6Pk83l+8IMf8Pa3v33ad9/ylrdw8cUX893vfpfNmzfz6U9/mk9+8pN85zvf4aqrrlrUvj8XPNe/51wcy31A1/U5PyePoe9xIZ7LdSUkJCyeF7XjdNVVVx3xYeK6Lh/+8If55je/SbFY5PTTT+eTn/wkl156KQBPP/00X/ziF9myZUsrEne0kemEhN93muVphw4dAmDdunVEUcTWrVvnNVh+9rOfMTY2xne+8x1e8YpXtF6fS5VuPiNsvteb5S+FQuF549ysWrUKgGeeeWbWe9u2baO7u7slgX405U5Tlzs1M9F8rfn+8aanp4dMJjPv/miaxooVKwD1e2zZsuWIy2tG9mfOvJkvY7Zp0yY2bdrE//v//r888MADXHTRRXzpS1+a5dAshvPOO4+vfe1rrfN3LhqNBm94wxtob2/nm9/85qwS1OY519vbe8zn3Fvf+lZuueUW/uM//oMlS5ZQLpd529veNutzfX193HTTTdx0000MDw9zzjnn8PGPf/x3cpx+n37PJs/GfWDVqlVEUcSePXvYsGFD6/WdO3fO+uzRli0mJCQ8P3hRl+otxHvf+15+9atf8a1vfYsnnniCN7/5zbzmNa9ppfh/+MMfsnbtWu644w7WrFnD6tWr+ZM/+ZMk45TwouTee++dMxra7M9pBheuueYaNE3jYx/72KzMUfP7zWjr1OV5nsc//uM/zlp+Npuds3Sn6WjMNM7OPfdc1q1bx2c+8xmq1eqs742MjMy7j88WfX19nHXWWXzta1+btr1btmxh8+bN/MEf/EHrtfn2ay7OO+88ent7+dKXvoTruq3X77zzTp5++ulZal/HC13XefWrX833v//9aRLLQ0NDfOMb3+DlL385hUIBgDe+8Y08/vjjfPe73521nObv3zRyf/GLX7TeC8OQf/7nf572+XK5TBAE017btGkTmqZN2/+Z1Ot1fvWrX8353p133gnMXe7Y5N3vfjfbt2/nu9/9bsspmMqVV15JoVDgb/7mb/B9f9b7iznnTjnlFDZt2sTtt9/O7bffTl9f37SgQhiGs66D3t5e+vv7j7jvi+GF9nsuhmfjPtBUN5x5n/rCF74w67NHcx0nJCQ8f3hRZ5yOxP79+/nKV77C/v376e/vB+C///f/zo9//GO+8pWv8Dd/8zfs3r2bffv28e1vf5t//dd/JQxDPvCBD/CmN72Je+655wTvQULCc8v73vc+6vU6r3/96zn55JPxPI8HHniA22+/ndWrV3PDDTcAqt7/wx/+MLfeeisXX3wxb3jDG7Btm4ceeoj+/n4+8YlPcOGFF9LR0cF1113H+9//foQQ3HbbbXM6Zueeey633347H/zgBzn//PPJ5XK89rWvZd26dbS3t/OlL32JfD5PNpvlpS99KWvWrOHLX/4yV111Faeddho33HADy5YtY2BggHvvvZdCocAPf/jD5/rw8elPf5qrrrqKl73sZfzxH/9xS468ra2tNf+lub+gpNjf9ra3YZomr33ta+ccymuaJp/85Ce54YYbuOSSS3j729/ekiNfvXo1H/jAB36nbf6Xf/mXOWfL/Pmf/zl//dd/zd13383LX/5ybrrpJgzD4J/+6Z9wXZdPfepTrc/+5V/+Jf/+7//Om9/8Zm688UbOPfdcxsfH+cEPfsCXvvQlzjzzTE477TQuuOACPvShDzE+Pk5nZyff+ta3ZhnV99xzD+9973t585vfzMaNGwmCgNtuuw1d16f1HM2kXq9z4YUXcsEFF/Ca17yGFStWUCwW+d73vscvf/lLrrnmGs4+++w5v/ujH/2If/3Xf+WNb3wjTzzxBE888UTrvVwuxzXXXEOhUOCLX/wif/RHf8Q555zD2972Nnp6eti/fz8/+tGPuOiii/j7v//7BY/3W9/6Vj7ykY+QSqX44z/+42mZrUqlwvLly3nTm97EmWeeSS6X4yc/+QkPPfQQn/3sZxdcNvz+/J5NfN+fMyvV2dnJTTfddNzvA+eeey5vfOMb+fznP8/Y2FhLjnz79u3A9CzT0VzHCQkJzyNOmJ7f8wxAfve73239f1OuN5vNTvtnGIZ8y1veIqWU8k//9E8lIJ955pnW95pypNu2bXuudyEh4YRy5513yhtvvFGefPLJMpfLScuy5Pr16+X73vc+OTQ0NOvz//Iv/yLPPvtsadu27OjokJdccom8++67W+/ff//98oILLpDpdFr29/e35M2ZIlcspZTValVee+21sr29XQLTpMm///3vy1NPPVUahjFLQvrRRx+Vb3jDG2RXV5e0bVuuWrVKvuUtb5E//elPW59pyhCPjIws6hg05ZQXkk+eT9L6Jz/5ibzoootkOp2WhUJBvva1r5Vbt26d9f1bb71VLlu2TGqatihp8ttvv711rDs7O+U73vEOefDgwWmfORY58vn+HThwQEop5SOPPCKvvPJKmcvlZCaTka985SvlAw88MGt5Y2Nj8r3vfa9ctmyZtCxLLl++XF533XVydHS09Zldu3bJyy+/XNq2LZcsWSL/5//8n/Luu++edj7s3r1b3njjjXLdunUylUrJzs5O+cpXvlL+5Cc/OeL++L4v/8//+T/ymmuukatWrZK2bctMJiPPPvts+elPf1q6rtv67Mzf7kjHYqZM/r333iuvvPJK2dbWJlOplFy3bp28/vrr5cMPP7zgMZdSSfk3l33fffdNe891XfmXf/mX8swzz5T5fF5ms1l55plnyn/8x39ccLm/b7+nlEqOfL79WbduXetzv8t9YC5Z9VqtJt/znvfIzs5Omcvl5DXXXCOfeeYZCcj//b//97Tvz3cdA3PKyq9atUped911C+57QkLCs4eQMuk0BBUJ+u53v8s111wDKMWid7zjHTz11FOzmjRzuRxLly7lox/96KzSi0ajQSaTYfPmzVxxxRXP5S4kJCQkJCQkPM947LHHOPvss/n617/OO97xjhO9OQkJCb8DSanePJx99tmEYcjw8DAXX3zxnJ+56KKLCIKAXbt2tWq2myn5Z6vpOiEhISEhIeH5SaPRmKXC+fnPfx5N06b1pCUkJLwweVE7TtVqdZrazZ49e3jsscfo7Oxk48aNvOMd7+Bd73oXn/3sZzn77LMZGRnhpz/9KWeccQZXX301l19+Oeeccw433ngjn//854miiPe85z1cccUVbNy48QTuWUJCQkJCQsJzzac+9Sl++9vf8spXvhLDMLjzzju58847+bM/+7OW8mBCQsILlxd1qd7PfvYzXvnKV856/brrruOrX/1qq7H0X//1XxkYGKC7u5sLLriAW265hU2bNgEwODjI+973PjZv3kw2m+Wqq67is5/9LJ2dnc/17iQkJCQkJCScQO6++25uueUWtm7dSrVaZeXKlfzRH/0RH/7whxc1ryshIeH5zYvacUpISEhISEhISEhISFgMyRynhISEhISEhISEhISEBUgcp4SEhISEhISEhISEhAV40RXcRlHE4OAg+Xx+2jC6hISEhISEhISEhIQXF1JKKpUK/f390waLz8WLznEaHBxMlG0SEhISEhISEhISElocOHCA5cuXH/EzLzrHKZ/PA+rgFAqF53Tdvu+zefNmXv3qV2Oa5nO67hczyXE/cSTH/sSQHPcTR3LsTxzJsT8xJMf9xJEc++NDuVxmxYoVLR/hSLzoHKdmeV6hUDghjlMmk6FQKCQn+HNIctxPHMmxPzEkx/3EkRz7E0dy7E8MyXE/cSTH/viymBaeRBwiISEhISEhISEhISFhARLHKSEhISEhISEhISEhYQESxykhISEhISEhISEhIWEBEscpISEhISEhISEhISFhARLHKSEhISEhISEhISEhYQESxykhISEhISEhISEhIWEBEscpISEhISEhISEhISFhARLHKSEhISEhISEhISEhYQESxykhISEhISEhISEhIWEBEscpISEhISEhISEhISFhARLHKSEhISEhISEhISEhYQESxykhISEhISEhISEhIWEBEscpISEhISEhISEhISFhAYwTvQEvZqo1j8/e8wwHxx2W5G0i3+fxw3Uc32dgtIEHWDqcvyLDWSt7uG/nOIcqLoWUwaXrOqhH8OjBMqOlBg0voO6r5VoadOY0TNPC9wMiKcinDDoyJkXHZduQO207cjo0QgiP474ZQHAcl/e7YOuST70ETr/5LtxQnOjNeVGRHPsTQ3LcTxzJsT9xJMf+2acZbY+mvPZsHXedxdslBiBE/B0JEvUvAgSQMqCvzeakJVkGiw7bh+v4gbJTxIz9OVbaTGjL6ISRjucHlJwIb8Zn0gKkACHVf50pK9aBgg2mbtDwAyr+7H1s7o8W759+jMdeBzpSYBk6NU9thOdJGjM+J+L1HM1ydaH+RRICqZbRnRWs7S2g6xp1JyBtGXTmba46YymnLm1nRUcGTXthXLOJ43SCeO83HuHOJw8RLnBGOiH8cm+dX+7d13rtcMVj+0h93u8EEdTLEeBMvljxYdYloageT4+puQ3Hf5EJ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y7Vj3vCGN6iXvexl6re//a369a9/rVauXKne8Y531O4fHR1Vra2t6uqrr1abN29WP/jBD1QikVDf/va35/T9LhRf/OIXVWNjo/rxj3+sdu3apX74wx+qdDqtbr311toxsu7Hx09/+lP1l3/5l+rOO+9UgPqP//iPSffP1To/+OCDyjAM9eUvf1k988wz6q/+6q+UZVnq6aefPuFrMF+OtPYjIyNqw4YN6l/+5V/Uc889px566CF18cUXqwsvvHDSc8jaH72Z/s1PuPPOO9XLXvYy1d7erv7X//pfk+6TdZ9fEjjNgYsvvlhdd911ta/DMFTt7e3qpptumsezOrn19fUpQN1///1KqfgHvWVZ6oc//GHtmGeffVYB6qGHHlJKxT+wdF1XPT09tWO++c1vqmw2q6rVqlJKqU984hPq7LPPnvRab3/729WVV155ot/SgpbP59WqVavUPffco171qlfVAidZ9xPnxhtvVK94xSsOe38URaqtrU39z//5P2u3jYyMKMdx1A9+8AOllFLPPPOMAtTvfve72jE/+9nPlKZpat++fUoppf7+7/9e5XK52vdi4rXPOOOM4/2WTgpXXXWV+tM//dNJt/3X//pf1dVXX62UknU/UQ69iJzLdX7b296mrrrqqknnc8kll6j3v//9x/U9LlRHuoCf8MgjjyhAvfDCC0opWfvj4XDr/uKLL6qOjg61efNmtWTJkkmBk6z7/JNSvRPM8zwee+wxNmzYULtN13U2bNjAQw89NI9ndnIbHR0FoKGhAYDHHnsM3/cnrfOaNWvo6uqqrfNDDz3E2rVraW1trR1z5ZVXMjY2xpYtW2rHHPwcE8ec7t+r6667jquuumrK2si6nzj/9//+X9atW8cf/dEf0dLSwvnnn893vvOd2v27du2ip6dn0rrV1dVxySWXTFr7+vp61q1bVztmw4YN6LrOww8/XDvmla98JbZt14658sor2bp1K8PDwyf6bS44l112GRs3buT5558H4Mknn+SBBx7gjW98IyDrPlfmcp3l58/MRkdH0TSN+vp6QNb+RImiiGuuuYaPf/zjnH322VPul3WffxI4nWADAwOEYTjpohGgtbWVnp6eeTqrk1sURXzkIx9h/fr1nHPOOQD09PRg23bth/qEg9e5p6dn2u/DxH1HOmZsbIxyuXwi3s6Cd8cdd/D4449z0003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HKlUirPPPpuf/vSn057Lli1b2LFjB3//93/Py1/+cpYsWcL69ev5whe+wMtf/nJgaqneu9/9bjRNm/Jx3333AVCtVvnYxz5GR0cHqVSKSy65pHafEEKIhUsCJyGEEAvGvn37eNOb3sRFF13Ek08+yTe/+U3+8R//kS984Qu1Yz71qU9x88038+lPf5pnnnmG22+/ndbW1lm/xnXXXUe1WuVXv/oVTz/9NF/60pdIp9PTHtvc3Iyu6/zbv/0bYRjO6vlvvfVWuru7ax8f/vCHaWlpYc2aNQBcf/31PPTQQ9xxxx089dRT/NEf/RFveMMb2LZt26zfgxBCiLknpXpCCCEWjL//+7+ns7OTr3/962iaxpo1a9i/fz833ngjn/nMZygWi9x66618/etf59prrwVgxYoVvOIVr5j1a+zZs4c/+IM/YO3atQAsX778sMd2dHTw1a9+lU984hN8/vOfZ926dbzmNa/h6quvPuzj6urqqKurA+DOO+/k29/+Nr/4xS9oa2tjz5493HbbbezZs4f29nYAPvaxj3HXXXdx22238Td/8zezfh9CCCHmlmSchBBCLBjPPvssl156KZqm1W5bv349hUKBF198kWeffZZqtcoVV1zxkl/jQx/6EF/4whdYv349n/3sZ3nqqaeOePx1111HT08P3//+97n00kv54Q9/yNlnn80999xzxMc98cQTXHPNNXz9619n/fr1ADz99NOEYcjq1atJp9O1j/vvv58dO3a85PckhBDixJPASQghxEkjkUgc8X5dj3+tKaVqt/m+P+mYP/uzP2Pnzp1cc801PP3006xbt46vfe1rR3zeTCbDm9/8Zr74xS/y5JNPcvnll08qHzxUT08Pb3nLW/izP/sz3vve99ZuLxQKGIbBY489xqZNm2ofzz77LLfeeusRz0EIIcT8ksBJCCHEgnHmmWfy0EMPTQp8HnzwQTKZDIsXL2bVqlUkEgk2btw47eObm5sB6O7urt023Xylzs5OPvCBD3DnnXfy0Y9+lO985zuzPseJEsJisTjt/ZVKhd/7vd9jzZo1fOUrX5l03/nnn08YhvT19bFy5cpJH9KZTwghFjbZ4ySEEGLOjY6OTgloGhsb+eAHP8gtt9zCf//v/53rr7+erVu38tnPfpYbbrgBXddxXZcbb7yRT3ziE9i2zfr16+nv72fLli28973vZeXKlXR2dvK5z32OL37xizz//PP83d/93aTX+chHPsIb3/hGVq9ezfDwMPfeey9nnnnmtOe5adMmPvvZz3LNNddw1llnYds2999/P9/97ne58cYbp33M+9//fvbu3cvGjRvp7++v3d7Q0MDq1au5+uqrede73sXf/d3fcf7559Pf38/GjRs599xzueqqq45tYYUQQpw4SgghhJhD1157rQKmfLz3ve9VSil13333qYsuukjZtq3a2trUjTfeqHzfrz0+DEP1hS98QS1ZskRZlqW6urrU3/zN39Tuf+CBB9TatWuV67rq8ssvVz/84Q8VoHbt2qWUUur6669XK1asUI7jqObmZnXNNdeogYGBac+1v79ffehDH1LnnHOOSqfTKpPJqLVr16q//du/VWEYKqWU2rVrlwLUE088oZRSasmSJdO+v3vvvVcppZTneeozn/mMWrp0qbIsSy1atEj9/u//vnrqqaeO80oLIYQ4njSlDqqHEEIIIYQQQggxhexxEkIIIYQQQogZSOAkhBBCCCGEEDOQwEkIIYQQQgghZiCBkxBCCCGEEELMQAInIYQQQgghhJiBBE5CCCGEEEIIMQMJnIQQQgghhBBiBhI4CSGEEEIIIcQMJHASQgghhBBCiBlI4CSEEEIIIYQQM5DASQghhBBCCCFm8P8DNg0hygqUBHMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plt.figure(figsize=(10, 6))\n", + "# plt.scatter(panda_df[\"locusSize\"], panda_df[\"locusLength\"], alpha=0.5)\n", + "# plt.title(\"Scatter Plot of Locus Size vs Locus Length\")\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Locus Length\")\n", + "# plt.grid(True)\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "susie_fm = StudyLocus.from_parquet(session, \"/Users/dc16/output/gwas_cat_fm\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total credible sets:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "632123" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "susie_fm.df.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It seems a very small fraction of loci have NaN assigned to values for their credible sets\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets with 'not a number' as the logBF: 39\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:====================================================> (175 + 6) / 181]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets with 'null' as the logBF: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "nan = susie_fm.df.filter(f.isnan(\"credibleSetlog10BF\"))\n", + "null = susie_fm.df.filter(f.isnull(\"credibleSetlog10BF\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------\n", + " meanTopPP | 0.7341557442854078 \n", + " minTopPP | 5.30020287265377E-4 \n", + " q1TopPP | 0.43393218153901475 \n", + " medianTopPP | 0.9841312727728387 \n", + " q3TopPP | 0.9999999999927383 \n", + " maxTopPP | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanCredSetSize | 64.33602495870802 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 2 \n", + " q3CredSetSize | 13 \n", + " maxCredSetSize | 10710 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------\n", + " meanPurityMeanR2 | 0.6459716225861719 \n", + " minPurityMeanR2 | 0.00469889394266767 \n", + " q1PurityMeanR2 | 0.23746586177412243 \n", + " medianPurityMeanR2 | 0.8203905763487525 \n", + " q3PurityMeanR2 | 1.0 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 28:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------\n", + " meanPurityMinR2 | 0.48250211427144807 \n", + " minPurityMinR2 | 0.0 \n", + " q1PurityMinR2 | 6.409217073028031... \n", + " medianPurityMinR2 | 0.46903358691552954 \n", + " q3PurityMinR2 | 1.0 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "susie_results = (\n", + " susie_fm.df.withColumn(\"credSetSize\", f.size(\"locus\"))\n", + " .withColumn(\n", + " \"locus\",\n", + " f.slice(order_array_of_structs_by_field(\"locus\", \"posteriorProbability\"), 1, 1)[\n", + " 0\n", + " ],\n", + " )\n", + " .withColumn(\"topPP\", f.col(\"locus\").getField(\"posteriorProbability\"))\n", + " .filter(~f.isnan(\"topPP\"))\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAASlCAYAAAB5vWpLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAADu20lEQVR4nOzdeVhVBf7H8c8FZXEB3AAZSXHJfZnUkFLTJFFpMXXGLQPFpYJSKS3L1NLJstxKk3FK0UZzacwmNZRw+5moiZK7pWnWKC6poJiAcH5/9HD0CioiHhbfr+e5z8w953vP+d4DxbfPPfccm2EYhgAAAAAAAAALORR2AwAAAAAAALj3EEoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBJVSNGjUUGhpa2G2UeO+//75q1qwpR0dHNWvWrLDbMbVr107t2rUr7DYkSdHR0bLZbDp69GhhtwIAADOSRZiRAOQFoRRQDGT/R/327dtzXd+uXTs1atTojvezatUqjRs37o63c69Ys2aNRo4cqYcfflhz587VO++8U9gt3dDx48c1btw4JSYm5nsb7dq1k81mU506dXJdHxsbK5vNJpvNpi+++CLf+7nW+vXrzW3abDY5OjrK09NTPXr00P79+3PUL1u2TD179lTNmjVVpkwZ1a1bVy+//LLOnz9fIP0AAIoWZqSiiRnJ3t2Yke7UuHHj7Gas0qVLq0aNGnrppZdyzE2XLl3SzJkz1bFjR1WtWlXly5fXX//6V82aNUuZmZmF8wZQYpQq7AYA3B0HDx6Ug8Pt5c6rVq3SzJkzGbryaO3atXJwcNCnn34qJyenwm7Hzpo1a+yeHz9+XG+99ZZq1KhxR59Wuri46NChQ9q2bZsefPBBu3ULFiyQi4uLLl++bLe8X79+6tWrl5ydnfO935deekktW7ZURkaGdu3apaioKK1fv1579uyRt7e3WTd48GD5+PjomWee0X333afdu3drxowZWrVqlXbs2CFXV9d89wAAKBmYke4+ZqS8zUhFwaxZs1SuXDmlpqYqLi5OH330kXbs2KFNmzaZNT///LNefPFFdejQQZGRkXJzc9Pq1av1wgsvaMuWLZo3b14hvgMUd4RSQAl1JwFAYUlNTVXZsmULu408O3XqlFxdXYvUsHXp0iWVKVPmrvVUq1YtXblyRZ9//rndwHX58mV9+eWXCg4O1n/+8x+71zg6OsrR0fGO9tumTRv16NHDfF63bl09//zzmj9/vkaOHGku/+KLL3Kckt+8eXOFhIRowYIFGjhw4B31AQAo/piR7j5mpLzNSEVBjx49VLlyZUnSkCFD1KtXLy1evNguXPP29tbu3bvVsGFD83VDhgzRgAEDNHfuXL355puqXbt2ofSP4o+v7wEl1PXXS8jIyNBbb72lOnXqyMXFRZUqVVLr1q0VGxsrSQoNDdXMmTMlye5U3mypqal6+eWX5evrK2dnZ9WtW1cffPCBDMOw2+8ff/yhl156SZUrV1b58uX15JNP6n//+59sNpvdp4vZpwzv27dPffr0UYUKFdS6dWtJ0q5duxQaGqqaNWvKxcVF3t7eGjBggH7//Xe7fWVv48cff9Qzzzwjd3d3ValSRW+++aYMw9Cvv/6qp556Sm5ubvL29tbkyZPzdOyuXLmi8ePHq1atWnJ2dlaNGjX0+uuvKy0tzayx2WyaO3euUlNTzWMVHR19w21mf30gISFBDz30kFxdXeXn56eoqCi7uhtdfyn7a2zr16/PdZtt27ZVmTJl9Prrr5vrssOZ9evXq2XLlpKk/v372/U7duxYlS5dWqdPn87R8+DBg+Xh4ZHjU73evXtr8eLFysrKMpd9/fXXunTpkv7+97/n2E5u76lGjRp6/PHHtWnTJj344INycXFRzZo1NX/+/Bsew2u1adNGknT48GG75bldI+Lpp5+WpFy/7gcAuPcwIzEjFZUZSZL+97//acCAAfLy8pKzs7MaNmyoOXPm2NWkp6drzJgxat68udzd3VW2bFm1adNG69ats6s7evSobDabPvjgA82ePdv8ObVs2VLff/99rvu/Xm4zVuXKle0CqWzMWCgIhFJAMZKcnKwzZ87keGRkZNzytePGjdNbb72l9u3ba8aMGXrjjTd03333aceOHZL+/LTjsccekyR99tln5kOSDMPQk08+qalTp6pTp06aMmWK6tatqxEjRigyMtJuP6Ghofroo4/UpUsXvffee3J1dVVwcPAN+/rb3/6mS5cu6Z133tGgQYMk/fm9+59//ln9+/fXRx99pF69emnRokXq0qVLjgFPknr27KmsrCy9++678vf314QJ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bNmyxVz3yCOPGCEhIXb1S5YsMe6//37DycnJaNiwobFy5UqLOy6ebuc4V69e3ZCU4zF27FjrGy+Gbvd3+loMVnl3u8d58+bNhr+/v+Hs7GzUrFnT+Mc//mFcuXLF4q6Ln9s5zhkZGca4ceOMWrVqGS4uLoavr6/xwgsvGOfOnbO+8WJk3bp1uf47N/vYhoSEGI888kiO1zRr1sxwcnIyatasacydO9fyvlF4mJ2swexkHWYnazA7WYf56e4rDvOTzTA41w0AAAAAAADW4ppSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAO5p0dHR8vDwsHy/7dq107BhwyzfLwAAQF4V1pwE4N5BKAXgntazZ0/9+OOP5vNx48apWbNmt72d0NBQ2Ww2PffccznWhYeHy2azKTQ01Fy2bNkyjR8//rb2YbPZzIebm5tatmypr776yq5m2bJleuyxx1SlShW5ubkpICBAq1evvu33AwAAUFhzklXatWtnzlYuLi66//77NXHiRBmGYdb88MMP6t27t3x9feXq6qr69etr+vTplvcKlFSEUgDuWRkZGXJ1dZWnp2eBbM/X11eLFi3SH3/8YS67fPmyFi5cqPvuu8+utmLFiipfvvxt72Pu3Lk6ceKEtm/frocfflg9evTQ7t27zfUbN27UY489plWrVikhIUHt27fXE088oZ07d+b/jQEAgHtOYc5JVho0aJBOnDihgwcPatSoURozZoyioqLM9QkJCfL09NS///1v7d27V2+88YZGjRqlGTNmFFrPQElCKAWgWGjXrp0iIiIUEREhd3d3Va5cWW+++ab5SZbNZtPy5cvtXuPh4aHo6GhJ0tGjR2Wz2bR48WI98sgjcnFx0YIFC+xOS4+OjtZbb72lH374wfzULDo6WgMGDNDjjz9ut+2MjAx5enrq008/NZc98MAD8vX11bJly8xly5Yt03333ae//vWvOd7PtV/fq1Gjht555x0NGDBA5cuX13333afZs2fnOA4eHh7y9vbW/fffr/Hjx+vKlStat26duX7atGkaOXKkWrZsqTp16uidd95RnTp19PXXX+f5WAMAgOKlpM1JWVlZmjhxovz8/OTq6qqmTZvqiy++MNdnZmYqLCzMXF+3bt0cZy+Fhoaqa9eu+uCDD1S1alVVqlRJ4eHhysjIsKsrU6aMvL29Vb16dfXv319NmjRRbGysuX7AgAGaPn26HnnkEdWsWVPPPPOM+vfvb/c+AOQfoRSAYmPevHkqVaqUtm3bpunTp2vKlCn65JNPbmsbr732moYOHar9+/crKCjIbl3Pnj318ssvq2HDhjpx4oROnDihnj17auDAgYqJidGJEyfM2hUrVujSpUvq2bOn3TYGDBiguXPnms/nzJmj/v3756m3yZMnq0WLFtq5c6deeOEFPf/88zp48GCutVeuXDEHPScnpxtuMysrSxcuXFDFihXz1AMAACieStKcNHHiRM2fP19RUVHau3evhg8frmeeeUYbNmyQ9Od8U61aNS1dulT79u3TmDFj9Prrr2vJkiV221m3bp0OHz6sdevWad68eYqOjjaDuOsZhqH/+7//04EDB246W0lScnIysxVQQEoVdgMAkFe+vr6aOnWqbDab6tatq927d2vq1KkaNGhQnrcxbNgwdevWLdd1rq6uKleunEqVKiVvb29z+UMPPaS6devqs88+08iRIyX9+TW6v/3tbypXrpzdNp555hmNGjVKv/zyiyTpu+++06JFi7R+/fpb9talSxe98MILkqRXX31VU6dO1bp161S3bl2zpnfv3nJ0dNQff/yhrKws1ahRQ3//+99vuM0PPvhAFy9evGkNAAAo/krKnJSWlqZ33nlH3377rQICAiRJNWvW1KZNm/TPf/5TjzzyiEqXLq233nrLfI2fn5/i4+O1ZMkSu5mnQoUKmjFjhhwdHVWvXj0FBwcrLi7O7ph8/PHH+uSTT5Senq6MjAy5uLjopZdeuuEx2rx5sxYvXqyVK1fe6nACyAPOlAJQbLRq1Uo2m818HhAQoJ9++kmZmZl53kaLFi3yte+BAwean+ydPHlS33zzjQYMGJCjrkqVKgoODlZ0dLTmzp2r4OBgVa5cOU/7aNKkifn/bTabvL29derUKbuaqVOnKjExUd98840aNGigTz755Iaf1C1cuFBvvfWWlixZUmDXgwAAAEVTSZmTDh06pEuXLumxxx5TuXLlzMf8+fN1+PBhs27mzJlq3ry5qlSponLlymn27Nk6duyY3bYaNmwoR0dH83nVqlVzzFZ9+/ZVYmKivvvuO3Xu3FlvvPGGHnrooVzf5549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Lqov/q3S5ZZJuujipZdSlmsDVFV9+/a9aPJakkv9gwAAgKqMuc1Pqvrcxs/P76JfdhUVFSkoKEgrVqwocZtLhTGl5ePjo86dO6tz586KiopSv379tGLFCkVHR1vj/c9//lMhISEXbVueO+W1atVK9913n+68805dddVVWrFixWVDqYULF+q1117Tv/71L3Xt2tVjXVFRkTp37qxnn322xG3DwsLK3CNQFoRSAK6Ixo0ba9SoURo1apROnTqlvn37as6cOdbE7VKTleILR548edLjN4oHDhyw1hf/t6ioSIcOHfL4jdYXX3xR6h5/+OEHpaam6rHHHtOsWbOs5eU5Nb88il/DwYMHrd+WSlJWVpays7NLvKNLafzc2H7yyScqKirymLBdOLbFShqHzz//3ONufgAA1BbMbS7vSsxtis++3rdv30UX7S7t9u+884569+5dYoh3fu/ST2N11VVXWcuPHz9+0V36LqX4F29Hjx716D0oKOiyvZc1yGvUqJGuvvrqy94Z+b333tPDDz+sSZMmWXcjPN/VV1+tjz/+WLfcckuN+EUpqh++MwGgwl14aneDBg3Upk0bj++8169fX5KUnZ3tUTtw4EAVFhZq0aJFHsufe+45eXl56dZbb5UkxcTESJKWLFniUfe3v/2t1H0W/xbwwt/6LViwoNT7+CUGDhxY4vGKf1P1c3fb+Tn169cv8fT8gQMHyuVyafXq1daygoIC/e1vf1ODBg100003edSvW7dO//3vf63nO3fu1I4dO6y/AwAAagvmNqVzJeY23bp1U3h4uBYsWHDR2JbmzK3f//73Kiws1OOPP37RuoKCAmuf0dHRqlu3rv72t7957LeksXvvvfdKvGtj8TW12rVrJ+mnv1OHw6Enn3yyxPrjx49bf77U++fjjz8u8eul33zzjT799FPrWCU5evSofv/736tPnz56+umnS6z5/e9/r//+978e18Iqdvr0aeXm5l5y/0BF4EwpABWuY8eOuvnmmxUREaHGjRtr9+7d+r//+z+NHz/eqomIiJAkPfjgg4qJiZGPj4+GDh2q22+/Xf369dOjjz6qr7/+Wtddd53efvtt/ec//9GkSZOs3zhFRERo8ODBWrBggf73v/9Zt03+/PPPJZXut00Oh0N9+/bV/PnzdfbsWf3qV7/S22+/rUOHDl2BUbnYddddp7i4OL34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ANsRSgEAAAAAAMB2hFIAAAAAAACwHaEUAAAAAAAAbEcoBQAAAAAAANsRSgEAAAAAAMB2hFIAAAAAAACwHaEUAAAAAAAAbEcoBQAAAAAAANsRSgEAAAAAAMB2hFIAAAAAAACwHaEUAAAAAAAAbEcoBQAAAAAAANsRSgEAAAAAAMB2hFIAAAAAAACwHaEUAABANTJnzhx5eXl5PNq3b2+tP3PmjBISEtSkSRM1aNBAgwcPVlZWlsc+Dh8+rNjYWNWrV09BQUGaMmWKCgoKPGq2bNmibt26yc/PT23atFFSUtJFvSxevFitW7eWv7+/IiMjtXPnTo/1pekFAADUXoRSAAAA1cy1116ro0ePWo/333/fWjd58mS9+eabWrt2rbZu3aojR47orrvustYXFhYqNjZW+fn52r59u5YvX66kpCTNmjXLqjl06JBiY2PVr18/ZWRkaNKkSbr//vu1adMmq2b16tVKTEzU7Nmz9dFHH+m6665TTEyMjh07VupeAABA7UYoBQAAUM3UqVNHISEh1qNp06aSpJycHL3yyit69tln9etf/1oRERF69dVXtX37dn344YeSpLfffluffvqp/vWvf6lr16669dZb9fjjj2vx4sXKz8+XJC1btkzh4eF65pln1KFDB40fP1533323nnvuOauHZ599VqNHj9aoUaPUsWNHLVu2TPXq1dPf//73UvcCAABqN0IpAACAaubgwYMKDQ3VVVddpeHDh+vw4cOSpPT0dJ09e1bR0dFWbfv27dWyZUulpaVJktLS0tS5c2cFBwdbNTExMXK73dq/f79Vc/4+imuK95Gfn6/09HSPGm9vb0VHR1s1pemlJHl5eXK73R4PAABQMxFKAQAAVCORkZFKSkpScnKyli5dqkOHDunGG2/UyZMn5XK55Ovrq8DAQI9tgoOD5XK5JEkul8sjkCpeX7zu52rcbrdOnz6t77//XoWFhSXWnL+Py/VSknnz5snpdFqPsLCw0g0MAACodupUdgMAAAAovVtvvdX6c5cuXRQZGalWrVppzZo1CggIqMTOKsaMGTOUmJhoPXe73QRTAADUUJwpBQAAUI0FBgbqmmuu0RdffKGQkBDl5+crOzvboyYrK0shISGSpJCQkIvugFf8/HI1DodDAQEBatq0qXx8fEqsOX8fl+ulJH5+fnI4HB4PAABQMxFKAQAAVGOnTp3Sl19+qebNmysiIkJ169ZVamqqtT4zM1OHDx9WVFSUJCkqKkp79+71uEteSkqKHA6HOnbsaNWcv4/imuJ9+Pr6KiIiwqOmqKhIqampVk1pegEAALUbX98DAACoRh5++GHdfvvtatWqlY4cOaLZs2fLx8dHw4YNk9PpVHx8vBITE9W4cWM5HA5NmDBBUVFR6tWrlySpf//+6tixo0aMGKH58+fL5XJp5syZSkhIkJ+fnyRp7NixWrRokaZOnar77rtPmzdv1po1a7Rhwwarj8TERMXFxal79+7q2bOnFixYoNzcXI0aNUqSStULAACo3QilAAAAqpHvvvtOw4YN0//+9z81a9ZMffr00YcffqhmzZpJkp577jl5e3tr8ODBysvLU0xMjJYsWWJt7+Pjo/Xr12vcuHGKiopS/fr1FRcXp7lz51o14eHh2rBhgyZPnqyFCxeqRYsWevnllxUTE2PVDBkyRMePH9esWbPkcrnUtWtXJScne1z8/HK9AACA2s3LGGMqu4nawu12y+l0Kicnh+sjAABQgvikXeXe9pWRPSqwk3P4/K5cV3r8q+J7DgCA6q60n99cUwoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7So1lJo3b5569Oihhg0bKigoSIMGDVJmZqZHzc033ywvLy+Px9ixYz1qDh8+rNjYWNWrV09BQUGaMmWKCgoKPGq2bNmibt26yc/PT23atFFSUtJF/SxevFitW7eWv7+/IiMjtXPnTo/1Z86cUUJCgpo0aaIGDRpo8ODBysrKqpjBAAAAAAAAqEUqNZTaunWrEhIS9OGHHyolJUVnz55V//79lZub61E3evRoHT161HrMnz/fWldYWKjY2Fjl5+dr+/btWr58uZKSkjRr1iyr5tChQ4qNjVW/fv2UkZGhSZMm6f7779emTZusmtWrVysxMVGzZ8/WRx99pOuuu04xMTE6duyYVTN58mS9+eabWrt2rbZu3aojR47orrvuuoIjBAAAAAAAUDN5GWNMZTdR7Pjx4woKCtLWrVvVt29fST+dKdW1a1ctWLCgxG02btyo2267TUeOHFFwcLAkadmyZZo2bZqOHz8uX19fTZs2TRs2bNC+ffus7YYOHars7GwlJydLkiIjI9WjRw8tWrRIklRUVKSwsDBNmDBB06dPV05Ojpo1a6aVK1fq7rvvliQdOHBAHTp0UFpamnr16nVRb3l5ecrLy7Oeu91uhYWFKScnRw6H45cPGAAANUx80q5yb/vKyB4V2Mk5brdbTqeTz+9KcqXHvyq+5wAAqO5K+/ldpa4plZOTI0lq3Lixx/IVK1aoadOm6tSpk2bMmKEff/zRWpeWlqbOnTtbgZQkxcTEyO12a//+/VZNdHS0xz5jYmKUlpYmScrPz1d6erpHjbe3t6Kjo62a9PR0nT171qOmffv2atmypVVzoXnz5snpdFqPsLCwMo8JAAAAAABATVSnshsoVlRUpEmTJql3797q1KmTtfyee+5Rq1atFBoaqk8++UTTpk1TZmam/v3vf0uSXC6XRyAlyXrucrl+tsbtduv06dP64YcfVFhYWGLNgQMHrH34+voqMDDwopri41xoxowZSkxMtJ4XnykFAAAAAABQ21WZUCohIUH79u3T+++/77F8zJgx1p87d+6s5s2b65ZbbtGXX36pq6++2u42y8TPz09+fn6V3QYAAAAAAECVUyW+vjd+/HitX79e7777rlq0aPGztZGRkZKkL774QpIUEhJy0R3wip+HhIT8bI3D4VBAQICaNm0qHx+fEmvO30d+fr6ys7MvWQMAAAAAAIDSqdRQyhij8ePH6/XXX9fmzZsVHh5+2W0yMjIkSc2bN5ckRUVFae/evR53yUtJSZHD4VDHjh2tmtTUVI/9pKSkKCoqSpLk6+uriIgIj5qioiKlpqZaNREREapbt65HTWZmpg4fPmzVAAAAAAAAoHQq9et7CQkJWrlypf7zn/+oYcOG1rWZnE6nAgIC9OWXX2rlypUaOHCgmjRpok8++USTJ09W37591aVLF0lS//791bFjR40YMULz58+Xy+XSzJkzlZCQYH11buzYsVq0aJGm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kyerbt26Onz4sOrVq2ctHzJkiJKTk8uzSwAAgBqPORQAAMA55fr63ttvv61NmzapRYsWHsvbtm2rb775pkIaAwAAqGmYQwEAAJxTrjOlcnNzPX67V+zEiRPcwhcAAOASmEMBAACcU65Q6sYbb9Q//vEP67mXl5eKioo0f/589evXr8KaAwAAqEmYQwEAAJxTrq/vzZ8/X7fccot2796t/Px8TZ06Vfv379eJEyf0wQcfVHSPAAAANQJzKAAAgHPKdaZUp06d9Pnnn6tPnz664447lJubq7vuukt79uzR1VdfXdE9AgAA1AjMoQAAAM4p85lSZ8+e1YABA7Rs2TI9+uijV6InAACAGoc5FAAAgKcynylVt25dffLJJ1eiFwAAgBqLORQAAICncn197w9/+INeeeWViu4FAACgRmMOBQAAcE65LnReUFCgv//973rnnXcUERGh+vXre6x/9tlnK6Q5AACAmoQ5FAAAwDllCqW++uortW7dWvv27VO3bt0kSZ9//rlHjZeXV8V1BwAAUAMwhwIAALhYmb6+17ZtW33//fd699139e677yooKEirVq2ynr/77rvavHlzqfe3bds23X777QoNDZWXl5fWrVvnsX7kyJHy8vLyeAwYMMCj5sSJExo+fLgcDocCAwMVHx+vU6dOedR88sknuvHGG+Xv76+wsDDNnz//ol7Wrl2r9u3by9/fX507d9Zbb73lsd4Yo1mzZql58+YKCAhQdHS0Dh48WOrXCgAAaq+KnkMBAADUBGUKpYwxHs83btyo3Nzcch88NzdX1113nRYvXnzJmgEDBujo0aPW47XXXvNYP3z4cO3fv18pKSlav369tm3bpjFjxljr3W63+vfvr1atWik9PV1PP/205syZoxdffNGq2b59u4YNG6b4+Hjt2bNHgwYN0qBBg7Rv3z6rZv78+Xr++ee1bNky7dixQ/Xr11dMTIzOnDlT7tcPAABqh4qeQwEAANQE5bqmVLELJ1hldeutt+rWW2/92Ro/Pz+FhISUuO6zzz5TcnKydu3ape7du0uS/va3v2ngwIH661//qtDQUK1YsUL5+fn6+9//Ll9fX1177bXKyMjQs88+a4VXCxcu1IABAzRlyhRJ0uOPP66UlBQtWrRIy5YtkzFGCxYs0MyZM3XHHXdIkv7xj38oODhY69at09ChQ3/ROAAAgNrl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wMBAj9rz55qX+vkrXvdzNTXtZ3TVqlX66KOPtGvXrovWMZZl99VXX2np0qVKTEzUI488ol27dunBBx+Ur6+v4uLirDH5uX8LuVwuBQUFeayvU6eOGjdu7FETHh5+0T6K1zVq1OiKvD67TZ8+XW63W+3bt5ePj48KCwv15z//WcOHD5ckxvMXsHPsqvu//wmlgArw1FNPadWqVdqyZYv8/f0ru50a4+TJkxoxYoReeuklNW3atLLbqfGKiooUFBSkF198UT4+PoqIiNB///tfPf3004RSFWjLli168skntWTJEkVGRuqLL77QxIkT9fjjj+tPf/pTZbcHAJaEhATt27dP77//fmW3Ui19++23mjhxolJSUpgfVpCioiJ1795dTz75pCTp+uuv1759+7Rs2TLFxcVVcnfVz5o1a7RixQqtXLlS1157rTIyMjRp0iSFhoYynrANoVQV17RpU/n4+Fx0F46srCyFhISUuE1ISEiZ6lG+cS7217/+VU899ZTeeecddenS5Uq2We2VdZy//PJLff3117r99tutZUVFRZJ++i1CZmamrr766ivbdDVVnvd08+bNVbduXfn4+FjLOnToIJfLpfz8fI/ThvGT8ozzn/70J40YMUL333+/JKlz587Kzc3VmDFj9Oijj8rbm2/WV4RLfRY6HI4addYAyu6XfObXJuPHj9f69eu1bds2tWjRwloeEhKi/Px8ZWdne5zhc/74hYSEXHQ3w+LxPr+mpv+Mpqen69ixY+rWrZu1rLCwUNu2bdOiRYu0adMmxrKMmjdvro4dO3os69Chg/7f//t/ks6NSVZWlpo3b27VZGVlqWvXrlbNsWPHPPZRUFCgEydOXHZMzz9GTTBlyhRNnz5dQ4cOlfTTnOSbb77RvHnzFBcXx3j+AnaOXXX/9z8z3yrO19dXERERSk1NtZYVFRUpNTVVUVFRJW4TFRXlUS9JKSkpl6xH+cZZkubPn6/HH39cycnJHt8FRsnKOs7t27fX3r17lZGRYT1++9vfql+/fsrIyFBYWJid7Vcr5XlP9+7dW1988YUV/EnS559/rubNmxNIXUJ5xvnHH3+8KHgqDgLNebdgxi/DZyEupbyf+bWFMUbjx4/X66+/rs2bN1/0tZGIiAjVrVvXY/wyMzN1+PBha/yioqK0d+9ej39spaSkyOFwWIFCbfgZveWWWy6ax3Tv3l3Dhw+3/sxYlk3v3r2VmZnpsezzzz9Xq1atJEnh4eEKCQnxGA+3260dO3Z4jGl2drbS09Otms2bN6uoqEiRkZFWzbZt23T27FmrJiUlRe3atatRXzW71JykeC7IeJafnWNX7f8fUMkXWkcprFq1yvj5+ZmkpCTz6aefmjFjxpjAwEDrLhwjRoww06dPt+o/+OADU6dOHfPXv/7VfPbZZ2b27NnV6paQlaWs4/zUU08ZX19f83//93/m6NGj1uPkyZOV9RKqhbKO84W4+17plXWsDx8+bBo2bGjGjx9vMjMzzfr1601QUJB54oknKuslVAtlHefZs2ebhg0bmtdee8189dVX5u233zZXX321+f3vf19ZL6FaOHnypNmzZ4/Zs2ePkWSeffZZs2fPHvPNN98YY4yZPn26GTFihFVffIv0KVOmmM8++8wsXry4xt4iHWV3uZ/b2mzcuHHG6XSaLVu2eMxvfvzxR6tm7NixpmXLlmbz5s1m9+7dJioqykRFRVnrCwoKTKdOnUz//v1NRkaGSU5ONs2aNTMzZsywamrrz+j5d98zhrEsq507d5o6deqYP//5z+bgwYNmxYoVpl69euZf//qXVfPUU0+ZwMBA85///Md88skn5o477jDh4eHm9OnTVs2AAQPM9ddfb3bs2GHef/9907ZtWzNs2DBrfXZ2tgkODjYjRoww+/btM6tWrTL16tUzL7zwgq2v90qLi4szv/rVr8z69evNoUOHzL///W/TtGlTM3XqVKuG8by0y81N7Bq76v7vf0KpauJvf/ubadmypfH19TU9e/Y0H374obXupptuMnFxcR71a9asMddcc43x9fU11157rdmwYYPNHVdPZRnnVq1aGUkXPWbPnm1/49VMWd/P5yOUKpuyjvX27dtNZGSk8fPzM1dddZX585//bAoKCmzuuvopyzifPXvWzJkzx1x99dXG39/fhIWFmQceeMD88MMP9jdejbz77rsl/j+3eGzj4uLMTTfddNE2Xbt2Nb6+vuaqq64yr776qu19o+r6uZ/b2qyknzNJHj8/p0+fNg888IBp1KiRqVevnrnzzjvN0aNHPfbz9ddfm1tvvdUEBASYpk2bmoceesicPXvWo6Y2/oxeGEoxlmX35ptvmk6dOhk/Pz/Tvn178+KLL3qsLyoqMn/6059McHCw8fPzM7fccovJ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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdf = susie_results.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# # Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Repeating the same steps, but filtering for only the first credible set" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total number of primary credible sets and number of unique studyIds:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of primary credible sets: 175991\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 46:====================================================> (176 + 5) / 181]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique studyIds in primary credible sets: 5328\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "first_credset = susie_results.filter(f.col(\"credibleSetIndex\") == 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------\n", + " meanTopPP | 0.6268846688460689 \n", + " minTopPP | 5.30020287265377E-4 \n", + " q1TopPP | 0.22323522754002711 \n", + " medianTopPP | 0.7547370350843897 \n", + " q3TopPP | 0.9999999999979536 \n", + " maxTopPP | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanCredSetSize | 50.48537709314681 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 3 \n", + " q3CredSetSize | 19 \n", + " maxCredSetSize | 10710 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------\n", + " meanPurityMeanR2 | 0.674055454136671 \n", + " minPurityMeanR2 | 0.00469889394266767 \n", + " q1PurityMeanR2 | 0.3980306136489271 \n", + " medianPurityMeanR2 | 0.8336824740390751 \n", + " q3PurityMeanR2 | 0.9776068324678869 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 61:=====================================================>(178 + 3) / 181]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------\n", + " meanPurityMinR2 | 0.48629879351056204 \n", + " minPurityMinR2 | 0.0 \n", + " q1PurityMinR2 | 3.997840337231423E-6 \n", + " medianPurityMinR2 | 0.5018138600363721 \n", + " q3PurityMinR2 | 0.9490123559383069 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "(\n", + " first_credset.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAASlCAYAAAB5vWpLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD6tUlEQVR4nOzde3zPBf//8ecOdnDY5rSNyzAR5ngZZkVRy7AOQhcRw1S0CSukXIhKkVOZdhWZrsihS3VlTrucusqKxsohOim62FDZWOz4/v3Rb++vjw3bzPuzw+N+u31ul8/7/fq836/Pe1x79fy8P++3g2EYhgAAAAAAAAALOdq7AQAAAAAAAFQ+hFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFJAOda4cWMNHz7c3m1UeHPnzlWTJk3k5OSk9u3b27sdU/fu3dW9e3d7tyFJiouLk4ODg3766Sd7twIAQAHMTNZgZgJQXIRSQBmR/x/1X375ZaHru3fvrtatW9/wfjZu3KgZM2bc8HYqi61bt2rSpEm6/fbbtXz5cr300kv2bumqTp48qRkzZig5ObnE2+jevbscHBzUrFmzQtcnJCTIwcFBDg4Oev/990u8n8vt3LnT3KaDg4OcnJzk7e2tAQMG6JtvvilQv379eg0cOFBNmjRR1apV1bx5cz311FM6d+5cqfQDACjbmJnKJmYmWzdjZrpRM2bMsJm5qlSposaNG+vJJ58sMEf98ccfiomJUc+ePVWvXj3VqFFDf/3rX/XGG28oNzfXPm8AFZKzvRsAUHJHjx6Vo2PxsuWNGzcqJiaGIauItm/fLkdHRy1btkwuLi72bsfG1q1bbZ6fPHlSzz//vBo3bnxDn066ubnp+++/1549e9S5c2ebdStXrpSbm5suXbpks3zo0KEaNGiQXF1dS7zfJ598Up06dVJ2dra+/vprxcbGaufOnTp48KB8fX3Nuscee0z169fXI488ooYNG+rAgQNavHixNm7cqH379snd3b3EPQAAKiZmppuPmaloM1NZ8MYbb6h69erKyMjQtm3b9Prrr2vfvn369NNPzZoff/xRY8eO1d13363o6Gh5eHhoy5YteuKJJ/T5559rxYoVdnwHqEgIpYBy7EYCAHvJyMhQtWrV7N1GkZ0+fVru7u5larj6448/VLVq1ZvW0y233KKcnBy99957NgPWpUuX9MEHHygsLEz/+te/bF7j5OQkJyenG9pvt27dNGDAAPN58+bNNWbMGL3zzjuaNGmSufz9998vcAp+YGCgwsPDtXLlSo0aNeqG+gAAVDzMTDcfM1PRZqayYMCAAapTp44k6fHHH9egQYO0Zs0am3DN19dXBw4cUKtWrczXPf744xo5cqSWL1+uv//972ratKld+kfFwtf3gHLsyusjZGdn6/nnn1ezZs3k5uam2rVrq2vXrkpISJAkDR8+XDExMZJkc+puvoyMDD311FPy8/OTq6urmjdvrldffVWGYdjs9+LFi3ryySdVp04d1ahRQ/fff7/+97//ycHBwebTxPxThA8fPqzBgwerZs2a6tq1qyTp66+/1vDhw9WkSRO5ubnJ19dXI0eO1K+//mqzr/xtfPvtt3rkkUfk6empunXr6u9//7sMw9CJEyf0wAMPyMPDQ76+vpo3b16Rjl1OTo5mzZqlW265Ra6urmrcuLGeffZZZWZmmjUODg5avny5MjIyzGMVFxd31W3mf10gKSlJt912m9zd3eXv76/Y2Fibuqtdfyn/a2w7d+4sdJt33HGHqlatqmeffdZclx/O7Ny5U506dZIkjRgxwqbf6dOnq0qVKjpz5kyBnh977DF5eXkV+BTv4Ycf1po1a5SXl2cu+/jjj/XHH3/ob3/7W4HtFPaeGjdurHvvvVeffvqpOnfuLDc3NzVp0kTvvPPOVY/h5bp16yZJ+uGHH2yWF3ZNiAcffFCSCv26HwAAzEzMTGVlZpKk//3vfxo5cqR8fHzk6uqqVq1a6e2337apycrK0rRp0xQYGChPT09Vq1ZN3bp1044dO2zqfvrpJzk4OOjVV1/Vm2++af6cOnXqpL179xa6/ysVNnPVqVPHJpDKx8yF0kYoBZQxaWlpOnv2bIFHdnb2dV87Y8YMPf/88+rRo4cWL16s5557Tg0bNtS+ffsk/fnpxj333CNJ+uc//2k+JMkwDN1///1asGCBevXqpfnz56t58+aaOHGioqOjbfYzfPhwvf766+rTp49eeeUVubu7Kyws7Kp9PfTQQ/rjjz/00ksv6dFHH5X05/fsf/zxR40YMUKvv/66Bg0apNWrV6tPnz4FBjpJGjhwoPLy8vTyyy8rKChIL7zwghYuXKh77rlHf/nLX/TKK6+oadOmevrpp/XJJ59c91iNGjVK06ZNU4cOHbRgwQLdeeedmj17tgYNGmTW/POf/1S3bt3k6upqHqs77rjjmtv9/fff1adPHwUGBmrOnDlq0KCBxowZU2DQKI5ff/1VvXv3Vvv27bVw4UL16NGjQE3Lli01c+ZMSX8OTZf3O3ToUOXk5GjNmjU2r8nKytL777+v/v37y83NzWbd4MGDderUKZthb9WqVbr77rvl7e1d5N6///57DRgwQPfcc4/mzZunmjVravjw4Tp06NB1X5s/gNasWfO6tSkpKZJkfuoHAKj4mJmYma5UHmam1NRUdenSRf/5z38UFRWlRYsWqWnTpoqIiNDChQvNuvT0dC1dulTdu3fXK6+8ohkzZujMmTMKDQ0t9FpYq1at0ty5c/X444/rhRde0E8//aR+/foV6d8DMxfsygBQJixfvtyQdM1Hq1atbF7TqFEjIzw83Hzerl07Iyws7Jr7iYyMNAr7p//hhx8akowXXnjBZvmAAQMMBwcH4/vvvzcMwzCSkpIMScb48eNt6oYPH25IMqZPn24umz59uiHJePjhhwvs748//iiw7L333jMkGZ988kmBbTz22GPmspycHKNBgwaGg4OD8fLLL5vLf//9d8Pd3d3mmBQmOTnZkGSMGjXKZvnTTz9tSDK2b99uLgsPDzeqVat2ze3lu/POOw1Jxrx588xlmZmZRvv27Q1vb28jKyvLMIz/+1kfO3bM5vU7duwwJBk7duwosM3Y2NhC93fnnXeaz/fu3WtIMpYvX16gNjg42AgKCrJZtn79+kL3l//3rGPHjkZERIRhGH8eWxcXF2PFihVmn+vWrTNfV9h7atSoUYGf5+nTpw1XV1fjqaeeKvC+3377bePMmTPGyZMnjc2bNxtNmzY1HBwcjD179hR4P1eKiIgwnJycjG+//fa6tQCA8o2ZiZmpPM9MERERRr169YyzZ8/a7GPQoEGGp6en+fPOyckxMjMzbWp+//13w8fHxxg5cqS57NixY4Yko3bt2sZvv/1mLv/oo48MScbHH39sLsv/O3L06FHjzJkzxk8//WS8/fbbhru7u1G3bl0jIyOjwPG4XGZmphEQEGD4+/sb2dnZ16wFioozpYAyJiYmRgkJCQUebdu2ve5rvby8dOjQIX333XfF3u/GjRvl5OSkJ5980mb5U089JcMwtGnTJknS5s2bJUlPPPGETd3YsWOvuu3Ro0cXWHb5xagvXbqks2fPqkuXLpJkfkp5ucuvE+Tk5KSOHTvKMAxFRESYy728vNS8eXP9+OOPV+1F+vO9SirwaeZTTz0lSYqPj7/m66/F2dlZjz/+uPncxcVFjz/+uE6fPq2kpKQSbdPV1VUjRowocU+SNGzYMH3xxRc2p2WvXLlSfn5+uvPOOwt9zeDBg7V+/Xrz00EnJyfzlO2iCggIME8Jl6S6dete9Wc0cuRI1a1bV/Xr11evXr2Ulpamf/7zn+Yp9lezatUqLVu2TE899dRV74ADAKh4mJmYma5U1mcmwzD0r3/9S/fdd58Mw7A5wy80NFRpaWnmz9TJycm8FlZeXp5+++035eTkqGPHjoX+3AcOHGhzplP+/FXYz7h58+aqW7euGjdurJEjR6pp06batGmTqlates1jExUVpcOHD2vx4sVyduby1CgdhFJAGdO5c2eFhIQUeBTldNqZM2fq3LlzuvXWW9WmTRtNnDhRX3/9dZH2+/PPP6t+/fqqUaOGzfKWLVua6/P/19HRUf7+/jZ117rQ4ZW1kvTbb79p3Lhx8vHxkbu7u+rWrWvWpaWlFahv2LChzXNPT0+5ubkVOHXY09NTv//++1V7ufw9XNmzr6+vvLy8zPdaEvXr1y9wUdJbb71VkgpcD6Go/vKXv9zwBToHDhwoV1dXrVy5UtKfx3jDhg0aMmSIzTUyLjdo0CClpaVp06ZNWrlype69994Cfz+u58qfm/TnqeGF/YymTZumhIQEffDBBxo2bJjS0tKue6ek//73v4qIiFBoaKhefPHFYvUGACjfmJmYma5U1memM2fO6Ny5c3rzzTdVt25dm0d+mHb69GmzfsWKFWrbtq153bO6desqPj6+SD/3/H8Hhf2M//WvfykhIUGrVq1Sly5dzIvUX8vcuXP11ltvadasWerTp881a4HiIN4EKpA77rhDP/zwgz766CNt3bpVS5cu1YIFCxQbG2vXO5IV9kvub3/7m3bv3q2JEyeqffv2ql69uvLy8tSrVy+bC0XmK+zOble725tRyPUVCnO1weJmu9p+c3NzC11+vSGhKGrWrKl7771XK1eu1LRp0/T+++8rMzNTjzzyyFVfU69ePXXv3l3z5s3TZ599VqK7xxTnZ9SmTRuFhIRIkvr27as//vhDjz76qLp27So/P78C9V999ZXuv/9+tW7dWu+//z6f2AEAioyZ6U/MTAXdzJkp/+f1yCOPKDw8vNCa/DP93n33XQ0fPlx9+/bVxIkT5e3tLScnJ82ePbvATWCk4v2M77jjDjOkvO+++9SmTRsNGTJESUlJhX4gGBcXp8mTJ2v06NGaOnVqofsBSoozpYAKplatWhoxYoTee+89nThxQm3btrW5u8vVfrk3atRIJ0+e1Pnz522WHzlyxFyf/795eXk6duyYTd33339f5B5///13bdu2Tc8884yef/55Pfjgg7rnnnvUpEmTIm/jRuS/hytP2U9NTdW5c+fM91oSJ0+eVEZGhs2yb7/9VtKfd/6R/u+Tq3PnztnU3cinjdL1B8Zhw4bp22+/1d69e7Vy5Ur99a9/LfSuKpcbPHiw/vvf/8rDw8PyT8VefvllXbp0qdAzoH744Qf16tVL3t7e2rhxo6pXr25pbwCA8o+Z6fqYmUp3Zqpbt65q1Kih3NzcQs/yCwkJMS+O/v7776tJkyZav369hg4dqtDQUIWEhBS4+9+Nql69uqZPn67k5GStXbu2wPqPPvpIo0aNUr9+/cw7UgKliVAKqECuvDVw9erV1bRpU5tb9uafJn3lL/c+ffooNzdXixcvtlm+YMECOTg4qHfv3pKk0NBQSdKSJUts6l5//fUi95n/Sc6Vn9xcfseRmyl/ULhyf/Pnz5eka94V53pycnL0j3/8w3yelZWlf/zjH6pbt64CAwMlSbfccosk2dzxJjc3V2+++WaJ9ytd/Webr3fv3qpTp45eeeUV7dq165qf+OUbMGCApk+friVLltzw6fDFdcstt6h///6Ki4sz7/Qi/XnXl549e8rR0VFbtmxR3bp1Le0LAFD+MTMVDTNT6c5MTk5O6t+/v/71r3/p4MGDBdafOXPGplay/dl/8cUXSkxMvG4vxTVkyBA1aNBAr7zyis3yTz75RIMGDdIdd9yhlStXXveyCkBJ8F0HoAIJCAhQ9+7dFRgYqFq1aunLL7/U+++/r6ioKLMm/5f8k08+qdDQUDk5OWnQoEG677771KNHDz333HP66aef1K5dO23dulUfffSRxo8fbw4FgYGB6t+/vxYuXKhff/1VXbp00a5du8xPtopyereHh4fuuOMOzZkzR9nZ2frLX/6irVu3Fvgk8WZp166dwsPD9eabb+rcuXO68847tWfPHq1YsUJ9+/Yt9PbBRVW/fn298sor+umnn3TrrbdqzZo1Sk5O1ptvvqkqVapIklq1aqUuXbpoypQp+u2331SrVi2tXr1aOTk5N/S+brnlFnl5eSk2NlY1atRQtWrVFBQUZF53okqVKho0aJAWL14sJycnPfzww9fdpqenp82nxlabOHGi1q5dq4ULF+rll1+WJPXq1Us//vijJk2apE8//VSffvqpWe/j42PewhsAgKthZioaZqbSn5lefvll7dixQ0FBQXr00UcVEBCg3377Tfv27dN//vMf/fbbb5Kke++9V+vXr9eDDz6osLAwHTt2TLGxsQoICNCFCxdu6P1fqUqVKho3bpwmTpyozZs3q1evXvr55591//33y8HBQQMGDNC6detsXtO2bdsi3VQAuC673PMPQAH5t7zdu3dvoesvv+1svitvb/zCCy8YnTt3Nry8vAx3d3ejRYsWxosvvmjeVtcw/ry97NixY426desaDg4ONrc6Pn/+vDFhwgSjfv36RpUqVYxmzZoZc+fONfLy8mz2m5GRYURGRhq1atUyqlevbvTt29c4evSoIcnmdsP5t509c+ZMgffzyy+/GA8++KDh5eVleHp6Gg899JBx8uTJq94i+cptXO22w4Udp8JkZ2cbzz//vOHv729UqVLF8PPzM6ZMmWJcunSpSPspTP6+v/zySyM4ONhwc3MzGjVqZCxevLhA7Q8//GCEhIQYrq6uho+Pj/Hss88aCQkJ17zdcGH7u/z2xobx5+1/AwICDGdn50Jvdbxnzx5DktGzZ89rvodrKez2xoXdsrlRo0aF3m77yr4L297lunfvbnh4eBjnzp0zDMO45i3ArzweAICKh5mJmak8z0yGYRipqalGZGSk4efnZ1SpUsXw9fU17r77buPNN980a/Ly8oyXXnrJaNSokeHq6mr89a9/NTZs2GCEh4cbjRo1MuuOHTtmSDLmzp1bYP9F/TtiGIaRlpZmeHp6mscpv/erPS7fLnAjHAyjiFe3A4BrSE5O1l//+le9++67GjJkiL3bsYvu3bvr7NmzhZ6OXVZ89dVXat++vd555x0NHTrU3u0AAFDpMDMxMwH4P3wpFECxXbx4scCyhQsXytHRUXfccYcdOkJRvfXWW6pevbr69etn71YA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WrRI8+fP19KlS4u1jWeeeUbjxo3TN998o9DQUJt1AwcO1FNPPaVWrVrp1KlTOnXqlAYOHKhRo0Zp8+bNOnXqlFm7YcMG/fHHHxo4cKDNNkaOHKnly5ebz99++22NGDGiSL3NmzdPHTt21P79+/XEE09ozJgxOnr0aKG1OTk55lDn4uJy1W3m5eXp/PnzqlWrVpF6AAAAFUdFmp1mz56td955R7GxsTp06JAmTJigRx55RLt27ZL058zToEEDrVu3TocPH9a0adP07LPPau3atTbb2bFjh3744Qft2LFDK1asUFxcnBnEXckwDP33v//VkSNHrjlvSVJaWhrzFlDKnO3dAABczs/PTwsWLJCDg4OaN2+uAwcOaMGCBXr00UeLvI3x48erX79+ha5zd3dX9erV5ezsLF9fX3P5bbfdpubNm+uf//ynJk2aJOnPr9E99NBDql69us02HnnkEU2ZMkU///yzJOmzzz7T6tWrtXPnzuv21qdPHz3xxBOSpMmTJ2vBggXasWOHmjdvbtY8/PDDcnJy0sWLF5WXl6fGjRvrb3/721W3+eqrr+rChQvXrAEAABVTRZmdMjMz9dJLL+k///mPgoODJUlNmjTRp59+qn/84x+68847VaVKFT3//PPma/z9/ZWYmKi1a9fazEE1a9bU4sWL5eTkpBYtWigsLEzbtm2zOSZLlizR0qVLlZWVpezsbLm5uenJJ5+86jHavXu31qxZo/j4+OsdTgDFwJlSAMqULl26yMHBwXweHBys7777Trm5uUXeRseOHUu071GjRpmf4qWmpmrTpk0aOXJkgbq6desqLCxMcXFxWr58ucLCwlSnTp0i7aNt27bmnx0cHOTr66vTp0/b1CxYsEDJycnatGmTAgICtHTp0qt+Krdq1So9//zzWrt2bald+wEAAJQfFWV2+v777/XHH3/onnvuUfXq1c3HO++8ox9++MGsi4mJUWBgoOrWravq1avrzTff1PHjx2221apVKzk5OZnP69WrV2DeGjJkiJKTk/XZZ5+pd+/eeu6553TbbbcV+j4PHjyoBx54QNOnT1fPnj2Ld5AAXBNnSgEoNxwcHGzuiiKpwPUBJKlatWol2v6wYcP0zDPPKDExUbt375a/v7+6detWaO3IkSMVFRUl6c/hqKiqVKli89zBwUF5eXk2y3x9fdW0aVM1bdpUy5cvV58+fXT48OECodPq1as1atQorVu3TiEhIUXuAQAAVA7laXa6cOGCJCk+Pl5/+ctfbNa5urpK+nP2efrppzVv3jwFBwerRo0amjt3rr744gub+qLMW56enmratKkkae3atWratKm6dOlSYKY6fPiw7r77bj322GOaOnXqNY8HgOIjlAJQplw5VHz++edq1qyZnJycVLduXZvrFnz33Xf6448/ir0PFxeXQj89rF27tvr27avly5crMTHxmteJ6tWrl7KysuTg4FDg2gulqXPnzgoMDNSLL75ocyHP9957TyNHjtTq1asVFhZ20/YPAADKtooyOwUEBMjV1VXHjx/XnXfeWeg2PvvsM912223mpRAk2ZxFVVLVq1fXuHHj9PTTT2v//v3mmWeHDh3SXXfdpfDwcL344os3vB8ABRFKAShTjh8/rujoaD3++OPat2+fXn/9dc2bN0+SdNddd2nx4sUKDg5Wbm6uJk+eXOCTsKJo3Lixjh07puTkZDVo0EA1atQwP4EbNWqU7r33XuXm5io8PPyq23ByctI333xj/vlmGj9+vB588EFNmjRJf/nLX7Rq1SqFh4dr0aJFCgoKUkpKiqQ/r/ng6el5U3sBAABlS0WZnWrUqKGnn35aEyZMUF5enrp27aq0tDR99tln8vDwUHh4uJo1a6Z33nlHW7Zskb+/v/75z39q79698vf3L/Z7utLjjz+uWbNm6V//+pcGDBiggwcP6q677lJoaKiio6PNeSs/7ANQOrimFIAyZdiwYbp48aI6d+6syMhIjRs3To899pikP+9c5+fnp27dumnw4MF6+umnVbVq1WLvo3///urVq5d69OihunXr6r333jPXhYSEqF69egoNDVX9+vWvuR0PDw95eHgUe//F1atXL/n7+5uf0L355pvKyclRZGSk6tWrZz7GjRt303sBAABlS0WanWbNmqW///3vmj17tlq2bKlevXopPj7eDJ0ef/xx9evXTwMHDlRQUJB+/fVXm7OmbkStWrU0bNgwzZgxQ3l5eXr//fd15swZvfvuuzbzVqdOnUplfwD+5GBc+SVjALCT7t27q3379lq4cKHderhw4YL+8pe/aPny5Ve9Cw0AAEBZwOwEoLzj63sAICkvL09nz57VvHnz5OXlpfvvv9/eLQEAAJRZzE4ASgOhFADoz+sx+Pv7q0GDBoqLi5OzM//3CAAAcDXMTgBKA1/fAwAAAAAAgOW40DkAAAAAAAAsRygFAAAAAAAAyxFKAQAAAAAAwHKEUgAAAAAAALAcoRQAAAAAAAAsRygFAAAAAAAAyxFKAQAAAAAAwHKEUgAAAAAAALAcoRQAAAAAAAAsRygFAAAAAAAAyxFKAQAAAAAAwHKEUgAAAAAAALAcoRQAAAAAAAAsRygFoEgaN26s4cOH27uNCm/u3Llq0qSJnJyc1L59e3u3AwBApcK8Y43yMu+Ul78PM2bMkIODg73bAEqEUAqohOLi4uTg4KAvv/yy0PXdu3dX69atb3g/Gzdu1IwZM254O5XF1q1bNWnSJN1+++1avny5XnrppavWrlq1SgsXLrSkr/xBJ/9RtWpVBQQEaOrUqUpPTzfr8v9e5T/c3Nx06623KioqSqmpqZb0CgBAPuadsqk4805Z9NNPP2nEiBG65ZZb5ObmJl9fX91xxx2aPn16ibZ3rb8/Fy5c0PTp09W6dWtVq1ZNtWvXVvv27TVu3DidPHnyBt4FUHY427sBAOXD0aNH5ehYvBx748aNiomJYVArou3bt8vR0VHLli2Ti4vLNWtXrVqlgwcPavz48dY0J+mNN95Q9erVdeHCBW3dulUvvviitm/frs8++8zm07mZM2fK399fly5d0qeffqo33nhDGzdu1MGDB1W1alXL+gUAoLiYd26+4sw7Zc3333+vTp06yd3dXSNHjlTjxo116tQp7du3T6+88oqef/75Ym/zan9/srOzdccdd+jIkSMKDw/X2LFjdeHCBR06dEirVq3Sgw8+qPr160uSpk6dqmeeeaY03iJgOUIpAEXi6upq7xaKLSMjQ9WqVbN3G0V2+vRpubu7l9kBbcCAAapTp44kafTo0erfv7/Wr1+vzz//XMHBwWZd79691bFjR0nSqFGjVLt2bc2fP18fffSRHn74Ybv0DgBAUTDv3HxWzDs365gsWLBAFy5cUHJysho1amSz7vTp06W6rw8//FD79+/XypUrNXjwYJt1ly5dUlZWlvnc2dlZzs78pz3KJ76+B6BIrvxOfXZ2tp5//nk1a9ZMbm5uql27trp27aqEhARJ0vDhwxUTEyNJNl/pypeRkaGnnnpKfn5+cnV1VfPmzfXqq6/KMAyb/V68eFFPPvmk6tSpoxo1auj+++/X//73Pzk4ONh8opT/FbPDhw9r8ODBqlmzprp27SpJ+vrrrzV8+HA1adLEPM165MiR+vXXX232lb+Nb7/9Vo888og8PT1Vt25d/f3vf5dhGDpx4oQeeOABeXh4yNfXV/PmzSvSscvJydGsWbN0yy23yNXVVY0bN9azzz6rzMxMs8bBwUHLly9XRkaGeazi4uIK3V737t0VHx+vn3/+2axt3Lixuf706dOKiIiQj4+P3Nzc1K5dO61YscJmGz/99JMcHBz06quvasGCBWrUqJHc3d1155136uDBg0V6X3fddZck6dixY6VSBwCAvTHvlJ15J98XX3yhPn36qGbNmqpWrZratm2rRYsWmeuHDx+u6tWr64cfflCfPn1Uo0YNDRkyRJL0/9i7+7io6rz/429u5MabGbwD5BKVTfMmSRMNMbW1WKekNspaLbfUSLNFU0lNy9DKjdI1b9Iky8JKN3OvzS1NlLC0krxBLbU0KzYtG7RLmQlKQDi/P/pxcoIUCQ83vp6Pxzy2OedzzvnMl6n57nvOnFNaWqr58+frsssuU0BAgEJCQnTvvffq5MmTHscwDEOzZs1S69at1bBhQw0YMED79+8v18uXX36p1q1blwukJCk4OLjcsvXr16tfv35q1KiRmjRpori4OI/9nu398+WXX0qSrrrqqnL7DQgIkM1mM5//+ppSI0aM8NjfmY8z30+FhYWaMWOG2rdvL39/f4WHh2vKlCkefzPgQiNOBS5iLpdL33//fbnlxcXF59x25syZSklJ0T333KMrr7xSbrdbO3fu1K5du/SnP/1J9957r44ePaqMjAy98sorHtsahqE///nPevfdd5WQkKDu3btrw4YNmjx5sr799lvNmzfPrB0xYoRef/113Xnnnerdu7c2b96suLi43+zrtttuU4cOHfTEE0+YE76MjAx99dVXGjlypEJDQ7V//34tXbpU+/fv10cffVTuwpBDhgxR586d9eSTT2rdunWaNWuWmjVrpueee07XXHONnnrqKa1YsUKTJk1Sr1691L9//7OO1T333KPly5fr1ltv1QMPPKBt27YpJSVFn332md544w1J0iuvvKKlS5dq+/bteuGFFyRJffr0qXB/Dz/8sFwul7755htzrBo3bizp50ntH//4R33xxRcaO3asIiIitHr1ao0YMUJ5eXkaP368x75efvll/fDDD0pMTNSpU6e0YMECXXPNNdq7d69CQkLO+rrKJkvNmzevljoAAC4E5jt1c75T9ppuuOEGtWrVSuPHj1doaKg+++wzrV271mNOc/r0aTkcDvXt21f/+Mc/zMsF3HvvvUpLS9PIkSN1//33KycnR4sWLdLu3bv14YcfqkGDBpKk5ORkzZo1S4MGDdKgQYO0a9cuDRw40ONsJElq27at3nnnHW3atMn80u23vPLKKxo+fLgcDoeeeuop/fjjj1qyZIn69u2r3bt3q127dmd9/5QFXy+//LKmT59+Xhcyv/feexUbG+uxLD09XStWrDDDs9LSUv35z3/WBx98oNGjR6tz587au3ev5s2bp88//1xr1qyp9PGA38UAcNF56aWXDElnfVx22WUe27Rt29YYPny4+bxbt25GXFzcWY+TmJhoVPSfmTVr1hiSjFmzZnksv/XWWw0vLy/jiy++MAzDMLKzsw1JxoQJEzzqRowYYUgyZsyYYS6bMWOGIcm4/fbbyx3vxx9/LLfsn//8pyHJ2LJlS7l9jB492lx2+vRpo3Xr1oaXl5fx5JNPmstPnjxpBAYGeoxJRfbs2WNIMu655x6P5ZMmTTIkGZs2bTKXDR8+3GjUqNFZ91cmLi7OaNu2bbnl8+fPNyQZr776qrmsqKjIiImJMRo3bmy43W7DMAwjJyfHkGQEBgYa33zzjVm7bds2Q5IxceJEc1nZuBw8eNA4fvy4kZOTYzz33HOGv7+/ERISYhQUFBiG8cv76p133jGOHz9uHDlyxHjttdeM5s2blzsOAAAXGvOduj3fOX36tBEREWG0bdvWOHnypMe60tJSj/1JMqZOnepR8/777xuSjBUrVngsT09P91h+7Ngxw8/Pz4iLi/PY70MPPWRI8njt+/btMwIDAw1JRvfu3Y3x48cba9asMedCZX744QcjKCjIGDVqlMdyp9Np2O12j+W/9f758ccfjY4dOxqSjLZt2xojRowwli1bZuTm5parLfub/pZDhw4Zdrvd+NOf/mScPn3aMAzDeOWVVwxvb2/j/fff96hNTU01JBkffvjhb+4PqE78fA+4iC1evFgZGRnlHpdffvk5tw0KCtL+/ft16NCh8z7u22+/LR8fH91///0eyx944AEZhqH169dL+vkbHUn629/+5lE3bty439z3mDFjyi0LDAw0//nUqVP6/vvv1bt3b0nSrl27ytXfc8895j/7+PioZ8+eMgxDCQkJ5vKgoCB17NhRX3311W/2Iv38WiUpKSnJY/kDDzwgSVq3bt1Ztz9fb7/9tkJDQz2u3dSgQQPdf//9ys/P1+bNmz3q4+Pj9T//8z/m8yuvvFLR0dFm32fq2LGjWrZsqYiICN17771q37691q1bV+7i5bGxsWrZsqXCw8M1dOhQNW7cWG+88YbHcQAAsArznbo539m9e7dycnI0YcIEBQUFeayr6Kyh++67z+P56tWrZbfb9ac//Unff/+9+YiKilLjxo317rvvSpLeeecdFRUVady4cR77rehmMpdddpn27Nmjv/71r/rvf/+rBQsWKD4+XiEhIXr++efNuoyMDOXl5en222/3OLaPj4+io6PNY59NYGCgtm3bpsmTJ0v6+W6SCQkJatWqlcaNG1fpn9gVFBTo5ptvVtOmTfXPf/5TPj4+5vh07txZnTp18uix7AywyvQIVAd+vgdcxK688krzgtRnatq0aYWnuZ/pscce00033aRLL71UXbt21XXXXac777yzUhO8r7/+WmFhYWrSpInH8s6dO5vry/7X29tbERERHnXt27f/zX3/ulaSTpw4oUcffVSvvfZauYtQulyucvVt2rTxeG632xUQEGBe5PvM5b++TsOvlb2GX/ccGhqqoKAg87VWl6+//lodOnQod+egX49tmQ4dOpTbx6WXXqrXX3+93PL//d//lc1mU4MGDdS6dWtdcsklFfawePFiXXrppfL19VVISIg6dux43ncyAgCgujDfqZvznbKf/3ft2vWctb6+vmrdurXHskOHDsnlclV4rSfplwuTl/X26zlRy5Yt1bRp03LbXXrppXrllVdUUlKiTz/9VGvXrtXs2bM1evRoRUREKDY21gwxf+snfmdeD+ps7Ha7Zs+erdmzZ+vrr79WZmam/vGPf2jRokWy2+2aNWvWOfcxatQoffnll9q6davHpRQOHTqkzz77TC1btqxwu+q+cDvwWwilAFRJ//799eWXX+o///mPNm7cqBdeeEHz5s1TamqqxzdvVjvzW8Iyf/nLX7R161ZNnjxZ3bt3V+PGjVVaWqrrrrtOpaWl5erLvkE61zJJ5S5U+lvO5zoAtVX//v3LTVQr8luTfwAA6hrmOz+r7fMdf3//cl+AlZaWKjg4WCtWrKhwm98KYyrLx8dHkZGRioyMVExMjAYMGKAVK1YoNjbWHO9XXnlFoaGh5batyp3y2rZtq7vvvls333yz/vCHP2jFihXnDKUWLFigf/7zn3r11VfVvXt3j3WlpaWKjIzU008/XeG24eHh590jUBWEUgCqrFmzZho5cqRGjhyp/Px89e/fXzNnzjQnab81MSm7SOQPP/zg8e3hgQMHzPVl/1taWqqcnByPb6+++OKLSvd48uRJZWZm6tFHH1VycrK5vCqn4VdF2Ws4dOiQ+c2oJOXm5iovL6/Cu7dUxtnG9pNPPlFpaanH5OzXY1umonH4/PPPPe7mBwDAxYz5zrldiPlO2RnZ+/btK3fR7spu/8477+iqq66qMMQ7s3fp57H6wx/+YC4/fvx4ubv0/ZayL+O+++47j96Dg4PP2fv5BnlNmzbVJZdccs67Jb///vuaNGmSJkyYYN6N8EyXXHKJPv74Y1177bX14stT1F38ngJAlfz6NO7GjRurffv2Hr9vb9SokSQpLy/Po3bQoEEqKSnRokWLPJbPmzdPXl5euv766yVJDodDkvTss8961D3zzDOV7rPsG79ff8M3f/78Su/j9xg0aFCFxyv7Vupsd9Y5m0aNGlV4Kv6gQYPkdDq1atUqc9np06f1zDPPqHHjxrr66qs96tesWaNvv/3WfL59+3Zt27bN/BsAAHAxY75TORdivtOjRw9FRERo/vz55ca2Mmdu/eUvf1FJSYkef/zxcutOnz5t7jM2NlYNGjTQM88847Hfisbu/fffr/CujWXX1OrYsaOkn/+mNptNTzzxRIX1x48fN//5t94/H3/8cYU/L/3666/16aefmseqyHfffae//OUv6tu3r+bMmVNhzV/+8hd9++23HtfCKvPTTz+poKDgN/cPVCfOlAJQJV26dNEf//hHRUVFqVmzZtq5c6f+9a9/aezYsWZNVFSUJOn++++Xw+GQj4+Phg4dqhtvvFEDBgzQww8/rP/+97/q1q2bNm7cqP/85z+aMGGC+e1SVFSUBg8erPnz5+v//u//zFskf/7555Iq982SzWZT//79NXv2bBUXF+t//ud/tHHjRuXk5FyAUSmvW7duGj58uJYuXaq8vDxdffXV2r59u5YvX674+HgNGDCgSvuNiorSqlWrlJSUpF69eqlx48a68cYbNXr0aD333HMaMWKEsrOz1a5dO/3rX//Shx9+qPnz55e7rkX79u3Vt29f3XfffSosLNT8+fPVvHlzTZkypTpePgAAdRrzncq5EPMdb29vLVmyRDfeeKO6d++ukSNHqlWrVjpw4ID279+vDRs2nHX7q6++Wvfee69SUlK0Z88eDRw4UA0aNNChQ4e0evVqLViwQLfeeqtatmypSZMmKSUlRTfccIMGDRqk3bt3a/369eUuW/DUU08pOztbt9xyi3ldsV27dunll19Ws2bNzIuj22w2LVmyRHfeead69OihoUOHqmXLljp8+LDWrVunq666ygwrf+v9k5GRoRkzZujPf/6zevfurcaNG+urr77Siy++qMLCQs2cOfM3X/v999+v48ePa8qUKXrttdc81l1++eW6/PLLdeedd+r111/XmDFj9O677+qqq65SSUmJDhw4oNdff10bNmzgcgywRk3d9g9AzSm7RfKOHTsqXH/11Vef8xbJs2bNMq688kojKCjICAwMNDp16mT8/e9/N4qKisya06dPG+PGjTNatmxpeHl5edyq9ocffjAmTpxohIWFGQ0aNDA6dOhgzJkzx+NWvIZhGAUFBUZiYqLRrFkzo3HjxkZ8fLxx8OBBQ5LHLYvLboV7/Pjxcq/nm2++MW6++WYjKCjIsNvtxm233WYcPXr0N2+z/Ot9/Natiysap4oUFxcbjz76qBEREWE0aNDACA8PN6ZNm2acOnWqUsepSH5+vnHHHXcYQUFB5q2Cy+Tm5hojR440WrRoYfj5+RmRkZHGSy+95LF9Tk6OIcmYM2eOMXfuXCM8PNzw9/c3+vXrZ3z88ccetWcb2zOd630FAICVmO/U/fmOYRjGBx98YPzpT38ymjRpYjRq1Mi4/PLLjWeeeabS+1u6dKkRFRVlBAYGGk2aNDEiIyONKVOmGEePHjVrSkpKjEcffdRo1aqVERgYaPzxj3809u3bV+798OGHHxqJiYlG165dDbvdbjRo0MBo06aNMWLECOPLL78sd+x3333XcDgcht1uNwICAoxLLrnEGDFihLFz506z5rfeP1999ZWRnJxs9O7d2wgODjZ8fX2Nli1bGnFxccamTZs8jlP2Ny1z9dVXG5IqfJz5XigqKjKeeuop47LLLjP8/f2Npk2bGlFRUcajjz5quFyuc/9xgGrgZRiVvGodANQSe/bs0RVXXKFXX321wt/I49z++9//KiIiQnPmzNGkSZNquh0AAPArzHcAXAy4phSAWu2nn34qt2z+/Pny9vZW//79a6AjAACA6sV8B8DFimtKAajVZs+erezsbA0YMEC+vr5av3691q9fr9GjR3OrWgAAUC8w3wFwsSKUAlCr9enTRxkZGXr88ceVn5+vNm3aaObMmXr44YdrujUAAIBqwXwHwMWKa0oBAAAAAADAclxTCgAAAAAAAJYjlAIAAAAAAIDluKZUNSktLdXRo0fVpEkTeXl51XQ7AACgCgzD0A8//KCwsDB5e/PdXU1gTgUAQN1X2TkVoVQ1OXr0KHfGAACgnjhy5Ihat25d021clJhTAQBQf5xrTkUoVU2aNGki6ecBt9lsNdwNAACoCrfbrfDwcPNzHdZjTgUAQN1X2TkVoVQ1KTu93GazMYECAKCO42djNYc5FQAA9ce55lRcLAEAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACW863pBgAAwMUpIW1HlbddNqJXNXaCiwnvOwAAag/OlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWK5GQ6l27drJy8ur3CMxMVGSdOrUKSUmJqp58+Zq3LixBg8erNzcXI99HD58WHFxcWrYsKGCg4M1efJknT592qPmvffeU48ePeTv76/27dsrLS2tXC+LFy9Wu3btFBAQoOjoaG3fvv2CvW4AAIDK2rJli2688UaFhYXJy8tLa9asKVfz2Wef6c9//rPsdrsaNWqkXr166fDhw+Z65lQAAKA2qtFQaseOHfruu+/MR0ZGhiTptttukyRNnDhRb731llavXq3Nmzfr6NGjuuWWW8ztS0pKFBcXp6KiIm3dulXLly9XWlqakpOTzZqcnBzFxcVpwIAB2rNnjyZMmKB77rlHGzZsMGtWrVqlpKQkzZgxQ7t27VK3bt3kcDh07Ngxi0YCAACgYgUFBerWrZsWL15c4fovv/xSffv2VadOnfTee+/pk08+0SOPPKKAgACzhjkVAACojbwMwzBquokyEyZM0Nq1a3Xo0CG53W61bNlSK1eu1K233ipJOnDggDp37qysrCz17t1b69ev1w033KCjR48qJCREkpSamqoHH3xQx48fl5+fnx588EGtW7dO+/btM48zdOhQ5eXlKT09XZIUHR2tXr16adGiRZKk0tJShYeHa9y4cZo6dWqFvRYWFqqwsNB87na7FR4eLpfLJZvNdkHGBwCA+iQhbUeVt102olc1dvILt9stu91eaz/Pvby89MYbbyg+Pt5cNnToUDVo0ECvvPJKhdu4XC7mVGeoje87AADqm8rOqWrNNaWKior06quv6u6775aXl5eys7NVXFys2NhYs6ZTp05q06aNsrKyJElZWVmKjIw0J0+S5HA45Ha7tX//frPmzH2U1ZTto6ioSNnZ2R413t7eio2NNWsqkpKSIrvdbj7Cw8N//yAAAACch9LSUq1bt06XXnqpHA6HgoODFR0d7fETP+ZUAACgtqo1odSaNWuUl5enESNGSJKcTqf8/PwUFBTkURcSEiKn02nWnDl5Kltftu5sNW63Wz/99JO+//57lZSUVFhTto+KTJs2TS6Xy3wcOXLkvF8zAADA73Hs2DHl5+frySef1HXXXaeNGzfq5ptv1i233KLNmzdLYk4FAABqL9+abqDMsmXLdP311yssLKymW6kUf39/+fv713QbAADgIlZaWipJuummmzRx4kRJUvfu3bV161alpqbq6quvrsn2KoU5FQAAF69acabU119/rXfeeUf33HOPuSw0NFRFRUXKy8vzqM3NzVVoaKhZ8+s7x5Q9P1eNzWZTYGCgWrRoIR8fnwpryvYBAABQG7Vo0UK+vr7q0qWLx/LOnTubd99jTgUAAGqr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aNAgffPNNwoLC9OSJUv08MMPy+l0ys/Pzzz2mjVrdODAAUnSkCFDVFBQoLVr15rH7927t7p3767U1NRKvZ4L/Teoje87AADqm8p+nnOmFAAAQB325ptvqmfPnrrtttsUHBysK664Qs8//7y5PicnR06nU7GxseYyu92u6OhoZWVlSZKysrIUFBRkBlKSFBsbK29vb23bts2s6d+/vxlISZLD4dDBgwd18uRJs+bM45TVlB2nIoWFhXK73R4PAABwcSCUAgAAqMO++uorLVmyRB06dNCGDRt033336f7779fy5cslSU6nU5IUEhLisV1ISIi5zul0Kjg42GO9r6+vmjVr5lFT0T7OPMZv1ZStr0hKSorsdrv5CA8PP6/XDwAA6i5CKQAAgDqstLRUPXr00BNPPKErrrhCo0eP1qhRoyr9c7maNm3aNLlcLvNx5MiRmm4JAABYhFAKAACgDmvVqpW6dOnisaxz5846fPiwJCk0NFSSlJub61GTm5trrgsNDdWxY8c81p8+fVonTpzwqKloH2ce47dqytZXxN/fXzabzeMBAAAuDoRSAAAAddhVV12lgwcPeiz7/PPP1bZtW0lSRESEQkNDlZmZaa53u93atm2bYmJiJEkxMTHKy8tTdna2WbNp0yaVlpYqOjrarNmyZYuKi4vNmoyMDHXs2NG8019MTIzHccpqyo4DAABwJkIpAACAOmzixIn66KOP9MQTT+iLL77QypUrtXTpUiUmJkqSvLy8NGHCBM2aNUtvvvmm9u7dq7vuukthYWGKj4+X9POZVdddd51GjRql7du368MPP9TYsWM1dOhQhYWFSZLuuOMO+fn5KSEhQfv379eqVau0YMECJSUlmb2MHz9e6enpmjt3rg4cOKCZM2dq586dGjt2rOXjAgAAaj/fmm4AAAAAVderVy+98cYbmjZtmh577DFFRERo/vz5GjZsmFkzZcoUFRQUaPTo0crLy1Pfvn2Vnp6ugIAAs2bFihUaO3asrr32Wnl7e2vw4MFauHChud5ut2vjxo1KTExUVFSUWrRooeTkZI0ePdqs6dOnj1auXKnp06froYceUocOHbRmzRp17drVmsEAAAB1ipdhGEZNN1EfuN1u2e12uVwuroUAAEAlJKTtqPK2y0b0qsZOfsHnec270H+D2vi+AwCgvqns5zk/3wMAAAAAAIDlCKUA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdf = first_credset.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# # Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Filtering credible sets with qc function" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 13:49:35 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of high quality credible sets: 220670\n", + "Number of unique studyIds in high quality credible sets: 4862\n" + ] + } + ], + "source": [ + "qc_credsets = SUSIE_inf.credible_set_qc(\n", + " susie_fm, study_index, ld_index, 1e-5, 0.25, 0.8\n", + ").persist()\n", + "\n", + "qc_credsets = (\n", + " qc_credsets.df.withColumn(\"credSetSize\", f.size(\"locus\"))\n", + " .withColumn(\n", + " \"locus\",\n", + " f.slice(order_array_of_structs_by_field(\"locus\", \"posteriorProbability\"), 1, 1)[\n", + " 0\n", + " ],\n", + " )\n", + " .withColumn(\"topPP\", f.col(\"locus\").getField(\"posteriorProbability\"))\n", + " .filter(~f.isnan(\"topPP\"))\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------\n", + " meanTopPP | 0.7351960328222914 \n", + " minTopPP | 0.002487989359821... \n", + " q1TopPP | 0.4347870006604458 \n", + " medianTopPP | 0.9884991069860085 \n", + " q3TopPP | 0.9999999989221352 \n", + " maxTopPP | 1.0 \n", + "\n", + "-RECORD 0------------------------------\n", + " meanCredSetSize | 11.30863667991574 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 2 \n", + " q3CredSetSize | 8 \n", + " maxCredSetSize | 2681 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------------\n", + " meanPurityMeanR2 | 0.9362013839231683 \n", + " minPurityMeanR2 | 0.50525100583065 \n", + " q1PurityMeanR2 | 0.8961545002734692 \n", + " medianPurityMeanR2 | 0.991509701456222 \n", + " q3PurityMeanR2 | 1.0 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 192:==================================================> (191 + 8) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------------\n", + " meanPurityMinR2 | 0.8346683610862959 \n", + " minPurityMinR2 | 0.25001241379266637 \n", + " q1PurityMinR2 | 0.6919444964125268 \n", + " medianPurityMinR2 | 0.9832675585945014 \n", + " q3PurityMinR2 | 1.0 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "(\n", + " qc_credsets.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAASlCAYAAAB5vWpLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAADrOUlEQVR4nOzde3yP9f/H8ednYwfs4LhZFnPIOSvHyTHLRAeiHzm0MYe+mQj5knKILORUZCmZikhJfZEshxRyGHIKJUWxUdgymdmu3x/ddvGxYZu5Pjs87rfb5/btc13vz3W9ruuzvp9Xz8/1eV82wzAMAQAAAAAAABZycnQBAAAAAAAAKHwIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpYACqlKlSgoLC3N0GQXe1KlTVblyZTk7OyswMNDR5ZhatWqlVq1aOboMSVJ0dLRsNpt+/fVXR5cCAAA9kkXokQBkBaEUkA+k/0f9zp07M13fqlUr1alT57b3s3r1ao0bN+62t1NYrF27ViNGjNADDzygBQsWaNKkSY4u6YZOnjypcePGac+ePTneRqtWrWSz2VStWrVM18fExMhms8lms+mTTz7J8X6utXHjRnObNptNzs7OKleunLp06aIff/wxw/jly5era9euqly5sooVK6bq1atr2LBhOn/+fK7UAwDIW+iR8iZ6JHt3oke6XePGjbPrsYoWLapKlSrpueeey9A3Xbx4UXPmzFHbtm1Vvnx5eXh46L777tPcuXOVmprqmANAgVHE0QUAuDMOHz4sJ6fs5c6rV6/WnDlzaLqyaP369XJyctL8+fPl4uLi6HLsrF271u75yZMnNX78eFWqVOm2vq10c3PTzz//rO3bt6tRo0Z26xYtWiQ3NzddunTJbnmvXr3UrVs3ubq65ni/zz33nBo2bKiUlBTt3btXUVFR2rhxo/bv3y9fX19zXP/+/eXn56eePXvq7rvv1r59+zR79mytXr1au3btkru7e45rAAAUDPRIdx49UtZ6pLxg7ty5KlGihJKSkrRu3Tq9+eab2rVrl7777jtzzC+//KJBgwapTZs2Gjp0qDw9PfXVV1/p2Wef1ffff6+FCxc68AiQ3xFKAQXU7QQAjpKUlKTixYs7uowsO336tNzd3fNUs3Xx4kUVK1bsjtVUpUoVXblyRR999JFdw3Xp0iV99tln6tChgz799FO71zg7O8vZ2fm29tu8eXN16dLFfF69enX95z//0fvvv68RI0aYyz/55JMMl+TXr19foaGhWrRokfr27XtbdQAA8j96pDuPHilrPVJe0KVLF5UpU0aSNGDAAHXr1k1Lly61C9d8fX21b98+1a5d23zdgAED1KdPHy1YsEAvv/yyqlat6pD6kf/x8z2ggLp+voSUlBSNHz9e1apVk5ubm0qXLq1mzZopJiZGkhQWFqY5c+ZIkt2lvOmSkpI0bNgw+fv7y9XVVdWrV9frr78uwzDs9vvPP//oueeeU5kyZeTh4aHHHntMf/zxh2w2m923i+mXDB88eFDdu3dXyZIl1axZM0nS3r17FRYWpsqVK8vNzU2+vr7q06eP/vrrL7t9pW/jyJEj6tmzp7y8vFS2bFm9/PLLMgxDJ06c0OOPPy5PT0/5+vpq2rRpWTp3V65c0YQJE1SlShW5urqqUqVKevHFF5WcnGyOsdlsWrBggZKSksxzFR0dfcNtpv98IDY2Vk2bNpW7u7sCAgIUFRVlN+5G8y+l/4xt48aNmW6zRYsWKlasmF588UVzXXo4s3HjRjVs2FCS1Lt3b7t6x44dq6JFi+rMmTMZau7fv7+8vb0zfKv31FNPaenSpUpLSzOX/e9//9PFixf1f//3fxm2k9kxVapUSY888oi+++47NWrUSG5ubqpcubLef//9G57DazVv3lySdPToUbvlmc0R0alTJ0nK9Od+AIDChx6JHimv9EiS9Mcff6hPnz7y8fGRq6urateurffee89uzOXLlzVmzBjVr19fXl5eKl68uJo3b64NGzbYjfv1119ls9n0+uuva968eeb71LBhQ+3YsSPT/V8vsx6rTJkydoFUOnos5AZCKSAfSUhI0J9//pnhkZKScsvXjhs3TuPHj1fr1q01e/ZsjR49Wnfffbd27dol6d9vOx566CFJ0gcffGA+JMkwDD322GOaMWOG2rVrp+nTp6t69ep64YUXNHToULv9hIWF6c0331T79u01efJkubu7q0OHDjes68knn9TFixc1adIk9evXT9K/v7v/5Zdf1Lt3b7355pvq1q2blixZovbt22do8CSpa9euSktL02uvvabGjRtr4sSJmjlzph566CHdddddmjx5sqpWrarhw4dr06ZNtzxXffv21ZgxY3T//fdrxowZatmypSIjI9WtWzdzzAcffKDmzZvL1dXVPFctWrS46XbPnTun9u3bq379+poyZYoqVKig//znPxkaj+z466+/9PDDDyswMFAzZ85U69atM4ypWbOmXnnlFUn/NlHX1turVy9duXJFS5cutXvN5cuX9cknn6hz585yc3OzW9e9e3edOnXKrvlbvHix2rRpo3LlymW59p9//lldunTRQw89pGnTpqlkyZIKCwvTgQMHbvna9Ia0ZMmStxwbFxcnSea3gACAgoceiR7pevmhR4qPj1eTJk309ddfKyIiQrNmzVLVqlUVHh6umTNnmuMSExP17rvvqlWrVpo8ebLGjRunM2fOKCQkJNO5sBYvXqypU6dqwIABmjhxon799Vc98cQTWfr3gR4LljMA5HkLFiwwJN30Ubt2bbvXVKxY0QgNDTWf16tXz+jQocNN9zNw4EAjs/9bWLFihSHJmDhxot3yLl26GDabzfj5558NwzCM2NhYQ5IxZMgQu3FhYWGGJGPs2LHmsrFjxxqSjKeeeirD/i5evJhh2UcffWRIMjZt2pRhG/379zeXXblyxahQoYJhs9mM1157zVx+7tw5w93d3e6cZGbPnj2GJKNv3752y4cPH25IMtavX28uCw0NNYoXL37T7aVr2bKlIcmYNm2auSw5OdkIDAw0ypUrZ1y+fNkwjKvv9bFjx+xev2HDBkOSsWHDhgzbjIqKynR/LVu2NJ/v2LHDkGQsWLAgw9igoCCjcePGdsuWL1+e6f7S/84aNGhghIeHG4bx77l1cXExFi5caNa5bNky83WZHVPFihUzvJ+nT582XF1djWHDhmU47vfee884c+aMcfLkSWPNmjVG1apVDZvNZmzfvj3D8VwvPDzccHZ2No4cOXLLsQCA/IUeiR4pP/dI4eHhRvny5Y0///zTbh/dunUzvLy8zPf7ypUrRnJyst2Yc+fOGT4+PkafPn3MZceOHTMkGaVLlzbOnj1rLv/8888NScb//vc/c1n638jhw4eNM2fOGL/++qvx3nvvGe7u7kbZsmWNpKSkDOfjWsnJyUatWrWMgIAAIyUl5aZjgZvhSikgH5kzZ45iYmIyPO69995bvtbb21sHDhzQTz/9lO39rl69Ws7Oznruuefslg8b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AABAYZSjOaW++OILu+eGYejUqVOaPXu2HnjggVwpDAAAoKChhwIAALgqR6FUx44d7Z7bbDaVLVtWDz74oKZNm5YbdQEAABQ49FAAAABX5SiUSktLy+06AAAACjx6KAAAgKtydU4pAAAAAAAAICtydKXU0KFDszx2+vTpOdkFAABAgUMPBQAAcFWOQqndu3dr9+7dSklJUfXq1SVJR44ckbOzs+6//35znM1my50qAQAACgB6KAAAgKtyFEo9+uij8vDw0MKFC1WyZElJ0rlz59S7d281b95cw4YNy9UiAQAACgJ6KAAAgKtyNKfUtGnTFBkZaTZTklSyZElNnDiRO8cAAADcAD0UAADAVTkKpRITE3XmzJkMy8+cOaO///77tosCAAAoiOihAAAArspRKNWpUyf17t1by5cv1++//67ff/9dn376qcLDw/XEE0/kdo0AAAAFAj0UAADAVTmaUyoqKkrDhw9X9+7dlZKS8u+GihRReHi4pk6dmqsFAgAAFBT0UAAAAFflKJQqVqyY3nrrLU2dOlVHjx6VJFWpUkXFixfP1eIAAAAKEnooAACAq3L08710p06d0qlTp1StWjUVL15chmHkVl0AAAAFFj0UAABADkOpv/76S23atNE999yj9u3b69SpU5Kk8PBwbmUMAABwA/RQAAAAV+UolHr++edVtGhRHT9+XMWKFTOXd+3aVWvWrMm14gAAAAoSeigAAICrcjSn1Nq1a/XVV1+pQoUKdsurVaum3377LVcKAwAAKGjooQAAAK7K0ZVSSUlJdt/upTt79qxcXV1vuygAAICCiB4KAADgqhyFUs2bN9f7779vPrfZbEpLS9OUKVPUunXrXCsOAACgIKGHAgAAuCpHP9+bMmWK2rRpo507d+ry5csaMWKEDhw4oLNnz2rz5s25XSMAAECBQA8FAABwVY6ulKpTp46OHDmiZs2a6fHHH1dSUpKeeOIJ7d69W1WqVMntGgEAAAoEeigAAICrsn2lVEpKitq1a6eoqCiNHj36TtQEAABQ4NBDAQAA2Mv2lVJFixbV3r1770QtAAAABRY9FAAAgL0c/XyvZ8+emj9/fm7XAgAAUKDRQwEAAFyVo4nOr1y5ovfee09ff/216tevr+LFi9utnz59eq4UBwAAUJDQQwEAAFyVrVDql19+UaVKlbR//37df//9kqQjR47Y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HR2tPn366JFHHrHbdkpKisqVK6f58+eby+6//375+/tr+fLl5rLly5fr7rvv1n333ZfheK79+V6lSpU0adIk9enTRx4eHrr77rs1b968DOfB29tbvr6+uueeezRhwgRduXJFGzZsMNfPnDlTI0aMUMOGDVWtWjVNmjRJ1apV0//+978sn2sAAJC/FLQ+KS0tTZGRkQoICJC7u7vq1aunTz75xFyfmpqq8PBwc3316tUzXL0UFhamjh076vXXX1f58uVVunRpDRw4UCkpKXbjihUrJl9fX1WsWFG9e/fWvffeq5iYGHN9nz59NGvWLLVs2VKVK1dWz5491bt3b7vjAJBzhFIA8o2FCxeqSJEi2r59u2bNmqXp06fr3XffzdY2Ro4cqcGDB+vHH39USEiI3bquXbtq2LBhql27tk6dOqVTp06pa9eu6tu3r9asWaNTp06ZY1euXKmLFy+qa9eudtvo06ePFixYYD5/77331Lt37yzVNm3aNDVo0EC7d+/Ws88+q//85z86fPhwpmOvXLliNnouLi433GZaWpr+/vtvlSpVKks1AACA/Kkg9UmRkZF6//33FRUVpQMHDuj5559Xz5499c0330j6t7+pUKGCli1bpoMHD2rMmDF68cUX9fHHH9ttZ8OGDTp69Kg2bNighQsXKjo62gzirmcYhr799lsdOnTopr2VJCUkJNBbAbmkiKMLAICs8vf314wZM2Sz2VS9enXt27dPM2bMUL9+/bK8jSFDhuiJJ57IdJ27u7tKlCihIkWKyNfX11zetGlTVa9eXR988IFGjBgh6d+f0T355JMqUaKE3TZ69uypUaNG6bfffpMkbd68WUuWLNHGjRtvWVv79u317LPPSpL++9//asaMGdqwYYOqV69ujnnqqafk7Oysf/75R2lpaapUqZL+7//+74bbfP3113XhwoWbjgEAAPlfQemTkpOTNWnSJH399dcKCgqSJFWuXFnfffed3n77bbVs2VJFixbV+PHjzdcEBARo69at+vjjj+16npIlS2r27NlydnZWjRo11KFDB61bt87unLz11lt69913dfnyZaWkpMjNzU3PPffcDc/Rli1btHTpUq1atepWpxNAFnClFIB8o0mTJrLZbObzoKAg/fTTT0pNTc3yNho0aJCjffft29f8Zi8+Pl5ffvml+vTpk2Fc2bJl1aFDB0VH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kydr0aJFGj58uBo2bKgWLVrc9Fz17dtXCxcuVJcuXTRs2DBt27ZNkZGR+vHHH/XZZ59Jkj744APNmzdP27dv17vvvitJatq0aabbGz16tBISEvT777+b56pEiRKS/m10W7VqpZ9//lkREREKCAjQsmXLFBYWpvPnz2vw4MF223r//ff1999/a+DAgbp06ZJmzZqlBx98UPv27ZOPj89Njyu9gSpdunSujAMA4HbR2+TP3ib9mB555BGVL19egwcPlq+vr3788UetXLnSrn+5cuWKQkJC1KxZM73++uvm1AADBgxQdHS0evfureeee07Hjh3T7NmztXv3bm3evFlFixaVJI0ZM0YTJ05U+/bt1b59e+3atUtt27a1uxpJkipWrKivv/5a69evN79gu5EPPvhAoaGhCgkJ0eTJk3Xx4kXNnTtXzZo10+7du1WpUqWb/v2kB1/vv/++XnrppWxNZD5gwAAFBwfbLVuzZo0WLVpkhmdpaWl67LHH9N1336l///6qWbOm9u3bpxkzZujIkSNasWJFlvcH5IgBANdYsGCBIemmj9q1a9u9pmLFikZoaKj5vF69ekaHDh1uup+BAwcamf1f0IoVKwxJxsSJE+2Wd+nSxbDZbMbPP/9sGIZhxMbGGpKMIUOG2I0LCwszJBljx441l40dO9aQZDz11FMZ9nfx4sUMyz766CNDkrFp06YM2+jfv7+57MqVK0aFChUMm81mvPbaa+byc+fOGe7u7nbnJDN79uwxJBl9+/a1Wz58+HBDkrF+/XpzWWhoqFG8ePGbbi9dhw4djIoVK2ZYPnPmTEOS8eGHH5rLLl++bAQFBRklSpQwEhMTDcMwjGPHjhmSDHd3d+P33383x27bts2QZDz//PPmsvTzcvjwYePMmTPGsWPHjLfffttwdXU1fHx8jKSkJMMwrv5dff3118aZM2eMEydOGEuWLDFKly6dYT8AAOQmepv83dtcuXLFCAgIMCpWrGicO3fObl1aWprd9iQZI0eOtBvz7bffGpKMRYsW2S1fs2aN3fLTp08bLi4uRocOHey2++KLLxqS7I59//79hru7uyHJCAwMNAYPHmysWLHC7HvS/f3334a3t7fRr18/u+VxcXGGl5eX3fIb/f1cvHjRqF69uiHJqFixohEWFmbMnz/fiI+PzzA2/T29kZ9++snw8vIyHnroIePKlSuGYRjGBx98YDg5ORnffvut3dioqChDkrF58+Ybbg/IDfx8D0Cm5syZo5iYmAyPe++995av9fb21oEDB/TTTz9le7+rV6+Ws7OznnvuObvlw4YNk2EY+vLLLyX9+y2PJD377LN24wYNGnTDbT/zzDMZlrm7u5v/fOnSJf35559q0qSJJGnXrl0Zxvft29f8Z2dnZzVo0ECGYSg8PNxc7u3trerVq+uXX365YS3Sv8cqSUOHDrVbPmzYMEnSqlWrbvr67Fq9erV8fX3t5m4qWrSonnvuOV24cEHffPON3fiOHTvqrrvuMp83atRIjRs3Nuu+VvXq1VW2bFkFBARowIABqlq1qlatWpVh8vLg4GCVLVtW/v7+6tatm0qUKKHPPvvMbj8AANwJ9Db5s7fZvXu3jh07piFDhsjb29tuXWZXDf3nP/+xe75s2TJ5eXnpoYce0p9//mk+6tevrxIlSmjDhg2SpK+//lqXL1/WoEGD7Lab2Y1jateurT179qhnz5769ddfNWvWLHXs2FE+Pj565513zHExMTE6f/68nnrqKbt9Ozs7q3Hjxua+b8bd3V3btm3TCy+8IOnfu0mGh4erfPnyGjRoUJZ/YpeUlKROnTqpZMmS+uijj+Ts7Gyen5o1a6pGjRp2NaZfAZaVGoHbwc/3AGSqUaNG5oTU1ypZsmSml75f65VXXtHjjz+ue+65R3Xq1FG7du3Uq1evLDV9v/32m/z8/OTh4WG3vGbNmub69P91cnL6//buPK6Kev/j+BtUFheOK9sVldxN3NCQ3K/8xCXLspualRpJC5RKpVmGW6Xh1bQ0bTGxm16Xe8tKjSRMrSQXlFxSUqOsq6ilcpIUEeb3Rw9Gj2AiwbC9no/HeeSZ+cycz/l2cL6+mTMjf39/h7omTZpcc99X10rS6dOnNXXqVK1YsSLPhSnT09Pz1Ddo0MDhuc1mk5ubm3mR7yuXX33thqvlvoere/b29lbNmjXN91pUfvzxRzVt2jTP3YSuHttcTZs2zbOPZs2aadWqVXmW//e//5WHh4eqVKmi+vXrq3Hjxvn2sGDBAjVr1kyVK1eWl5eXmjdvfsN3NwIAoDCY25TNuU3uV/1bt2593drKlSurfv36DssOHTqk9PT0fK/1JF2+MHlub1fPf+rVq6datWrl2a5Zs2b617/+pezsbH377bdau3atYmJiFB4eLn9/f4WEhJgh5rW+4nfl9aD+jM1mU0xMjGJiYvTjjz8qISFB//znPzV//nzZbDa98MIL193H6NGjdeTIEW3dutXhsgmHDh3SgQMHVK9evXy3K+oLtwNXI5QCUOS6d++uI0eO6MMPP9SGDRv09ttv65VXXtGiRYscfhtntSt/c5jrnnvu0datW/X000+rXbt2ql69unJyctS3b1/l5OTkqc/9rdL1lknKc/HSa7mRawOUVt27d88zec3Ptf5BAABAacbc5g+lfW7j6uqa55ddOTk58vT01LJly/Ld5lphTEFVqlRJAQEBCggIUHBwsHr16qVly5YpJCTEHO9//etf8vb2zrNtYe6U17BhQz344IO68847ddNNN2nZsmXXDaXmzZunf//733rvvffUrl07h3U5OTkKCAjQnDlz8t3Wz8/vhnsEbgShFIBiUbt2bY0aNUqjRo3SuXPn1L17d02ZMsWcuF1rspJ74cjffvvN4TeKBw8eNNfn/jcnJ0epqakOv9E6fPhwgXs8c+aMEhISNHXqVEVHR5vLC3NqfmHkvodDhw6Zvy2VpBMnTujs2bP53tGlIP5sbPfs2aOcnByHCdvVY5srv3H47rvvHO7mBwBARcHc5vqKY26Te/b1vn378ly0u6Dbf/bZZ+rSpUu+Id6VvUt/jNVNN91kLj916lSeu/RdS+4v3o4fP+7Qu6en53V7v9Egr1atWmrcuPF174z8xRdf6KmnntLYsWPNuxFeqXHjxvrmm2/Uu3fvcvGLUpQ9fGcCQJG7+tTu6tWrq0mTJg7fea9WrZok6ezZsw61/fv3V3Z2tubPn++w/JVXXpGTk5P69esnSQoNDZUkvf766w51r732WoH7zP0t4NW/9Zs7d26B9/FX9O/fP9/Xy/1N1Z/dbefPVKtWLd/T8/v376+0tDStXLnSXHbp0iW99tprql69unr06OFQv2bNGv3vf/8zn2/fvl3btm0z/x8AAFBRMLcpmOKY23To0EH+/v6aO3dunrEtyJlb99xzj7KzszV9+vQ86y5dumTuMyQkRFWqVNFrr73msN/8xu6LL77I966NudfUat68uaQ//p96eHjopZdeyrf+1KlT5p+v9fn55ptv8v166Y8//qhvv/3WfK38HD9+XPfcc4+6du2qWbNm5Vtzzz336H//+5/DtbBynT9/XhkZGdfcP1AUOFMKQJFr1aqVevbsqcDAQNWuXVs7d+7Uf/7zH0VGRpo1gYGBkqQnnnhCoaGhqlSpkoYOHaqBAweqV69eeu655/TDDz+obdu22rBhgz788EONHTvW/I1TYGCgBg8erLlz5+rXX381b5v83XffSSrYb5s8PDzUvXt3xcTEKCsrS3/729+0YcMGpaamFsOo5NW2bVuNGDFCb775ps6ePasePXpo+/btWrp0qQYNGqRevXoVar+BgYFauXKloqKi1KlTJ1WvXl0DBw5UeHi43njjDY0cOVJJSUlq1KiR/vOf/+irr77S3Llz81zrokmTJurataseffRRZWZmau7cuapTp47Gjx9fFG8fAIAyg7lNwRTH3MbZ2VkLFy7UwIED1a5dO40aNUo+Pj46ePCg9u/fr08//fRPt+/Ro4cefvhhzZgxQ8nJyerTp4+qVKmiQ4cOafXq1Zo3b57uvvtu1atXT0899ZRmzJih2267Tf3799fu3bv1ySef5LlEwcsvv6ykpCTddddd5nXFdu3apXfffVe1a9c2L47u4eGhhQsX6v7771eHDh00dOhQ1atXT0ePHtW6devUpUsXM6y81ucnPj5ekydP1u23367OnTurevXq+v777/XOO+8oMzNTU6ZMueZ7f+KJJ3Tq1CmNHz9eK1ascFjXpk0btWnTRvfff79WrVqlRx55RJ9//rm6dOmi7OxsHTx4UKtWrdKnn37KpRdQvErqtn8ASqfc2ybv2LEj3/U9evS47m2TX3jhBeOWW24xatasabi7uxstWrQwXnzxRePixYtmzaVLl4zHH3/cqFevnuHk5ORw+9rffvvNGDdunOHr62tUqVLFaNq0qTFr1iyH2/MahmFkZGQYERERRu3atY3q1asbgwYNMlJSUgxJDrcxzr097qlTp/K8n59//tm48847jZo1axo2m834xz/+YRw7duyat16+eh/Xup1xfuOUn6ysLGPq1KmGv7+/UaVKFcPPz8+YOHGiceHChQK9Tn7OnTtn3HvvvUbNmjXN2wfnOnHihDFq1Cijbt26houLixEQEGAsWbLEYfvU1FRDkjFr1ixj9uzZhp+fn+Hq6mp069bN+Oabbxxq/2xsr3S9zxUAAMWFuU3Zn9sYhmF8+eWXxv/93/8ZNWrUMKpVq2a0adPGeO211wq8vzfffNMIDAw03N3djRo1ahgBAQHG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lJaWZl7M85lnntGaNWt08OBBSdKQIUOUkZGhtWvXmr107txZ7dq106JFiwr0fux2u2w2m9LT0+Xh4VEkYwQAQHkSFruj0NsuHtmpCDu5rDQev8+dO2ee9dS+fXvNmTNHvXr1Uu3atVW7dm1NnTpVgwcPlre3t44cOaLx48frt99+0969e82vxvXr108nTpzQokWLlJWVpVGjRqljx45avny5pD/mVM2bN1efPn00YcIE7du3Tw8++KBeeeUV85d7W7duVY8ePTRz5kwNGDBAK1as0EsvvaRdu3apdevWkv74JePMmTO1dOlS+fv76/nnn9eePXv07bffys3N7brvtbjHvzR+5gAAKOsKevwu1WdK3XrrrUpISNB3330nSfrmm2/05ZdfmrdALsgdXay6u0x+MjMzZbfbHR4AAAB/1c6dO9W+fXu1b99ekhQVFaX27dsrOjpalSpV0p49e3T77berWbNmCgsLU2BgoL744guHazUtW7ZMLVq0UO/evdW/f3917drV4Sxxm82mDRs2KDU1VYGBgXryyScVHR3tcLb5rbfequXLl+vNN99U27Zt9Z///Edr1qwxAylJGj9+vB5//HGFh4erU6dOOnfunOLi4goUSAEAgPKtVF/o/JlnnpHdbleLFi1UqVIlZWdn68UXX9Tw4cMlFeyOLgW9u4y/v3+efeSuq1Wr1nXvLpOfGTNmaOrUqTf6tgEAAP5Uz5499Wcnu3/66afX3Uft2rXNs6KupU2bNvriiy/+tOYf//iH/vGPf1xzvZOTk6ZNm6Zp06ZdtycAAFCxlOozpVatWqVly5Zp+fLl2rVrl5YuXap//vOfWrp0aUm3ViDc0hgAAAAAACB/pfpMqaefflrPPPOMeVvjgIAA/fjjj5oxY4ZGjBjhcEeX3At35j5v166dJOvuLpMfbmkMAAAAAACQv1J9ptTvv/8uZ2fHFitVqqScnBxJBbuji1V3lwEAAAAAAEDBlepQauDAgXrxxRe1bt06/fDDD/rggw80Z84c3XnnnZL+uEbB2LFj9cILL+ijjz7S3r179cADD8jX11eDBg2SJLVs2VJ9+/bV6NGjtX37dn311VeKjIzU0KFD5evrK0m699575eLiorCwMO3fv18rV67UvHnzFBUVZfYyZswYxcXFafbs2Tp48KCmTJminTt3KjIy0vJxAQAAAAAAKOtK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51BpaWmSJC8vL4flXl5e5rq0tDR5eno6rK9cubJq167tUJPfPq58jWvVXLn+er1cbeLEiUpPTzcfP/30UwHeNQAAKIsKFUr9+uuv6t27t5o1a6b+/fvr+PHjkqSwsDBuZQwAAHANzKGuz9XVVR4eHg4PAABQPhUqlBo3bpyqVKmio0ePqmrVqubyIUOGKC4ursiaAwAAKE+smEN5e3tLkk6cOOGw/MSJE+Y6b29vnTx50mH9pUuXdPr0aYea/PZx5Wtcq+bK9dfrBQAAVFyFCqU2bNigl19+WfXr13dY3rRpU/34449F0hgAAEB5Y8Ucyt/fX97e3kpISDCX2e12bdu2TcHBwZKk4OBgnT17VklJSWbNxo0blZOTo6CgILNmy5Yt5gXZJSk+Pl7NmzdXrVq1zJorXye3Jvd1CtILAACouAoVSmVkZDj8di/X6dOn5erq+pebAgAAKI+Kag517tw5JScnKzk5WdIfFxRPTk7W0aNH5eTkpLFjx+qFF17QRx99pL179+qBBx6Qr6+veYe+li1bqm/fvho9erS2b9+ur776SpGRkRo6dKh8fX0lSffee69cXFwUFham/fv3a+XKlZo3b56ioqLMPsaMGaO4uDjNnj1bBw8e1JQpU7Rz505FRkZKUoF6AQAAFVehQqlu3brp3XffNZ87OTkpJydHMTEx6tWrV5E1BwAAUJ4U1Rxq586dat++vdq3by9JioqKUvv27RUdHS1JGj9+vB5//HGFh4erU6dOOnfunOLi4uTm5mbuY9myZWrRooV69+6t/v37q2vXrnrzzTfN9TabTRs2bFBqaqoCAwP15JNPKjo6WuHh4WbNrbfequXLl+vNN99U27Zt9Z///Edr1qxR69atzZqC9AIAAComJ6MQt3vZt2+fevfurQ4dOmjjxo26/fbbtX//fp0+fVpfffWVGjduXBy9lnl2u102m03p6elctBMAgHyExe4o9LaLR3Yqwk4uK8rjN3OoG1fc86fS+JkDAKCsK+jxu1BnSrVu3VrfffedunbtqjvuuEMZGRm66667tHv3biZTAAAA18AcCgAA4LLKN7pBVlaW+vbtq0WLFum5554rjp4AAADKHeZQAAAAjm74TKkqVapoz549xdELAABAucUcCgAAwFGhvr533333afHixUXdCwAAQLnGHAoAAOCyG/76niRdunRJ77zzjj777DMFBgaqWrVqDuvnzJlTJM0BAACUJ8yhAAAALruhUOr7779Xo0aNtG/fPnXo0EGS9N133znUODk5FV13AAAA5QBzKAAAgLxuKJRq2rSpjh8/rs8//1ySNGTIEL366qvy8vIqluYAAADKA+ZQAAAAed3QNaUMw3B4/sknnygjI6NIGwIAAChvmEMBAADkVagLnee6eoIFAACA62MOBQAAcIOhlJOTU57rHXD9AwAAgD/HHAoAACCvG7qmlGEYGjlypFxdXSVJFy5c0COPPJLnzjHvv/9+0XUIAABQxjGHAgAAyOuGQqkRI0Y4PL/vvvuKtBkAAIDyiDkUAABAXjcUSi1ZsqS4+gAAACi3mEMBAADk9ZcudA4AAAAAAAAUBqEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAJQzjRo1kpOTU55HRESEJKlnz5551j3yyCMO+zh69KgGDBigqlWrytPTU08//bQuXbrkULNp0yZ16NBBrq6uatKkiWJjY/P0smDBAjVq1Ehubm4KCgrS9u3bi+19AwCAsoVQCgAAoJzZsWOHjh8/bj7i4+MlSf/4xz/MmtGjRzvUxMTEmOuys7M1YMAAXbx4UVu3btXSpUsVGxur6OhosyY1NVUDBgxQr169lJycrLFjx+qhhx7Sp59+atasXLlSUVFRmjx5snbt2qW2bdsqNDRUJ0+etGAUAABAaUcoBQAAUM7Uq1dP3t7e5mPt2rVq3LixevToYdZUrVrVocbDw8Nct2HDBn377bd677331K5dO/Xr10/Tp0/XggULdPHiRUnSokWL5O/vr9mzZ6tly5aKjIzU3XffrVdeecXcz5w5czR69GiNGjVKrVq10qJFi1S1alW988471g0GAAAotcpUKDVz5kw5OTlp7Nix5rILFy4oIiJCderUUfXq1TV48GCdOHHCYTtOPwcAABXVxYsX9d577+nBBx+Uk5OTuXzZsmWqW7euWrdurYkTJ+r333831yUmJiogIEBeXl7mstDQUNntdu3fv9+sCQkJcXit0NBQJSYmmq+blJTkUOPs7KyQkBCzJj+ZmZmy2+0ODwAAUD6VmVBqx44deuONN9SmTRuH5ePGjdPHH3+s1atXa/PmzTp27Jjuuusucz2nnwMAgIpszZo1Onv2rEaOHGkuu/fee/Xee+/p888/18SJE/Wvf/1L9913n7k+LS3NIZCSZD5PS0v70xq73a7z58/rl19+UXZ2dr41ufvIz4wZM2Sz2cyHn59fod43AAAo/cpEKHXu3DkNHz5cb731lmrVqmUuT09P1+LFizVnzhz9/e9/V2BgoJYsWaKtW7fq66+/lsTp5wAAoGJbvHix+vXrJ19fX3NZeHi4QkNDFRAQoOHDh+vdd9/VBx98oCNHjpRgp3+YOHGi0tPTzcdPP/1U0i0BAIBiUiZCqYiICA0YMCDPKeJJSUnKyspyWN6iRQs1aNDAPC2c088BAEBF9eOPP+qzzz7TQw899Kd1QUFBkqTDhw9Lkry9vfNcDiH3ube395/WeHh4yN3dXXXr1lWlSpXyrcndR35cXV3l4eHh8AAAAOVTqQ+lVqxYoV27dmnGjBl51qWlpcnFxUU1a9Z0WH7laeGcfg4AACqqJUuWyNPTUwMGDPjTuuTkZEmSj4+PJCk4OFh79+51uExBfHy8PDw81KpVK7MmISHBYT/x8fEKDg6WJLm4uCgwMNChJicnRwkJCWYNAACo2Ep1KPXTTz9pzJgxWrZsmdzc3Eq6nRvG6ecAAKCk5OTkaMmSJRoxYoQqV65sLj9y5IimT5+upKQk/fDDD/roo4/0wAMPqHv37ua1O/v06aNWrVrp/vvv1zfffKNPP/1UkyZNUkREhFxdXSVJjzzyiL7//nuNHz9eBw8e1Ouvv65Vq1Zp3Lhx5mtFRUXprbfe0tKlS3XgwAE9+uijysjI0KhRo6wdDAAAUCpVvn5JyUlKStLJkyfVoUMHc1l2dra2bNmi+fPn69NPP9XFixd19uxZh7Olrjwt3NvbO89d8m709PNKlSoV+vTz3IkbAACAlT777DMdPXpUDz74oMNyFxcXffbZZ5o7d64yMjLk5+enwYMHa9KkSWZNpUqVtHbtWj366KMKDg5WtWrVNGLECE2bNs2s8ff317p16zRu3DjNmzdP9evX19tvv63Q0FCzZsiQITp16pSio6OVlpamdu3aKS4uLs/Z5wAAoGIq1aFU7969tXfvXodlo0aNUosWLTRhwgT5+fmpSpUqSkhI0ODBgyVJKSkpOnr0qHlaeHBwsF588UWdPHlSnp6ekvI//Xz9+vUOr3Ot088HDRok6fLp55GRkcX2/gEAAAqrT58+Mgwjz3I/Pz9t3rz5uts3bNgwz/zoaj179tTu3bv/tCYyMpL5EgAAyFepDqVq1Kih1q1bOyyrVq2a6tSpYy4PCwtTVFSUateuLQ8PDz3++OMKDg5W586dJTmefh4TE6O0tLR8Tz+fP3++xo8frwcffFAbN27UqlWrtG7dOvN1o6KiNGLECHXs2FG33HKL+dtFTj8HAAAAAAC4caU6lCqIV155Rc7Ozho8eLAyMzMVGhqq119/3VzP6ecAAAAAAAClj5OR33ndKBZ2u102m03p6enc3hgAgHyExe4o9LaLR3Yqwk4u4/hdsop7/EvjZw4AgLKuoMfvUn33PQAAAAAAAJRPhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAAAAAACwHKEUAAAAAAAALEcoBQAAAAAAAMsRSgEAAAAAAMByhFIAAADlzJQpU+Tk5OTwaNGihbn+woULioiIUJ06dVS9enUNHjxYJ06ccNjH0aNHNWDAAFWtWlWenp56+umndenSJYeaTZs2qUOHDnJ1dVWTJk0UGxubp5cFCxaoUaNGcnNzU1BQkLZv314s7xkAAJQ9hFIAAADl0M0336zjx4+bjy+//NJcN27cOH388cdavXq1Nm/erGPHjumuu+4y12dnZ2vAgAG6ePGitm7dqqVLlyo2NlbR0dFmTWpqqgYMGKBevXopOTlZY8eO1UMPPaRPP/3UrFm5cqWioqI0efJk7dq1S23btlVoaKhOnjxpzSAAAIBSjVAKAACgHKpcubK8vb3NR926dSVJ6enpWrx4sebMmaO///3vCgwM1JIlS7R161Z9/fXXkqQNGzbo22+/1Xvvvad27dqpX79+mj59uhYsWKCLFy9KkhYtWiR/f3/Nnj1bLVu2VGRkpO6++2698sorZg9z5szR6NGjNWrUKLVq1UqLFi1S1apV9c4771g/IAAAoNQhlAIAACiHDh06JF9fX910000aPny4jh49KklKSkpSVlaWQkJCzNoWLVqoQYMGSkxMlCQlJiYqICBAXl5eZk1oaKjsdrv2799v1ly5j9ya3H1cvHhRSUlJDjXOzs4KCQkxa/KTmZkpu93u8AAAAOUToRQAAEA5ExQUpNjYWMXFxWnhwoVKTU1Vt27d9NtvvyktLU0uLi6qWbOmwzZeXl5KS0uTJKWlpTkEUrnrc9f9WY3dbtf58+f1yy+/KDs7O9+a3H3kZ8aMGbLZbObDz8+vUGMAAABKv8ol3QAAAACKVr9+/cw/t2nTRkFBQWrYsKFWrVold3f3Euzs+iZOnKioqCjzud1uJ5gCAKCc4kwpAACAcq5mzZpq1qyZDh8+LG9vb128eFFnz551qDlx4oS8vb0lSd7e3nnuxpf7/Ho1Hh4ecnd3V926dVWpUqV8a3L3kR9XV1d5eHg4PAAAQPlEKAUAAFDOnTt3TkeOHJGPj48CAwNVpUoVJSQkmOtTUlJ09OhRBQcHS5KCg4O1d+9eh7vkxcfHy8PDQ61atTJrrtxHbk3uPlxcXBQYGOhQk5OTo4SEBLMGAABUbIRSAAAA5cxTTz2lzZs364cfftDWrVt15513qlKlSho2bJhsNpvCwsIUFRWlzz//XElJSRo1apSCg4PVuXNnSVKfPn3UqlUr3X///frmm2/06aefatKkSYqIiJCrq6sk6ZFHHtH333+v8ePH6+DBg3r99de1atUqjRs3zuwjKipKb731lpYuXaoDBw7o0UcfVUZGhkaNGlUi4wIAAEoXrikFAABQzvz8888aNmyYfv31V9WrV09du3bV119/rXr16kmSXnnlFTk7O2vw4MHKzMxUaGioXn/9dXP7SpUqae3atXr00UcVHBysatWqacSIEZo2bZpZ4+/vr3Xr1mncuHGaN2+e6tevr7fffluhoaFmzZAhQ3Tq1ClFR0crLS1N7dq1U1xcXJ6LnwMAgIrJyTAMo6SbqCjsdrtsNpvS09O5PgIAAPkIi91R6G0Xj+xUhJ1cxvG7ZBX3+JfGzxwAAGVdQY/ffH0PAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAlivVodSMGTPUqVMn1ahRQ56enho0aJBSUlIcai5cuKCIiAjVqVNH1atX1+DBg3XixAmHmqNHj2rAgAGqWrWqPD099fTTT+vSpUsONZs2bVKHDh3k6uqqJk2aKDY2Nk8/CxYsUKNGjeTm5qagoCBt3769yN8zAAAAAABARVCqQ6nNmzcrIiJCX3/9teLj45WVlaU+ffooIyPDrBk3bpw+/vhjrV69Wps3b9axY8d01113meuzs7M1YMAAXbx4UVu3btXSpUsVGxur6OhosyY1NVUDBgxQr169lJycrLFjx+qhhx7Sp59+atasXLlSUVFRmjx5snbt2qW2bdsqNDRUJ0+etGYwAAAAAAAAyhEnwzCMkm6ioE6dOiVPT09t3rxZ3bt3V3p6uurVq6fly5fr7rvvliQdPHhQLVu2VGJiojp37qxPPvlEt912m44dOyYvLy9J0qJFizRhwgSdOnVKLi4umjBhgtatW6d9+/aZrzV06FCdPXtWcXFxkqSgoCB16tRJ8+fPlyTl5OTIz89Pjz/+uJ555pl8+83MzFRmZqb53G63y8/PT+np6fLw8CiWMQIAoCwLi91R6G0Xj+xUhJ1cZrfbZbPZOH6XkOIe/9L4mQMAoKwr6PG7VJ8pdbX09HRJUu3atSVJSUlJysrKUkhIiFnTokULNWjQQImJiZKkxMREBQQEmIGUJIWGhsput2v//v1mzZX7yK3J3cfFixeVlJTkUOPs7KyQkBCzJj8zZsyQzWYzH35+fn/l7QMAAAAAAJQbZSaUysnJ0dixY9WlSxe1bt1akpSWliYXFxfVrFnTodbLy0tpaWlmzZWBVO763HV/VmO323X+/Hn98ssvys7Ozrcmdx/5mThxotLT083HTz/9dONvHAAAAAAAoByqXNINFFRERIT27dunL7/8sqRbKTBXV1e5urqWdBsAAAAAAAClTpk4UyoyMlJr167V559/rvr165vLvb29dfHiRZ09e9ah/sSJE/L29jZrrr4bX+7z69V4eHjI3d1ddevWVaVKlfKtyd0HAAAAAAAACq5Uh1KGYSgyMlIffPCBNm7cKH9/f4f1gYGBqlKlihISEsxlKSkpOnr0qIKDgyVJwcHB2rt3r8Nd8uLj4+Xh4aFWrVqZNVfuI7cmdx8uLi4KDAx0qMnJyVFCQoJZAwAAAAAAgIIr1V/fi4iI0PLly/Xhhx+qRo0a5vWbbDab3N3dZbPZFBYWpqioKNWuXVseHh56/PHHFRwcrM6dO0uS+vTpo1atWun+++9XTEyM0tLSNGnSJEVERJhfrXvkkUc0f/58jR8/Xg8++KA2btyoVatWad26dWYvUVFRGjFihDp27KhbbrlFc+fOVUZGhkaNGmX9wAAAAAAAAJRxpTqUWrhwoSSpZ8+eDsuXLFmikSNHSpJeeeUVOTs7a/DgwcrMzFRoaKhef/11s7ZSpUpau3atHn30UQUHB6tatWoaMWKEpk2bZtb4+/tr3bp1GjdunObNm6f69evr7bffVmhoqFkzZMgQnTp1StHR0UpLS1O7du0UFxeX5+LnAAAAAAAAuD4nwzCMkm6iorDb7bLZbEpPT5eHh0dJtwMAQKkTFruj0NsuHtmpCDu5jON3ySru8S+NnzkAAMq6gh6/S/U1pQAAAAAAAFA+EUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAACUMzNmzFCnTp1Uo0YNeXp6atCgQUpJSXGo6dmzp5ycnBwejzzyiEPN0aNHNWDAAFWtWlWenp56+umndenSJYeaTZs2qUOHDnJ1dVWTJk0UGxubp58FCxaoUaNGcnNzU1BQkLZv317k7xkAAJQ9hFIAAADlzObNmxUREaGvv/5a8fHxysrKUp8+fZSRkeFQN3r0aB0/ftx8xMTEmOuys7M1YMAAXbx4UVu3btXSpUsVGxur6OhosyY1NVUDBgxQr169lJycrLFjx+qhhx7Sp59+atasXLlSUVFRmjx5snbt2qW2bdsqNDRUJ0+eLP6BAAAApVrlkm4AAAAARSsuLs7heWxsrDw9PZWUlKTu3buby6tWrSpvb+9897FhwwZ9++23+uyzz+Tl5aV27dpp+vTpmjBhgqZMmSIXFxctWrRI/v7+mj17tiSpZcuW+vLLL/XKK68oNDRUkjRnzhyNHj1ao0aNkiQtWrRI69at0zvvvKNnnnkmz+tmZmYqMzPTfG632//aYAAAgFKLM6UAAADKufT0dElS7dq1HZYvW7ZMdevWVevWrTVx4kT9/vvv5rrExEQFBATIy8vLXBYaGiq73a79+/ebNSEhIQ77DA0NVWJioiTp4sWLSkpKcqhxdnZWSEiIWXO1GTNmyGazmQ8/P7+/8M4BAEBpxplSAAAA5VhOTo7Gjh2rLl26qHXr1ubye++9Vw0bNpSvr6/27NmjCRMmKCUlRe+//74kKS0tzSGQkmQ+T0tL+9Mau92u8+fP68yZM8rOzs635uDBg/n2O3HiREVFRZnP7XY7wRQAAOUUoRQAAEA5FhERoX379unLL790WB4eHm7+OSAgQD4+Purdu7eOHDmixo0bW92mydXVVa6uriX2+gAAwDp8fQ8AAKCcioyM1Nq1a/X555+rfv36f1obFBQkSTp8+LAkydvbWydOnHCoyX2eex2qa9V4eHjI3d1ddevWVaVKlfKtuda1rAAAQMVBKAUAAFDOGIahyMhIffDBB9q4caP8/f2vu01ycrIkycfHR5IUHBysvXv3OtwlLz4+Xh4eHmrVqpVZk5CQ4LCf+Ph4BQcHS5JcXFwUGBjoUJOTk6OEhASzBgAAVFx8fQ8AAKCciYiI0PLly/Xhhx+qRo0a5jWgbDab3N3ddeTIES1fvlz9+/dXnTp1tGfPHo0bN07du3dXmzZtJEl9+vRRq1atdP/99ysmJkZpaWmaNGmSIiIizK/XPfLII5o/f77Gjx+vBx98UBs3btSqVau0bt06s5eoqCiNGDFCHTt21C233KK5c+cqIyPDvBsfAACouAilAAAAypmFCxdKknr27OmwfMmSJRo5cqRcXFz02WefmQGRn5+fBg8erEmTJpm1lSpV0tq1a/Xoo48qODhY1apV04gRIzRt2jSzxt/fX+vWrdO4ceM0b9481a9fX2+//bZCQ0PNmiFDhujUqVOKjo5WWlqa2rVrp7i4uDwXPwcAABUPoRQAAEA5YxjGn6738/PT5s2br7ufhg0bav369X9a07NnT+3evftPayIjIxUZGXnd1wMAABUL15QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiuckk3gLItLHZHobddPLJTEXYCAAAAAADKEs6UAgAAAAAAgOU4Uwp/6WynknxdzrQCAAAAAKDsIpRCmcVXBwGgdCqpX3YAAACgbOHrewAAAAAAALAcZ0qhQuIsKwAAAAAAShZnSgEAAAAAAMBynCkF3CDOsgIAAAAA4K8jlAIsRKBVvvH/FwAAAAAKjlAKKCMIPAAAAAAA5QmhFFABlNTt2QnDgLKrpP7eAAAAQMVBKAWg2JTFs7tK6h/iZXGsAAAAAOCvIJQCUCpxlkbBEWgBAAAAKIsIpQCgAiPQKt8IdwEAAFCaEUqVE/zDA4DVCLQKjr+jAQAAgLwIpQAAliOkAQAAAEAoBQAAABQCZ4wCAPDXOJd0AwAAAAAAAKh4CKUAAAAAAABgOUIpAAAAAAAAWI5QCgAAAAAAAJYjlLpBCxYsUKNGjeTm5qagoCBt3769pFsCAAAo9ZhDAQCAqxFK3YCVK1cqKipKkydP1q5du9S2bVuFhobq5MmTJd0aAABAqcUcCgAA5MfJMAyjpJsoK4KCgtSpUyfNnz9fkpSTkyM/Pz89/vjjeuaZZ667vd1ul81mU3p6ujw8PIq0t79yS2IAAMqDxSM7Fct+i/P4XVH8lTlUcY9/WZxDFddnHQCAolLQ43dlC3sq0y5evKikpCRNnDjRXObs7KyQkBAlJibmu01mZqYyMzPN5+np6ZL++J9T5P2dP1fk+wQAoCwpjuPrlfvl93iFc6NzKCvnT1LZnEPdv/DzQm+7YHhgEXYCAED+Cjp/IpQqoF9++UXZ2dny8vJyWO7l5aWDBw/mu82MGTM0derUPMv9/PyKpUcAACqy9x4r3v3/9ttvstlsxfsi5dCNzqGYPxWv4v45AQDgStebPxFKFaOJEycqKirKfJ6Tk6PTp0+rTp06cnJyKpLXsNvt8vPz008//cRXCooZY20NxtkajLN1GGtrFOc4G4ah3377Tb6+vkW6X+TPivlTLn4+ixbjWbQYz6LFeBYtxrNolcfxLOj8iVCqgOrWratKlSrpxIkTDstPnDghb2/vfLdxdXWVq6urw7KaNWsWS38eHh7l5sNb2jHW1mCcrcE4W4extkZxjTNnSBXejc6hrJw/5eLns2gxnkWL8SxajGfRYjyLVnkbz4LMn7j7XgG5uLgoMDBQCQkJ5rKcnBwlJCQoODi4BDsDAAAovZhDAQCAa+FMqRsQFRWlESNGqGPHjrrllls0d+5cZWRkaNSoUSXdGgAAQKnFHAoAAOSHUOoGDBkyRKdOnVJ0dLTS0tLUrl07xcXF5blwp5VcXV01efLkPKe5o+gx1tZgnK3BOFuHsbYG41y6lcY5lMTnpqgxnkWL8SxajGfRYjyLVkUeTyeD+xsDAAAAAADAYlxTCgAAAAAAAJYjlAIAAAAAAIDlCKUAAAAAAABgOUIpAAAAAAAAWI5QqgxYsGCBGjVqJDc3NwUFBWn79u1/Wr969Wq1aNFCbm5uCggI0Pr16y3qtOy7kbF+66231K1bN9WqVUu1atVSSEjIdf/f4A83+pnOtWLFCjk5OWnQoEHF22A5caPjfPbsWUVERMjHx0eurq5q1qwZf38U0I2O9dy5c9W8eXO5u7vLz89P48aN04ULFyzqtmzasmWLBg4cKF9fXzk5OWnNmjXX3WbTpk3q0KGDXF1d1aRJE8XGxhZ7nyg7CnssqmimTJkiJycnh0eLFi3M9RcuXFBERITq1Kmj6tWra/DgwTpx4oTDPo4ePaoBAwaoatWq8vT01NNPP61Lly5Z/VZKxPX+7jIMQ9HR0fLx8ZG7u7tCQkJ06NAhh5rTp09r+PDh8vDwUM2aNRUWFqZz58451OzZs0fdunWTm5ub/Pz8FBMTU9xvrURcbzxHjhyZ5/Pat29fhxrG8w8zZsxQp06dVKNGDXl6emrQoEFKSUlxqCmqn++KcjwuyJj27Nkzz2f0kUcecaipcGNqoFRbsWKF4eLiYrzzzjvG/v37jdGjRxs1a9Y0Tpw4kW/9V199ZVSqVMmIiYkxvv32W2PSpElGlSpVjL1791rcedlzo2N97733GgsWLDB2795tHDhwwBg5cqRhs9mMn3/+2eLOy5YbHedcqampxt/+9jejW7duxh133GFNs2XYjY5zZmam0bFjR6N///7Gl19+aaSmphqbNm0ykpOTLe687LnRsV62bJnh6upqLFu2zEhNTTU+/fRTw8fHxxg3bpzFnZct69evN5577jnj/fffNyQZH3zwwZ/Wf//990bVqlWNqKgo49tvvzVee+01o1KlSkZcXJw1DaNUK+yxqCKaPHmycfPNNxvHjx83H6dOnTLXP/LII4afn5+RkJBg7Ny50+jcubNx6623musvXbpktG7d2ggJCTF2795trF+/3qhbt64xceLEkng7lrve310zZ840bDabsWbNGuObb74xbr/9dsPf3984f/68WdO3b1+jbdu2xtdff2188cUXRpMmTYxhw4aZ69PT0w0vLy9j+PDhxr59+4x///vfhru7u/HGG29Y9TYtc73xHDFihNG3b1+Hz+vp06cdahjPP4SGhhpLliwx9u3bZyQnJxv9+/c3GjRoYJw7d86sKYqf74p0PC7ImPbo0cMYPXq0w2c0PT3dXF8Rx5RQqpS75ZZbjIiICPN5dna24evra8yYMSPf+nvuuccYMGCAw7KgoCDj4YcfLtY+y4MbHeurXbp0yahRo4axdOnS4mqxXCjMOF+6dMm49dZbjbffftsYMWIEoVQB3Og4L1y40LjpppuMixcvWtViuXGjYx0REWH8/e9/d1gWFRVldOnSpVj7LE8KEkqNHz/euPnmmx2WDRkyxAgNDS3GzlBW/NVjfkUyefJko23btvmuO3v2rFGlShVj9erV5rIDBw4YkozExETDMP4IEZydnY20tDSzZuHChYaHh4eRmZlZrL2XNlf/3ZWTk2N4e3sbs2bNMpedPXvWcHV1Nf79738bhmEY3377rSHJ2LFjh1nzySefGE5OTsb//vc/wzAM4/XXXzdq1arlMJ4TJkwwmjdvXszvqGRdK5T6s3ki43ltJ0+eNCQZmzdvNgyj6H6+K/Lx+OoxNYw/QqkxY8Zcc5uKOKZ8fa8Uu3jxopKSkhQSEmIuc3Z2VkhIiBITE/PdJjEx0aFekkJDQ69Zjz8UZqyv9vvvvysrK0u1a9curjbLvMKO87Rp0+Tp6amwsDAr2izzCjPOH330kYKDgxURESEvLy+1bt1aL730krKzs61qu0wqzFjfeuutSkpKMr8q9P3332v9+vXq37+/JT1XFBwPcS1FccyvaA4dOiRfX1/ddNNNGj58uI4ePSpJSkpKUlZWlsNYtmjRQg0aNDDHMjExUQEBAfLy8jJrQkNDZbfbtX//fmvfSCmTmpqqtLQ0h/Gz2WwKCgpyGL+aNWuqY8eOZk1ISIicnZ21bds2s6Z79+5ycXExa0JDQ5WSkqIzZ85Y9G5Kj02bNsnT01PNmzfXo48+ql9//dVcx3heW3p6uiSZ/5Ypqp/vinw8vnpMcy1btkx169ZV69atNXHiRP3+++/muoo4ppVLugFc2y+//KLs7GyHD6QkeXl56eDBg/luk5aWlm99WlpasfVZHhRmrK82YcIE+fr65vkLApcVZpy//PJLLV68WMnJyRZ0WD4UZpy///57bdy4UcOHD9f69et1+PBhPfbYY8rKytLkyZOtaLtMKsxY33vvvfrll1/UtWtXGYahS5cu6ZFHHtGzzz5rRcsVxrWOh3a7XefPn5e7u3sJdYaSVhTH/IokKChIsbGxat68uY4fP66pU6eqW7du2rdvn9LS0uTi4qKaNWs6bHPl3PNaP4u56yqy3Pf/Z3P3tLQ0eXp6OqyvXLmyateu7VDj7++fZx+562rVqlUs/ZdGffv21V133SV/f38dOXJEzz77rPr166fExERVqlSJ8byGnJwcjR07Vl26dFHr1q0lqch+vivq8Ti/MZX+mAc2bNhQvr6+2rNnjyZMmKCUlBS9//77kirmmBJKAUVg5syZWrFihTZt2iQ3N7eSbqfc+O2333T//ffrrbfeUt26dUu6nXItJydHnp6eevPNN1WpUiUFBgbqf//7n2bNmkUoVcQ2bdqkl156Sa+//rqCgoJ0+PBhjRkzRtOnT9fzzz9f0u0BgIN+/fqZf27Tpo2CgoLUsGFDrVq1qsz9wwfl39ChQ80/BwQEqE2bNmrcuLE2bdqk3r17l2BnpVtERIT27dunL7/8sqRbKTeuNabh4eHmnwMCAuTj46PevXvryJEjaty4sdVtlgp8fa8Uq1u3ripVqpTnDgcnTpyQt7d3vtt4e3vfUD3+UJixzvXPf/5TM2fO1IYNG9SmTZvibLPMu9FxPnLkiH744QcNHDhQlStXVuXKlfXuu+/qo48+UuXKlXXkyBGrWi9TCvN59vHxUbNmzVSpUiVzWcuWLZWWlqaLFy8Wa79lWWHG+vnnn9f999+vhx56SAEBAbrzzjv10ksvacaMGcrJybGi7QrhWsdDDw8P/iFdwf2VYz6kmjVrqlmzZjp8+LC8vb118eJFnT171qHmyrG81s9i7rqKLPf9/9ln0dvbWydPnnRYf+nSJZ0+fZoxLoCbbrpJdevW1eHDhyUxnvmJjIzU2rVr9fnnn6t+/frm8qL6+a6Ix+NrjWl+goKCJMnhM1rRxpRQqhRzcXFRYGCgEhISzGU5OTlKSEhQcHBwvtsEBwc71EtSfHz8Nevxh8KMtSTFxMRo+vTpiouLc/huOvJ3o+PcokUL7d27V8nJyebj9ttvV69evZScnCw/Pz8r2y8zCvN57tKliw4fPuwQinz33Xfy8fFxuKYCHBVmrH///Xc5OzsefnPDQMMwiq/ZCobjIa6lsMd8/OHcuXM6cuSIfHx8FBgYqCpVqjiMZUpKio4ePWqOZXBwsPbu3esQBMTHx8vDw0OtWrWyvP/SxN/fX97e3g7jZ7fbtW3bNofxO3v2rJKSksyajRs3Kicnx/zHbHBwsLZs2aKsrCyzJj4+Xs2bNy+XXzW7ET///LN+/fVX+fj4SGI8r2QYhiIjI/XBBx9o48aNeb6yWFQ/3xXpeHy9Mc1P7iVKrvyMVrgxLdnrrON6VqxYYbi6uhqxsbHGt99+a4SHhxs1a9Y0r8Z///33G88884xZ/9VXXxmVK1c2/vnPfxoHDhwwJk+ebFSpUsXYu3dvSb2FMuNGx3rmzJmGi4uL8Z///Mfhlp6//fZbSb2FMuFGx/lq3H2vYG50nI8ePWrUqFHDiIyMNFJSUoy1a9canp6exgsvvFBSb6HMuNGxnjx5slGjRg3j3//+t/H9998bGzZsMBo3bmzcc889JfUWyoTffvvN2L17t7F7925DkjFnzhxj9+7dxo8//mgYhmE888wzxv3332/W594u+emnnzYOHDhgLFiwoEzfLhlF63o/t7jsySefNDZt2mSkpqYaX331lRESEmLUrVvXOHnypGEYf9wyvkGDBsbGjRuNnTt3GsHBwUZwcLC5fe7tzfv06WMkJycbcXFxRr169Rxub16eXe/vrpkzZxo1a9Y0PvzwQ2PPnj3GHXfcYfj7+xvnz58399G3b1+jffv2xrZt24wvv/zSaNq0qTFs2DBz/dmzZw0vLy/j/vvvN/bt22esWLHCqFq1qvHGG29Y/n6L25+N52+//WY89dRTRmJiopGammp89tlnRocOHYymTZsaFy5cMPfBeP7h0UcfNWw2m7Fp0yaHf8v8/vvvZk1R/HxXpOPx9cb08OHDxrRp04ydO3caqampxocffmjcdNNNRvfu3c19VMQxJZQqA1577TWjQYMGhouLi3HLLbcYX3/9tbmuR48exogRIxzqV61aZTRr1sxwcXExbr75ZmPdunUWd1x23chYN2zY0JCU5zF58mTrGy9jbvQzfSVCqYK70XHeunWrERQUZLi6uho33XST8eKLLxqXLl2yuOuy6UbGOisry5gyZYrRuHFjw83NzfDz8zMee+wx48yZM9Y3XoZ8/vnn+f6dmzu2I0aMMHr06JFnm3bt2hkuLi7GTTfdZCxZssTyvlF6/dnPLS4bMmSI4ePjY7i4uBh/+9vfjCFDhhiHDx82158/f9547LHHjFq1ahlVq1Y17rzzTuP48eMO+/jhhx+Mfv36Ge7u7kbdunWNJ5980sjKyrL6rZSI6/3dlZOTYzz//POGl5eX4erqavTu3dtISUlx2Mevv/5qDBs2zKhevbrh4eFhjBo1Ks8vQb/55huja9euhqurq/G3v/3NmDlzplVv0VJ/Np6///670adPH6NevXpGlSpVjIYNGxqjR4/OEzYznn/IbxwlORwri+rnu6Icj683pkePHjW6d+9u1K5d23B1dTWaNGliPP3000Z6errDfiramDoZBt8VAAAAAAAAgLW4phQAAAAAAAAsRygFAAAAAAAAyxFKAQAAAAAAwHKEUgAAAAAAALAcoRQAAAAAAAAsRygFAAAAAAAAyxFKAQAAAAAAwHKEUgAAAAAAALAcoRQAAAAA4C/54Ycf5OTkpOTk5JJuRZLUs2dPjR07tqTbAHAdhFIAKrTimrD07NlTTk5OcnJykpubm1q1aqXXX3/dXB8bG2uud3Z2Vv369TVq1CidPHmyyHsBAAAoCR988IE6d+4sm82mGjVq6Oabb77heZeTk5PWrFnjsCw7O1szZ85UixYt5O7urtq1aysoKEhvv/22WfP+++9r+vTpRfAuABSnyiXdAACUV6NHj9a0adP0+++/691331VERIRq1aqlYcOGSZI8PDyUkpKinJwcffPNNxo1apSOHTumTz/9tIQ7BwAAFVVWVpaqVKnyl/eTkJCgIUOG6MUXX9Ttt98uJycnffvtt4qPj//L+546dareeOMNzZ8/Xx07dpTdbtfOnTt15swZs6Z27dp/+XUAFD/OlAJQYY0cOVKbN2/WvHnzzLOWfvjhB23evFm33HKLXF1d5ePjo2eeeUaXLl0yt+vZs6ciIyMVGRkpm82munXr6vnnn5dhGA77r1q1qry9vXXTTTdpypQpatq0qT766CNzvZOTk7y9veXr66t+/frpiSee0Geffabz589bNgYAAKD8y8nJUUxMjJo0aSJXV1c1aNBAL774ovmVu5UrV6pHjx5yc3PTsmXLJElvv/22WrZsKTc3N7Vo0cLhjG9J2r59u9q3by83Nzd17NhRu3fvdlj/8ccfq0uXLnr66afVvHlzNWvWTIMGDdKCBQsc6j788EN16NBBbm5uuummmzR16lRz3tWoUSNJ0p133iknJyfz+UcffaTHHntM//jHP+Tv76+2bdsqLCxMTz31lLnfK8+G37RpkznXu/IxcuTIAvUBoPhwphSACmvevHn67rvv1Lp1a02bNk3SH6eD9+/fXyNHjtS7776rgwcPavTo0XJzc9OUKVPMbZcuXaqwsDBt375dO3fuVHh4uBo0aKDRo0df8/Xc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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdf = qc_credsets.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# # Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# WIP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Clumped loci filtered for usage with PICS\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Number of unique studyIds\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "231" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pics_loci.df.select(\"studyId\").distinct().count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Number of loci to fine map with PICS\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "9990" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pics_loci.df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pics_loci.df.withColumns(\n", + " {\n", + " \"locusSize\": f.size(\"locus\"),\n", + " \"locusLength\": f.col(\"locusEnd\") - f.col(\"locusStart\"),\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many loci with less than 100 variants from summary statistics?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "985" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.filter(f.col(\"locusSize\") < 100).count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many loci with more than 15,000 variants from summary statistics?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "9005" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.filter(f.col(\"locusSize\") > 15_000).count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanLocusLength | 1294768.356956957 \n", + " q1LocusLength | 1231357 \n", + " medianLocusLength | 1500000 \n", + " q3LocusLength | 1500000 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 102:===================================================> (334 + 8) / 346]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-----------------------------\n", + " meanLocusSize | 18537.992992992993 \n", + " minLocusSize | 1 \n", + " q1LocusSize | 16779 \n", + " medianLocusSize | 19456 \n", + " q3LocusSize | 22436 \n", + " maxLocusSize | 39972 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "length = df.select(\n", + " f.mean(\"locusLength\").alias(\"meanLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.25).alias(\"q1LocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.5).alias(\"medianLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.75).alias(\"q3LocusLength\"),\n", + ")\n", + "size = df.select(\n", + " f.mean(\"locusSize\").alias(\"meanLocusSize\"),\n", + " f.min(\"locusSize\").alias(\"minLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.25).alias(\"q1LocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.5).alias(\"medianLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.75).alias(\"q3LocusSize\"),\n", + " f.max(\"locusSize\").alias(\"maxLocusSize\"),\n", + ")\n", + "length.show(vertical=True)\n", + "size.show(vertical=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKMAAAJOCAYAAABr8MR3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1ZklEQVR4nO3dd3gU1f7H8U8KKZQktDQJMdI7UoRciiCRALkKyr2KIgIGsSRKUUGuilRBRJoiWBDwJ1jwWkGBSBUNLRK6kaZBIcErJCEIISTn94dPBpcAQkhmU96v59lHd86Zme+ZXZbDZ2dnXIwxRgAAAAAAAIANXJ1dAAAAAAAAAMoOwigAAAAAAADYhjAKAAAAAAAAtiGMAgAAAAAAgG0IowAAAAAAAGAbwigAAAAAAADYhjAKAAAAAAAAtiGMAgAAAAAAgG0IowAAAAAAAGAbwiigmLv++us1YMAAZ5dR6r300ku64YYb5ObmpubNmzu7HFyBtWvXysXFRR999JGzSwEAlFDMs+zBPOvvLViwQC4uLvrpp5+cXQpgC8IowEZ5f8ls3br1ou2dOnVS48aNr3k/X375pcaMGXPN2ykrVq5cqREjRqhdu3aaP3++XnjhhUv2HTBggCpWrGhjdUXv+uuv1z//+U9nl3FJixcv1owZM5xdBgCgmGOeVTyV9XnW2bNnNXPmTN14443y8fGRn5+fGjVqpMGDB+uHH35wdnmA07g7uwAAl5eUlCRX16vLjb/88kvNnj2bidIVWr16tVxdXTVv3jx5eHg4uxxcYPHixdq1a5eGDh3q7FIAAKUM86yiV9bnWb1799ZXX32le+65Rw8++KCys7P1ww8/aOnSpfrHP/6h+vXrS5L69eunPn36yNPT08kVA/YgjAKKuZL4F9KpU6dUoUIFZ5dxxY4dOyZvb+8yOUECAKAsY55V9MryPGvLli1aunSpJk6cqP/85z8Oba+++qrS0tKs525ubnJzc7O5QsB5+JkeUMxdeC2D7OxsjR07VnXq1JGXl5eqVq2q9u3bKy4uTtKfpzfPnj1bkuTi4mI98pw6dUpPPPGEQkJC5OnpqXr16mnq1Kkyxjjs9/Tp03r88cdVrVo1VapUSbfffrt+/fVXubi4OHwTOGbMGLm4uGjPnj269957VblyZbVv316StGPHDg0YMEA33HCDvLy8FBgYqAceeEC///67w77ytvHjjz/qvvvuk6+vr6pXr67nnntOxhgdPnxYPXv2lI+PjwIDA/Xyyy9f0bE7d+6cxo8fr1q1asnT01PXX3+9/vOf/ygrK8vq4+Liovnz5+vUqVPWsVqwYMEVbf9ylixZopYtW8rb21vVqlXTfffdp19//TVfvx9++EF33XWXqlevLm9vb9WrV0/PPPOM1T5gwABdf/31+dbLO2Z/FRcXp/bt28vPz08VK1ZUvXr18k18rsW7775rjalKlSrq06ePDh8+7NAn7ycQe/bsUefOnVW+fHldd911mjJlSr7t/fzzz7r99ttVoUIF+fv7a9iwYVqxYoVcXFy0du1aa3vLli3Tzz//bL0+Fx6P3NxcTZw4UTVq1JCXl5e6dOmi/fv3F9q4AQClF/Ms5llFOc86cOCAJKldu3b52tzc3FS1alXr+YXXjMqr4WKPv75nc3NzNWPGDDVq1EheXl4KCAjQQw89pBMnTly2NsDZODMKcIL09HT973//y7c8Ozv7b9cdM2aMJk2apEGDBummm25SRkaGtm7dqu+//1633nqrHnroIR05ckRxcXH6v//7P4d1jTG6/fbbtWbNGkVHR6t58+ZasWKFnnrqKf3666+aPn261XfAgAH68MMP1a9fP7Vt21br1q1TVFTUJev697//rTp16uiFF16wJlxxcXE6ePCgBg4cqMDAQO3evVtvvPGGdu/erY0bN+b7S/7uu+9WgwYNNHnyZC1btkwTJkxQlSpV9Prrr+uWW27Riy++qEWLFunJJ59U69at1bFjx8seq0GDBmnhwoX617/+pSeeeEKbNm3SpEmTtHfvXn3yySeSpP/7v//TG2+8oc2bN+utt96SJP3jH//429fhchYsWKCBAweqdevWmjRpklJTUzVz5kx9++232rZtm/z8/CT9OYns0KGDypUrp8GDB+v666/XgQMH9MUXX2jixIlXtc/du3frn//8p5o2bapx48bJ09NT+/fv17fffntNY8kzceJEPffcc7rrrrs0aNAg/fbbb3rllVfUsWNHhzFJ0okTJ9StWzfdeeeduuuuu/TRRx9p5MiRatKkibp37y7pz8n6LbfcoqNHj2rIkCEKDAzU4sWLtWbNGof9PvPMM0pPT9cvv/xivT8vvJbE5MmT5erqqieffFLp6emaMmWK+vbtq02bNhXK2AEAJQvzLOZZUvGYZ4WGhkqSFi1apHbt2snd/cr/+X3nnXeqdu3aDssSEhI0Y8YM+fv7W8seeugh65g8/vjjOnTokF599VVt27ZN3377rcqVK3cVIwVsZADYZv78+UbSZR+NGjVyWCc0NNT079/fet6sWTMTFRV12f3ExMSYi/3x/vTTT40kM2HCBIfl//rXv4yLi4vZv3+/McaYhIQEI8kMHTrUod+AAQOMJPP8889by55//nkjydxzzz359vfHH3/kW/bee+8ZSWb9+vX5tjF48GBr2blz50yNGjWMi4uLmTx5srX8xIkTxtvb2+GYXExiYqKRZAYNGuSw/MknnzSSzOrVq61l/fv3NxUqVLjs9q6079mzZ42/v79p3LixOX36tLV86dKlRpIZPXq0taxjx46mUqVK5ueff3bYRm5ursP+QkND8+0n75jlmT59upFkfvvttysax1+FhoZe9j31008/GTc3NzNx4kSH5Tt37jTu7u4Oy2+++WYjybzzzjvWsqysLBMYGGh69+5tLXv55ZeNJPPpp59ay06fPm3q169vJJk1a9ZYy6Oioi56DNasWWMkmQYNGpisrCxr+cyZM40ks3PnzisaPwCgdGCexTyruM2zcnNzrblRQECAueeee8zs2bPz1WTM+ffvoUOHLrqt3377zdSsWdM0adLEZGZmGmOM+eabb4wks2jRIoe+y5cvv+hyoDjhZ3qAE8yePVtxcXH5Hk2bNv3bdf38/LR7927t27fvqvf75Zdfys3NTY8//rjD8ieeeELGGH311VeSpOXLl0uSHn30UYd+jz322CW3/fDDD+db5u3tbf3/mTNn9L///U9t27aVJH3//ff5+g8aNMj6fzc3N7Vq1UrGGEVHR1vL/fz8VK9ePR08ePCStUh/jlWShg8f7rD8iSeekCQtW7bssusX1NatW3Xs2DE9+uij8vLyspZHRUWpfv361n5/++03rV+/Xg888IBq1qzpsI0Lv8m8EnnfAn722WfKzc0t+AAu4uOPP1Zubq7uuusu/e9//7MegYGBqlOnTr6zmSpWrKj77rvPeu7h4aGbbrrJ4TVbvny5rrvuOt1+++3WMi8vLz344INXXd/AgQMdrkPRoUMHSfrb9wgAoHRinsU8q7jMs1xcXLRixQpNmDBBlStX1nvvvaeYmBiFhobq7rvvdrhm1OXk5OTonnvu0cmTJ/XJJ59Y1wxbsmSJfH19deuttzrM0Vq2bKmKFSvmm6MBxQlhFOAEN910kyIiIvI9Kleu/Lfrjhs3Tmlpaapbt66aNGmip556Sjt27Lii/f78888KDg5WpUqVHJY3aNDAas/7r6urq8LCwhz6XXiq8F9d2FeSjh8/riFDhiggIEDe3t6qXr261S89PT1f/wsnC76+vvLy8lK1atXyLf+738HnjeHCmgMDA+Xn52eNtbDlbbdevXr52urXr2+1503yCuMW09Kfp963a9dOgwYNUkBAgPr06aMPP/ywUIKpffv2yRijOnXqqHr16g6PvXv36tixYw79a9SokW+iV7lyZYfX7Oeff1atWrXy9bvce+xSLnzf5P054loJAFA2Mc9inlWc5lmenp565plntHfvXh05ckTvvfee2rZtqw8//FCxsbFXtP9nn31Wq1ev1uLFi1WrVi1r+b59+5Seni5/f/98c7TMzMx8czSgOOGaUUAJ07FjRx04cECfffaZVq5cqbfeekvTp0/X3LlzHb7xsttfv53Lc9ddd+m7777TU089pebNm6tixYrKzc1Vt27dLvqX98XuIHKpu4qYCy4EeikF+farOLlU/Tk5OQ7Pvb29tX79eq1Zs0bLli3T8uXL9cEHH+iWW27RypUrr+nuLLm5uXJxcdFXX3110e1ceA2na33Nrpbd+wMAlF7Ms/7EPKto5llBQUHq06ePevfurUaNGunDDz/UggULLnstqU8//VQvvviixo8fr27dujm05ebmyt/fX4sWLbroutWrV7+iugBn4MwooASqUqWKBg4cqPfee0+HDx9W06ZNHe68cqm/WENDQ3XkyBGdPHnSYfkPP/xgtef9Nzc3V4cOHXLodzV3KDtx4oRWrVqlp59+WmPHjtUdd9yhW2+9VTfccMMVb+Na5I3hwtPsU1NTlZaWZo21KPYrSUlJSfnakpKSrPa847Br167Lbq9y5coXPYX7Yt84urq6qkuXLpo2bZr27NmjiRMnavXq1dd8inatWrVkjFFYWNhFv2nO+0nA1QgNDdWBAwfyTXYv9h4r6RNdAEDJwjzr7zHPurZ5Vrly5dS0aVNlZ2df9GL7eX788Uf1799fvXr1uuid+2rVqqXff/9d7dq1u+gcrVmzZlddG2AXwiighLnwdr0VK1ZU7dq1HW6jm/c78gv/cu3Ro4dycnL06quv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B7R69Wp9+OGHWrZsmb0DBgAAAAAAQMHOjDp48GBh13FR06dP1z//+U/17t1bHTt2VGBgoD7++GOr3c3NTUuXLpWbm5vCw8N133336f7779e4ceOsPmFhYVq2bJni4uLUrFkzvfzyy3rrrbcUGRlpyxgAAADsmjsBAACUBAU6M6p27dq6+eabFR0drX/961+FdgHytWvXOjz38vLS7NmzNXv27EuuExoaqi+//PKy2+3UqZO2bdtWGCUCAABctaKaOwEAAJREBToz6vvvv1fTpk01fPhwBQYG6qGHHtLmzZsLuzYAAIBSgbkTAADAeQUKo5o3b66ZM2fqyJEjevvtt3X06FG1b99ejRs31rRp0/Tbb78Vdp0AAAAlFnMnAACA867pbnru7u668847tWTJEr344ovav3+/nnzySYWEhOj+++/X0aNHC6tOAACAEo+5EwAAwDWGUVu3btWjjz6qoKAgTZs2TU8++aQOHDiguLg4HTlyRD179iysOgEAAEo85k4AAAAFvID5tGnTNH/+fCUlJalHjx5655131KNHD7m6/plthYWFacGCBbr++usLs1YAAIASibkTAADAeQUKo+bMmaMHHnhAAwYMUFBQ0EX7+Pv7a968eddUHAAAQGnA3AkAAOC8AoVR+/bt+9s+Hh4e6t+/f0E2DwAAUKowdwIAADivQNeMmj9/vpYsWZJv+ZIlS7Rw4cJrLgoAAKA0Ye4EAABwXoHCqEmTJqlatWr5lvv7++uFF1645qIAAABKE+ZOAAAA5xUojEpOTlZYWFi+5aGhoUpOTr7mogAAAEoT5k4AAADnFSiM8vf3144dO/It3759u6pWrXrNRQEAAJQmzJ0AAADOK1AYdc899+jxxx/XmjVrlJOTo5ycHK1evVpDhgxRnz59CrtGAACAEo25EwAAwHkFupve+PHj9dNPP6lLly5yd/9zE7m5ubr//vu57gEAAMAFmDsBAACcV6AwysPDQx988IHGjx+v7du3y9vbW02aNFFoaGhh1wcAAFDiMXcCAAA4r0BhVJ66deuqbt26hVULAABAqcbcCQAAoIBhVE5OjhYsWKBVq1bp2LFjys3NdWhfvXp1oRQHAABQGjB3AgAAOK9AYdSQIUO0YMECRUVFqXHjxnJxcSnsugAAAEoN5k4AAADnFSiMev/99/Xhhx+qR48ehV0PAABAqcPc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jz/+2Egyn3zyyWX7Hzx40JQvX94MHz7c7Nmzx7zyyivGzc3NLF++3J6CbXa1x2fIkCHmxRdfNJs3bzY//vijGTVqlClXrpz5/vvv7SnYZld7fPKcOHHC3HDDDaZr166mWbNmRVojyq6Czhuc5fnnnzeNGjUyR48etR6//fab1f7www+bkJAQs2rVKrN161bTtm1b849//MNqP3funGncuLGJiIgw27ZtM19++aWpVq2aGTVqlNXHWZ/hf/dZMXnyZOPr62s+/fRTs337dnP77bebsLAwc/r0aatPt27dTLNmzczGjRvNN998Y2rXrm3uueceqz09Pd0EBASYvn37ml27dpn33nvPeHt7m9dff93q8+233xo3NzczZcoUs2fPHvPss8+acuXKmZ07d9oyzv79+5tu3bo5vMbHjx936FMSxhkZGWnmz59vdu3aZRITE02PHj1MzZo1TWZmptXHrvdrUf45v5Jx3nzzzebBBx90eE3T09NL1Dg///xzs2zZMvPjjz+apKQk85///MeUK1fO7Nq1yxhTOl7LKxlnaXgtL7R582Zz/fXXm6ZNm5ohQ4ZYy0via0oYZYObbrrJxMTEWM9zcnJMcHCwmTRp0hWtf+7cOVOpUiWzcOHCoirRaQpybM6dO2f+8Y9/mLfeesv079+/VIdRV3t85syZY2644QZz9uxZu0p0mqs9NjExMeaWW25xWDZ8+HDTrl27Iq3T2a4kTBgxYoRp1KiRw7K7777bREZGFmFlxcPVhC1/1bBhQzN27NjCL6iYuZrjc/fdd5tnn33WPP/884RRKDLXOqey2+X+PKSlpZly5cqZJUuWWMv27t1rJJn4+HhjzJ9BiKurq0lJSbH6zJkzx/j4+JisrCxjTPH4DL/wsyI3N9cEBgaal156yVqWlpZmPD09zXvvvWeMMWbPnj1GktmyZYvV56uvvjIuLi7m119/NcYY89prr5nKlStbYzXGmJEjR5p69epZz++66y4TFRXlUE+bNm3MQw89VKhjNObin4l/NxctieM0xphjx44ZSWbdunXGGHvfr3b+Ob9wnMb8GWD89R/5FyqJ4zTGmMqVK5u33nqr1L6WefLGaUzpey1Pnjxp6tSpY+Li4hzGVlJfU36mV8TOnj2rhIQERUREWMtcXV0VERGh+Pj4K9rGH3/8oezsbFWpUqWoynSKgh6bcePG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uzzIX1/T4j7Oi8nNzVVWVlapeS3/bpwXU1Jfyy5duuSbb7Vq1Up9+/a1/r9EvqZXfclzXLX333/feHp6mgULFpg9e/aYwYMHGz8/P+tK9v369TNPP/201X/y5MnGw8PDfPTRRw63oTx58qSzhlBkrvbYXKi0303vao9PcnKyqVSpkomNjTVJSUlm6dKlxt/f30yYMMFZQygyV3tsnn/+eVOpUiXz3nvvmYMHD5qVK1eaWrVqmbvuustZQygyJ0+eNNu2bTPbtm0zksy0adPMtm3bzM8//2yMMebpp582/fr1s/rn3cb1qaeeMnv37jWzZ8+25bbgznK1x2fRokXG3d3dzJ492+EzOS0tzVlDKFJXe3wuxN30UJT+7rO/uHniiSfM2rVrzaFDh8y3335rIiIiTLVq1cyxY8eMMX/eirtmzZpm9erVZuvWrSY8PNyEh4db6+fdirtr164mMTHRLF++3FSvXv2it+K2+zP87z4rJk+ebPz8/Mxnn31mduzYYXr27GnCwsLM6dOnrW1069bN3HjjjWbTpk1mw4YNpk6dOuaee+6x2tPS0kxAQIDp16+f2bVrl3n//fdN+fLlzeuvv271+fbbb427u7uZOnWq2bt3r3n++edNuXLlzM6dO4t8nCdPnjRPPvmkiY+PN4cOHTJff/21adGihalTp445c+ZMiRrnI488Ynx9fc3atWsd/q77448/rD52vV+L8s/5341z//79Zty4cWbr1q3m0KFD5rPPPjM33HCD6dixY4ka59NPP23WrVtnDh06ZHbs2GGefvpp4+LiYlauXGmMKR2v5d+Ns7S8lpdy4Z0CS+JrShhlk1deecXUrFnTeHh4mJtuusls3LjRarv55ptN//79reehoaFGUr7H888/b3/hNriaY3Oh0h5GGXP1x+e7774zbdq0MZ6enuaGG24wEydONOfOnbO5antczbHJzs42Y8aMMbVq1TJeXl4mJCTEPProo+bEiRP2F17E1qxZc9HPkLzj0b9/f3PzzTfnW6d58+bGw8PD3HDDDWb+/Pm2122Xqz0+N99882X7lzYFef/8FWEUitrlPvuLm7vvvtsEBQUZDw8Pc91115m7777b7N+/32o/ffq0efTRR03lypVN+fLlzR133GGOHj3qsI2ffvrJdO/e3Xh7e5tq1aqZJ554wmRnZzv0ccZn+N99VuTm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888/16233nrJ9bZt26Z+/frp1VdfVbt27SRJO3fuVE5OjsPnufTnT/eqVq1a4DEBKDr8TA9AieHt7X3ZdlfXPz/SjDHWsuzsbIc+gwYN0sGDB9WvXz/t3LlTrVq10iuvvFKgejIzM/XQQw8pMTHRemzfvl379u1TrVq1rH7lypVzWM/FxUW5ubkF2ueFinLbQEl24403KicnR8eOHVPt2rUdHnkXxG3Xrp3OnTunAwcOWOv9+OOPkqTQ0FCn1A0AzuCsOValSpV02223aeLEidq+fbs6dOjg8NPBC6WkpOj222/XoEGDFB0dbS3/6xcQf52X7d271+HyBgCKD8IoAMVGgwYNFB8f7zDR+fbbb1WpUiXVqFFDderUkbe3t1atWnXR9atXry5JOnr0qLUs76KXfxUSEqKHH35YH3/8sZ544gm9+eabBaq3RYsW2rNnT75/6NauXVseHh5XtI169epp586dysrKspZt2bLFoU/etq70mgpAWZGZmWn9g0P68zbhiYmJSk5OVt26ddW3b1/df//9+vjjj3Xo0CFt3rxZkyZN0rJlyyRJERERatGihR544AFt27ZNCQkJeuihh3Trrbfm+3YdAEqykjDHcnFxUf369R1uBPNXZ86cUc+ePVW/fn1NmzbNoe1KvoAAULwQRgGwXXp6usO3VomJiTp8+LAeffRRHT58WI899ph++OEHffbZZ3r++ec1fPhwubq6ysvLSyNHjtSIESP0zjvv6MCBA9q4caPmzZsnSapdu7ZCQkI0ZswY7du3T8uWLdPLL7/ssO+hQ4dqxYoVOnTokL7//nutWbPG+lnOpfz222/56k1NTdXIkSP13XffKTY2VomJidq3b58+++yzfBcwv5x7771Xubm5Gjx4sPbu3asVK1Zo6tSpkmSdSh8aGioXFxctXbpUv/32mzIzM6/mcAOl1tatW3XjjTfqxhtvlCQNHz5cN954o0aPHi1Jmj9/vu6//3498cQTqlevnnr16qUtW7aoZs2akv78pv+LL75QtWrV1LFjR0VFRalBgwZ6//33nTYmALgWJWWOlZiYqJ49e+qjjz7Snj17tH//fs2bN09vv/22evbsedF1HnroIR0+fFizZs3Sb7/9ppSUFKWkpOjs2bNX9AUEgGLGqVesAlDm9O/f30jK94iOjjbGGLN27VrTunVr4+HhYQIDA83IkSNNdna2tX5OTo6ZMGGCCQ0NNeXKlTM1a9Y0L7zwgtW+YcMG06RJE+Pl5WU6dOhglixZ4nBxzdjYWFOrVi3j6elpqlevbvr162f+97//XbLem2+++aL1jh8/3hhjzObNm82tt95qKlasaCpUqGCaNm1qJk6caK0fGhpqpk+f7rDNZs2ameeff956/u2335qmTZsaDw8P07JlS7N48eJ8F1AeN26cCQwMNC4uLqZ///5WbRdeXL1nz55WOwAAKDtK0hzrt99+M48//rhp3LixqVixoqlUqZJp0qSJmTp1qsnJyTHG5L+AeWho6EXHt2bNGmOMMWfPnjWjR482119/vSlXrpwJCgoyd9xxh9mxY0chH2kAhcHFmL+cqwkAcLpFixZp4MCBSk9P/9trOAAAAABAScPd9ADAyd555x3dcMMNuu6667R9+3aNHDlSd911F0EUAAAAgFKJMAoAnCwlJUWjR49WSkqKgoKC9O9//1sTJ050dlkAAAAAUCT4mR4AAAAAAABsw930AAAAAAAAYBvCKAAAAAAAANiGMAoAAAAAAAC2IYwCAAAAAACAbQijAAAAAAAAYBvCKAAAAAAAANiGMAoAAAAAAAC2IYwCAAAAAACAbQijAAAAAAAAYJv/BzbRwx6A6/LbAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "panda_df = df.select(\"locusSize\", \"locusLength\").toPandas()\n", + "\n", + "# plt.figure(figsize=(12, 6))\n", + "\n", + "# # Histogram for locusLength\n", + "# plt.subplot(1, 2, 1) # 1 row, 2 columns, 1st subplot\n", + "# plt.hist(panda_df[\"locusLength\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Length\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Length\")\n", + "\n", + "# # Histogram for locusSize\n", + "# plt.subplot(1, 2, 2) # 1 row, 2 columns, 2nd subplot\n", + "# plt.hist(panda_df[\"locusSize\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Size\")\n", + "\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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yy9n8eLFfO973+ts953vfAcpJR/84AexrJlfQUKIzt8zmUzn79VqlbGxMS655BIajQbr169/2uN85JFH2LhxI9dccw3j4+OMjY0xNjZGvV7nFa94BT//+c+RUs7Y513vetdhneOGG26gv7+fwcFBrrzySur1Ol/60pc4//zz59x+z549PPLII1x33XUzoh1nnnkml112Gf/5n/95+BeKTvMaGRnh3e9+94y6nCuvvJKTTz6ZH/7wh0/ruIcijmPWrl3LVVddxapVqzqvL1q0iGuuuYZf/vKXVCoVAP7jP/6Ds846i9e+9rWzjjP98zAf2hGIH/3oR7NSqA7FzTffzFe/+lXOOeccfvSjH/GBD3yA8847j3PPPXdGuuSh+MhHPsIPfvADbr31Vk499VQA7rrrLsrlMm95y1s6n7exsTFs2+aFL3wh99xzz0GP+aY3vYkwDPnWt77VeW3t2rWUy2Xe9KY3dV4rlUrcf//9R8SEZDrPxft5KI7E98All1zC+Ph459rbqXTvfve7Z2z33ve+97DH98pXvnJG1PfMM8+kWCweMXdOg8Hw9HheC6ef//znvOY1r2FwcBAhBN/5zncO+xhKKT71qU+xZs0aUqkUixcv5qMf/eiRH6zB8Bzgggsu4Fvf+haTk5P85je/4cYbb6RarfL617+eJ598EtBpa5ZldRaVB+KJJ57gta99LV1dXRSLRfr7+3nb294G8IzqGzZu3AjAtddeS39//4w/X/ziF/F9f9bxV65ceVjn+OAHP8hdd93F3XffzWOPPcbQ0NBBXdi2b98OwEknnTTrvVNOOaWzoDtcDnbck08+ufP+kWZ0dJRGo3HA65FSsnPnTkB/Hg6V2jlfVq5cyfvf/36++MUv0tfXx+WXX84///M/z/vz8pa3vIVf/OIXTE5OsnbtWq655hoefvhhXvOa19BqtQ65/5133snNN9/MjTfeyNVXX915vf2Ze/nLXz7rM7d27dpDmqecddZZnHzyydx+++2d126//Xb6+vo69XMAn/jEJ3j88cdZunQpL3jBC7jpppuOyEL7uXo/D8bT+R5YtmzZjJ+7u7sBmJycBPTvm2VZs74vTjjhhMMe3/7nap+vfS6DwXBseF7XONXrdc466yxuuOEGXve61z2tY/zFX/wFa9eu5VOf+hRnnHEGExMTTExMHOGRGgzPLTzP44ILLuCCCy5gzZo1XH/99XzjG9/gQx/60Lz2L5fLXHrppRSLRT784Q+zevVq0uk0Dz30EP/tv/23WU+CD4f2vp/85Cc5++yz59xm//4v06Nf8+GMM87gla985dMan2E2B4pUTDcKafPpT3+a6667ju9+97usXbuW973vfXzsYx/j17/+NUuWLJnX+YrFIpdddhmXXXYZruvypS99ifvvv59LL730gPts3bqVt771rVx22WX87d/+7Yz32p+52267jYULF87a13EO/U/xm970Jj760Y8yNjZGoVDge9/7Hm95y1tm7PvGN76RSy65hG9/+9usXbuWT37yk3z84x/nW9/6FldcccW8rv3Z4Nm+n3PxdL4HbNueczv1NOoeD8WzeS6DwTB/ntfC6YorrjjoPya+7/OBD3yAr33ta5TLZU4//XQ+/vGP89KXvhSAdevW8fnPf57HH3+88yTucJ9MGwy/77TT0/bs2QPA6tWrkVLy5JNPHnDB8tOf/pTx8XG+9a1v8ZKXvKTz+lyudAdahB3o9Xb6S7FYPG7EzfLlywF46qmnZr23fv16+vr6Ohboh5PuNP240yMT7dfa7x9p+vv7yWazB7wey7JYunQpoO/H448/ftDjtZ/s79/z5kARszPOOIMzzjiD//k//yf33XcfF198MV/4whdmCZr5cP755/OlL32p8/mdi2azyete9zpKpRJf+9rXZqWgtj9zAwMDT/sz96Y3vYmbb76Z//iP/2DBggVUKhXe/OY3z9pu0aJFvPvd7+bd7343IyMjnHvuuXz0ox99RsLp9+l+tjka3wPLly9HSsnWrVs58cQTO69v2rRp1raHm7ZoMBiOD57XqXqH4j3veQ+/+tWv+PrXv85jjz3GG97wBl796ld3Qvzf//73WbVqFT/4wQ9YuXIlK1as4I//+I9NxMnwvOSee+6Z82louz6n/XDhqquuwrIsPvzhD8+KHLX3bz9tnX68IAj43Oc+N+v4uVxuztSdttDYf3F23nnnsXr1aj71qU9Rq9Vm7Tc6OnrAazxaLFq0iLPPPpsvfelLM8b7+OOPs3btWv7gD/6g89qBrmsuzj//fAYGBvjCF76A7/ud1++44w7WrVs3y+3rSGHbNq961av47ne/O8NieXh4mK9+9au8+MUvplgsAnD11Vfz6KOP8u1vf3vWcdr3v73I/fnPf955L45j/vVf/3XG9pVKhSiKZrx2xhlnYFnWjOvfn0ajwa9+9as537vjjjuAudMd27zrXe9iw4YNfPvb3+6IgulcfvnlFItF/u7v/o4wDGe9P5/P3CmnnMIZZ5zB7bffzu23386iRYtmPFSI43jW78HAwACDg4MHvfb58Fy7n/PhaHwPtN0N9/+e+uxnPztr28P5PTYYDMcPz+uI08HYsWMHt9xyCzt27GBwcBCA//pf/yt33nknt9xyC3/3d3/Hli1b2L59O9/4xjf48pe/TBzH/NVf/RWvf/3rufvuu4/xFRgMzy7vfe97aTQavPa1r+Xkk08mCALuu+8+br/9dlasWMH1118P6Hz/D3zgA3zkIx/hkksu4XWvex2pVIoHHniAwcFBPvaxj3HRRRfR3d3Ntddey/ve9z6EENx2221zCrPzzjuP22+/nfe///1ccMEF5PN5XvOa17B69WpKpRJf+MIXKBQK5HI5XvjCF7Jy5Uq++MUvcsUVV3Daaadx/fXXs3jxYnbv3s0999xDsVjk+9///rM9fXzyk5/kiiuu4EUvehHvfOc7O3bkXV1dnf4v7esFbcX+5je/Gdd1ec1rXjNnU17Xdfn4xz/O9ddfz6WXXspb3vKWjh35ihUr+Ku/+qtnNOZ/+7d/m7O3zF/8xV/wt3/7t9x11128+MUv5t3vfjeO4/Av//Iv+L7PJz7xic62f/3Xf803v/lN3vCGN3DDDTdw3nnnMTExwfe+9z2+8IUvcNZZZ3Haaadx4YUXcuONNzIxMUFPTw9f//rXZy2q7777bt7znvfwhje8gTVr1hBFEbfddhu2bc+oOdqfRqPBRRddxIUXXsirX/1qli5dSrlc5jvf+Q6/+MUvuOqqqzjnnHPm3PeHP/whX/7yl7n66qt57LHHeOyxxzrv5fN5rrrqKorFIp///Od5+9vfzrnnnsub3/xm+vv72bFjBz/84Q+5+OKL+ad/+qdDzveb3vQmPvjBD5JOp3nnO985I7JVrVZZsmQJr3/96znrrLPI5/P8+Mc/5oEHHuDTn/70IY8Nvz/3s00YhnNGpXp6enj3u999xL8HzjvvPK6++mo+85nPMD4+3rEj37BhAzAzynQ4v8cGg+E44pj5+R1nAOrb3/525+e2XW8ul5vxx3Ec9cY3vlEppdSf/MmfKEA99dRTnf3adqTr169/ti/BYDim3HHHHeqGG25QJ598ssrn88rzPHXCCSeo9773vWp4eHjW9v/2b/+mzjnnHJVKpVR3d7e69NJL1V133dV5/95771UXXnihymQyanBwsGNvzjS7YqWUqtVq6pprrlGlUkkBM6zJv/vd76pTTz1VOY4zy0L64YcfVq973etUb2+vSqVSavny5eqNb3yj+slPftLZpm1DPDo6Oq85aNspH8o++UCW1j/+8Y/VxRdfrDKZjCoWi+o1r3mNevLJJ2ft/5GPfEQtXrxYWZY1L2vy22+/vTPXPT096q1vfavatWvXjG2ejh35gf7s3LlTKaXUQw89pC6//HKVz+dVNptVL3vZy9R9990363jj4+PqPe95j1q8eLHyPE8tWbJEXXvttWpsbKyzzebNm9UrX/lKlUql1IIFC9T/+B//Q911110zPg9btmxRN9xwg1q9erVKp9Oqp6dHvexlL1M//vGPD3o9YRiq//N//o+66qqr1PLly1UqlVLZbFadc8456pOf/KTyfb+z7f737mBzsb9N/j333KMuv/xy1dXVpdLptFq9erW67rrr1IMPPnjIOVdKW/m3j/3LX/5yxnu+76u//uu/VmeddZYqFAoql8ups846S33uc5875HF/3+6nUtqO/EDXs3r16s52z+R7YC5b9Xq9rv78z/9c9fT0qHw+r6666ir11FNPKUD97//9v2fsf6DfY2BOW/nly5era6+99pDXbjAYjh5CKVNpCPpJ0Le//W2uuuoqQDsWvfWtb+WJJ56YVaSZz+dZuHAhH/rQh2alXjSbTbLZLGvXruWyyy57Ni/BYDAYDAbDccYjjzzCOeecw1e+8hXe+ta3HuvhGAyGZ4BJ1TsA55xzDnEcMzIywiWXXDLnNhdffDFRFLF58+ZOznY7JH+0iq4NBoPBYDAcnzSbzVkunJ/5zGewLGtGTZrBYHhu8rwWTrVabYbbzdatW3nkkUfo6elhzZo1vPWtb+Ud73gHn/70pznnnHMYHR3lJz/5CWeeeSZXXnklr3zlKzn33HO54YYb+MxnPoOUkj//8z/nsssuY82aNcfwygwGg8FgMDzbfOITn+C3v/0tL3vZy3AchzvuuIM77riDP/3TP+04DxoMhucuz+tUvZ/+9Ke87GUvm/X6tddey6233topLP3yl7/M7t276evr48ILL+Tmm2/mjDPOAGBoaIj3vve9rF27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8tx2XRxCq9Vi5MiRZgs7NC/08MNb9x62YcMGvPnmmzh8+DCio6NtMdQOs2vRpHb3fXNq+/sSEREREZF67L6q3qJFi7Bz5078/e9/R3FxMebNm4c7d+5g1qxZAICXX37ZbPGIt99+GytXrsSuXbvQt29fVFRUoKKiAnV1dfY6hUd2Kd16QdSePkREREREZBt2L5ymTp2KjRs3YtWqVRg2bBiMRiMOHz4MPz8/AEBZWRnKy8uV/jt27MD9+/fxq1/9CgEBAcq2ceNGe53Cj3IpfRKe8Wm5P2k4iyYiIiIios6mUywOkZKSgpSUFIttBoPB7PtLly6pPyAb2ZaSgIMHD6JodQLvnyUiIiIi6sTs/o4TERERERFRZ8fCiYiIiIiIyAoWTkRERERERFawcCIiIiIiIrKChRMREREREZEVLJyIiIiIiIisYOFERERERERkBQsnIiIiIiIiK1g4ERERERERWcHCiYiIiIiIyAoWTkRERERERFawcCIiIiIiIrKChRMREREREZEVTvYegK2JCACgpqbGziMBTCYT6uvrUVNTA2dnZ3sPp0tixupivupivupivupivupivupivurrLBk31wTNNUJbul3hVFtbCwAICgqy80iIiIiIiKgzqK2thaenZ5t9NNKe8qoLaWpqwrVr19CjRw9oNBq7jqWmpgZBQUG4fPkyPDw87DqWrooZq4v5qov5qov5qov5qov5qov5qq+zZCwiqK2tRWBgIBwc2v4UU7d7x8nBwQF9+vSx9zDMeHh48JdSZcxYXcxXXcxXXcxXXcxXXcxXXcxXfZ0hY2vvNDXj4hBERERERERWsHAiIiIiIiKygoWTHel0OqSlpUGn09l7KF0WM1YX81UX81UX81UX81UX81UX81Xf45hxt1scgoiIiIiI6FHxHSciIiIiIiIrWDgRERERERFZwcKJiIiIiIjIChZOREREREREVrBwsqNt27ahb9++cHFxQUxMDE6dOmXvIXU6q1evhkajMdvCw8OV9nv37iE5ORlPPvkk3N3d8dJLL+H69etmxygrK8OkSZPg5uaGXr16YenSpXjw4IFZH4PBgBEjRkCn0yE0NBR79uyxxenZ3LFjxzB58mQEBgZCo9Hgk08+MWsXEaxatQoBAQFwdXVFfHw8zp8/b9bn1q1bSExMhIeHB7y8vDB79mzU1dWZ9SkoKMDYsWPh4uKCoKAgbNiwocVY9u3bh/DwcLi4uCAyMhIHDx7s8PO1B2sZz5w5s8WcnjBhglkfZmzZ+vXrMWrUKPTo0QO9evXCCy+8gJKSErM+trwmdLVreHvy/fnPf95i/s6dO9esD/O1bMeOHYiKilL+2Kder8ehQ4eUds7dn85axpy/HSc9PR0ajQYLFy5U9nWLOSxkFxkZGaLVamXXrl1y9uxZmTNnjnh5ecn169ftPbROJS0tTYYMGSLl5eXKduPGDaV97ty5EhQUJFlZWXL69GkZM2aM/OxnP1PaHzx4IBERERIfHy/5+fly8OBB8fHxkRUrVih9vvnmG3Fzc5NFixbJuXPnZMuWLeLo6CiHDx+26bnawsGDB+UPf/iD7N+/XwDIgQMHzNrT09PF09NTPvnkEzlz5ow8//zz0q9fP7l7967SZ8KECTJ06FD5/PPP5b///a+EhobKtGnTlPbq6mrx8/OTxMREKSoqkg8//FBcXV3lvffeU/qcOHFCHB0dZcOGDXLu3Dn54x//KM7OzlJYWKh6BmqzlvGMGTNkwoQJZnP61q1bZn2YsWUJCQmye/duKSoqEqPRKM8995wEBwdLXV2d0sdW14SueA1vT77PPPOMzJkzx2z+VldXK+3Mt3X//Oc/5bPPPpOvv/5aSkpK5I033hBnZ2cpKioSEc7djmAtY87fjnHq1Cnp27evREVFyYIFC5T93WEOs3Cyk9GjR0tycrLyfWNjowQGBsr69evtOKrOJy0tTYYOHWqxraqqSpydnWXfvn3KvuLiYgEgubm5IvL9i1gHBwepqKhQ+uzYsUM8PDykoaFBRESWLVsmQ4YMMTv21KlTJSEhoYPPpnN5+EV9U1OT+Pv7y5///GdlX1VVleh0Ovnwww9FROTcuXMCQL744gulz6FDh0Sj0cjVq1dFRGT79u3i7e2t5CsikpqaKmFhYcr3v/nNb2TSpElm44mJiZHXXnutQ8/R3lornKZMmdLqY5hx+1VWVgoAycnJERHbXhO6wzX84XxFvn/h+cMXSg9jvo/G29tb3n//fc5dFTVnLML52xFqa2tl4MCBkpmZaZZnd5nDvFXPDu7fv4+8vDzEx8cr+xwcHBAfH4/c3Fw7jqxzOn/+PAIDA9G/f38kJiairKwMAJCXlweTyWSWY3h4OIKDg5Ucc3NzERkZCT8/P6VPQkICampqcPbsWaXPD4/R3Ke7/SxKS0tRUVFhloWnpydiYmLM8vTy8kJ0dLTSJz4+Hg4ODjh58qTSZ9y4cdBqtUqfhIQElJSU4Pbt20qf7py5wWBAr169EBYWhnnz5uHmzZtKGzNuv+rqagBAz549AdjumtBdruEP59ts79698PHxQUREBFasWIH6+nqljfm2T2NjIzIyMnDnzh3o9XrOXRU8nHEzzt+fJjk5GZMmTWqRQXeZw06qPwO18N1336GxsdFs4gCAn58fvvrqKzuNqnOKiYnBnj17EBYWhvLycqxZswZjx45FUVERKioqoNVq4eXlZfYYPz8/VFRUAAAqKios5tzc1lafmpoa3L17F66uriqdXefSnIelLH6YVa9evczanZyc0LNnT7M+/fr1a3GM5jZvb+9WM28+Rlc2YcIE/PKXv0S/fv1w8eJFvPHGG5g4cSJyc3Ph6OjIjNupqakJCxcuRGxsLCIiIgDAZteE27dvd/lruKV8AWD69OkICQlBYGAgCgoKkJqaipKSEuzfvx8A87WmsLAQer0e9+7dg7u7Ow4cOIDBgwfDaDRy7naQ1jIGOH9/qoyMDHz55Zf44osvWrR1l+svCyfq1CZOnKh8HRUVhZiYGISEhOCjjz7qNgUNdS2//e1vla8jIyMRFRWFAQMGwGAwIC4uzo4je7wkJyejqKgIx48ft/dQuqTW8n311VeVryMjIxEQEIC4uDhcvHgRAwYMsPUwHzthYWEwGo2orq7Gxx9/jBkzZiAnJ8few+pSWst48ODBnL8/weXLl7FgwQJkZmbCxcXF3sOxG96qZwc+Pj5wdHRssdLI9evX4e/vb6dRPR68vLwwaNAgXLhwAf7+/rh//z6qqqrM+vwwR39/f4s5N7e11cfDw6NbFWfNebQ1L/39/VFZWWnW/uDBA9y6datDMu+O879///7w8fHBhQsXADDj9khJScG//vUvZGdno0+fPsp+W10Tuvo1vLV8LYmJiQEAs/nLfFun1WoRGhqKkSNHYv369Rg6dCg2b97MuduBWsvYEs7f9svLy0NlZSVGjBgBJycnODk5IScnB++++y6cnJzg5+fXLeYwCyc70Gq1GDlyJLKyspR9TU1NyMrKMrsPl1qqq6vDxYsXERAQgJEjR8LZ2dksx5KSEpSVlSk56vV6FBYWmr0QzczMhIeHh/LWvV6vNztGc5/u9rPo168f/P39zbKoqanByZMnzfKsqqpCXl6e0ufo0aNoampS/gPS6/U4duwYTCaT0iczMxNhYWHw9vZW+jDz7125cgU3b95EQEAAAGbcFhFBSkoKDhw4gKNHj7a4XdFW14Sueg23lq8lRqMRAMzmL/Ntv6amJjQ0NHDuqqg5Y0s4f9svLi4OhYWFMBqNyhYdHY3ExETl624xh1VffoIsysjIEJ1OJ3v27JFz587Jq6++Kl5eXmYrjZDI4sWLxWAwSGlpqZw4cULi4+PFx8dHKisrReT7pS+Dg4Pl6NGjcvr0adHr9aLX65XHNy99OX78eDEajXL48GHx9fW1uPTl0qVLpbi4WLZt29ZllyOvra2V/Px8yc/PFwCyadMmyc/Pl2+//VZEvl+O3MvLSz799FMpKCiQKVOmWFyOfPjw4XLy5Ek5fvy4DBw40Gyp7KqqKvHz85OkpCQpKiqSjIwMcXNza7FUtpOTk2zcuFGKi4slLS3tsV8qu1lbGdfW1sqSJUskNzdXSktL5ciRIzJixAgZOHCg3Lt3TzkGM7Zs3rx54unpKQaDwWw54fr6eqWPra4JXfEabi3fCxcuyJ/+9Cc5ffq0lJaWyqeffir9+/eXcePGKcdgvq1bvny55OTkSGlpqRQUFMjy5ctFo9HIf/7zHxHh3O0IbWXM+dvxHl6lsDvMYRZOdrRlyxYJDg4WrVYro0ePls8//9zeQ+p0pk6dKgEBAaLVaqV3794ydepUuXDhgtJ+9+5dmT9/vnh7e4ubm5u8+OKLUl5ebnaMS5cuycSJE8XV1VV8fHxk8eLFYjKZzPpkZ2fLsGHDRKvVSv/+/WX37t22OD2by87OFgAtthkzZojI90uSr1y5Uvz8/ESn00lcXJyUlJSYHePmzZsybdo0cXd3Fw8PD5k1a5bU1taa9Tlz5ow8/fTTotPppHfv3pKent5iLB999JEMGjRItFqtDBkyRD777DPVztuW2sq4vr5exo8fL76+vuLs7CwhISEyZ86cFhd7ZmyZpVwBmP2+2vKa0NWu4dbyLSsrk3HjxknPnj1Fp9NJaGioLF261Ozv4Igw39b87ne/k5CQENFqteLr6ytxcXFK0STCudsR2sqY87fjPVw4dYc5rBERUf99LSIiIiIioscXP+NERERERERkBQsnIiIiIiIiK1g4ERERERERWcHCiYiIiIiIyAoWTkRERERERFawcCIiIiIiIrKChRMREREREZEVLJyIiIiIiIisYOFERET0E1y6dAkajQZGo9HeQyEiIhWxcCIiIpuaOXMmXnjhBXsPo91KS0sxffp0BAYGwsXFBX369MGUKVPw1VdfAQCCgoJQXl6OiIgIO4+UiIjU5GTvARAREXVWJpMJzz77LMLCwrB//34EBATgypUrOHToEKqqqgAAjo6O8Pf3t+9AiYhIdXzHiYiIOpWcnByMHj0aOp0OAQEBWL58OR48eKC0NzU1YcOGDQgNDYVOp0NwcDDWrVsHADAYDNBoNEpRAwBGoxEajQaXLl0CAHz77beYPHkyvL298cQTT2DIkCE4ePCgxbGcPXsWFy9exPbt2zFmzBiEhIQgNjYWa9euxZgxYwC0vFVv5syZ0Gg0LTaDwQAAaGhowJIlS9C7d2888cQTiImJUdqIiKjzYuFERESdxtWrV/Hcc89h1KhROHPmDHbs2IG//e1vWLt2rdJnxYoVSE9Px8qVK3Hu3Dl88MEH8PPza/dzJCcno6GhAceOHUNhYSHefvttuLu7W+zr6+sLBwcHfPzxx2hsbGzX8Tdv3ozy8nJlW7BgAXr16oXw8HAAQEpKCnJzc5GRkYGCggL8+te/xoQJE3D+/Pl2nwMREdkeb9UjIqJOY/v27QgKCsLWrVuh0WgQHh6Oa9euITU1FatWrcKdO3ewefNmbN26FTNmzAAADBgwAE8//XS7n6OsrAwvvfQSIiMjAQD9+/dvtW/v3r3x7rvvYtmyZVizZg2io6Pxi1/8AomJia0+ztPTE56engCA/fv347333sORI0fg7++PsrIy7N69G2VlZQgMDAQALFmyBIcPH8bu3bvx1ltvtfs8iIjItviOExERdRrFxcXQ6/XQaDTKvtjYWNTV1eHKlSsoLi5GQ0MD4uLifvRzvP7661i7di1iY2ORlpaGgoKCNvsnJyejoqICe/fuhV6vx759+zBkyBBkZma2+bj8/HwkJSVh69atiI2NBQAUFhaisbERgwYNgru7u7Ll5OTg4sWLP/qciIhIfSyciIjoseHq6tpmu4PD9/+tiYiyz2QymfV55ZVX8M033yApKQmFhYWIjo7Gli1b2jxujx49MHnyZKxbtw5nzpzB2LFjzW4ffFhFRQWef/55vPLKK5g9e7ayv66uDo6OjsjLy4PRaFS24uJibN68uc0xEBGRfbFwIiKiTuOpp55Cbm6uWeFz4sQJ9OjRA3369MHAgQPh6uqKrKwsi4/39fUFAJSXlyv7LP19paCgIMydOxf79+/H4sWLsXPnznaPsfkWwjt37lhsv3fvHqZMmYLw8HBs2rTJrG348OFobGxEZWUlQkNDzTauzEdE1LnxM05ERGRz1dXVLQqaJ598EvPnz8df/vIX/P73v0dKSgpKSkqQlpaGRYsWwcHBAS4uLkhNTcWyZcug1WoRGxuLGzdu4OzZs5g9ezZCQ0MRFBSE1atXY926dfj666/xzjvvmD3PwoULMXHiRAwaNAi3b99GdnY2nnrqKYvjNBqNSEtLQ1JSEgYPHgytVoucnBzs2rULqampFh/z2muv4fLly8jKysKNGzeU/T179sSgQYOQmJiIl19+Ge+88w6GDx+OGzduICsrC1FRUZg0adJPC5aIiNQjRERENjRjxgwB0GKbPXu2iIgYDAYZNWqUaLVa8ff3l9TUVDGZTMrjGxsbZe3atRISEiLOzs4SHBwsb731ltJ+/PhxiYyMFBcXFxk7dqzs27dPAEhpaamIiKSkpMiAAQNEp9OJr6+vJCUlyXfffWdxrDdu3JDXX39dIiIixN3dXXr06CGRkZGyceNGaWxsFBGR0tJSASD5+fkiIhISEmLx/LKzs0VE5P79+7Jq1Srp27evODs7S0BAgLz44otSUFDQwUkTEVFH0oj84H4IIiIiIiIiaoGfcSIiIiIiIrKChRMREREREZEVLJyIiIiIiIisYOFERERERERkBQsnIiIiIiIiK1g4ERERERERWcHCiYiIiIiIyAoWTkRERERERFawcCIiIiIiIrKChRMREREREZEVLJyIiIiIiIis+D+7H/wIf0FJTAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plt.figure(figsize=(10, 6))\n", + "# plt.scatter(panda_df[\"locusSize\"], panda_df[\"locusLength\"], alpha=0.5)\n", + "# plt.title(\"Scatter Plot of Locus Size vs Locus Length\")\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Locus Length\")\n", + "# plt.grid(True)\n", + "# plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-iQynFIia-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/l2g_benchmark.ipynb b/notebooks/l2g_benchmark.ipynb deleted file mode 100644 index 857d25088..000000000 --- a/notebooks/l2g_benchmark.ipynb +++ /dev/null @@ -1,603 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Benchmarking L2G predictions\n", - "\n", - "The objective of this notebook is to compare the new implementation of L2G with the last results we display in production (22.09.1).\n", - "\n", - "The notebook is divided in 3 parts:\n", - "1. Data preparation\n", - "2. Describe the data\n", - "3. Compare the results\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Setting default log level to \"WARN\".\n", - "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "23/12/11 16:18:49 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" - ] - } - ], - "source": [ - "from datetime import datetime\n", - "from gentropy.dataset.study_locus import StudyLocus\n", - "from gentropy.dataset.l2g_prediction import L2GPrediction\n", - "from gentropy.common.session import Session\n", - "\n", - "import pyspark.sql.functions as f\n", - "from pyspark.sql import DataFrame\n", - "\n", - "import wandb\n", - "\n", - "%matplotlib inline\n", - "\n", - "session = Session(spark_uri=\"local[*]\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data preparation" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def prepare_predictions(credible_set: StudyLocus, predictions: L2GPrediction) -> DataFrame:\n", - " \"\"\"Prepares predictions dataframe for testing and comparison.\"\"\"\n", - " return (\n", - " credible_set.df\n", - " .select(\"studyLocusId\", \"variantId\", \"studyId\").distinct()\n", - " .join(\n", - " predictions.df, on=\"studyLocusId\"\n", - " )\n", - " .select(\"studyLocusId\", \"variantId\", \"studyId\", \"geneId\", \"score\")\n", - " .distinct()\n", - " )\n", - "\n", - "def prepare_production_predictions(old_predictions: DataFrame) -> DataFrame:\n", - " \"\"\"Prepares L2G predictions for testing and comparison.\"\"\"\n", - " return (\n", - " old_predictions\n", - " .select(\n", - " f.col(\"study_id\").alias(\"studyId\"),\n", - " f.concat_ws(\"_\", f.col(\"chrom\"), f.col(\"pos\"), f.col(\"ref\"), f.col(\"alt\")).alias(\"variantId\"),\n", - " f.col(\"gene_id\").alias(\"geneId\"),\n", - " f.col(\"y_proba_full_model\").alias(\"score\"),\n", - " )\n", - " .withColumn(\"studyLocusId\", StudyLocus.assign_study_locus_id(f.col(\"studyId\"), f.col(\"variantId\")))\n", - " .distinct()\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "# RAW DATA\n", - "credible_set_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/credible_set\"\n", - "predictions_path = \"gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/l2g_predictions\"\n", - "old_predictions_path = \"gs://genetics-portal-dev-data/22.09.1/outputs/l2g\"\n", - "\n", - "predictions = L2GPrediction.from_parquet(session, predictions_path)\n", - "old_predictions = session.spark.read.parquet(old_predictions_path)\n", - "credible_set = StudyLocus.from_parquet(session, credible_set_path, recursiveFileLookup=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "predictions_prepared = prepare_predictions(credible_set, predictions).persist()\n", - "old_predictions_prepared = prepare_production_predictions(old_predictions).persist()\n", - "\n", - "joining_cols = [\"studyLocusId\", \"geneId\", \"variantId\", \"studyId\"]\n", - "comparison_df = (\n", - " predictions_prepared.selectExpr(*joining_cols, \"score as new_score\")\n", - " .join(\n", - " old_predictions_prepared.selectExpr(*joining_cols, \"score as old_score\"), on=joining_cols, how=\"inner\"\n", - " )\n", - " .distinct()\n", - " .persist()\n", - " )\n", - "\n", - "comparison_output_path = f\"gs://ot-team/irene/l2g_results_comparison-{datetime.today().strftime('%Y-%m-%d')}\"\n", - "# comparison_df.write.parquet(\"gs://ot-team/irene/l2g_results_comparison\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data description\n", - "\n", - "Note: Comparison_df is the result of intersecting the L2G datasets with both the production and the new implementation." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "COUNT PER DATASET\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "predictions_prepared: 9061746\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "old_predictions_prepared: 4083797\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 23:====================================================> (196 + 4) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "comparison_df: 2194371\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "## 1. L2G predicted credible sets count\n", - "\n", - "datasets = {\n", - " \"predictions_prepared\": predictions_prepared,\n", - " \"old_predictions_prepared\": old_predictions_prepared,\n", - " \"comparison_df\": comparison_df\n", - "}\n", - "\n", - "print(\"COUNT PER DATASET\")\n", - "for dataset in datasets.items():\n", - " print(f\"{dataset[0]}: {dataset[1].count()}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AVERAGE SCORES PER DATASET\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "predictions_prepared: 0.20072320074989783\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "old_predictions_prepared: 0.0720378814046517\n", - "MEDIAN SCORE PER DATASET\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "predictions_prepared: 0.023215007036924362\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 74:==============================================> (171 + 8) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "old_predictions_prepared: 0.012324056588113308\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "## 2. Descriptive stats for L2G scores\n", - "\n", - "print(\"AVERAGE SCORES PER DATASET\")\n", - "for dataset in datasets.items():\n", - " if dataset[0] != \"comparison_df\":\n", - " print(f\"{dataset[0]}: {dataset[1].agg(f.avg('score')).collect()[0][0]}\")\n", - "\n", - "print(\"MEDIAN SCORE PER DATASET\")\n", - "for dataset in datasets.items():\n", - " if dataset[0] != \"comparison_df\":\n", - " print(f\"{dataset[0]}: {dataset[1].approxQuantile('score',[0.5],0.1)[0]}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# OF ASSOCIATIONS WITH SCORE > 0.9\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "predictions_prepared: 5275 (0.06 from total)\n", - "old_predictions_prepared: 3942 (0.1 from total)\n" - ] - } - ], - "source": [ - "## How many associations with a score > 0.9\n", - "\n", - "print(\"# OF ASSOCIATIONS WITH SCORE > 0.9\")\n", - "for dataset in datasets.items():\n", - " if dataset[0] != \"comparison_df\":\n", - " print(f\"{dataset[0]}: {dataset[1].filter(f.col('score') >= 0.9).count()} ({round(dataset[1].filter(f.col('score') >= 0.9).count()/dataset[1].count() * 100, 2)} from total)\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Results comparison\n", - "\n", - "The comparisons dataset represents the intersection of the predictions of the production and the new implementation. The objective is to compare the L2G scores of both implementations for the same studyLoci." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
studyLocusIdgeneIdvariantIdstudyIdnew_scoreold_score
0-9221872607204368224ENSG0000006571719_3414090_G_AGCST0102410.0018870.008250
1-9219397145747036852ENSG0000016805611_65619907_T_AGCST0072340.0381770.014908
2-9219397145747036852ENSG0000017537611_65619907_T_AGCST0072340.0158460.011380
3-9217975156633736203ENSG000001874756_26325235_T_CGCST0094560.0396680.010985
4-9216978755013122322ENSG0000015761721_41816125_G_AGCST0059450.2710090.024520
\n", - "
" - ], - "text/plain": [ - " studyLocusId geneId variantId studyId \\\n", - "0 -9221872607204368224 ENSG00000065717 19_3414090_G_A GCST010241 \n", - "1 -9219397145747036852 ENSG00000168056 11_65619907_T_A GCST007234 \n", - "2 -9219397145747036852 ENSG00000175376 11_65619907_T_A GCST007234 \n", - "3 -9217975156633736203 ENSG00000187475 6_26325235_T_C GCST009456 \n", - "4 -9216978755013122322 ENSG00000157617 21_41816125_G_A GCST005945 \n", - "\n", - " new_score old_score \n", - "0 0.001887 0.008250 \n", - "1 0.038177 0.014908 \n", - "2 0.015846 0.011380 \n", - "3 0.039668 0.010985 \n", - "4 0.271009 0.024520 " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "comparison_pdf = comparison_df.toPandas()\n", - "comparison_pdf.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SCORES CORRELATION 0.3968047070256464\n", - "Split by chromosome...\n", - "Chromosome 1: 0.4283002148537705\n", - "Chromosome 10: 0.4548083324805242\n", - "Chromosome 11: 0.3952137911268187\n", - "Chromosome 12: 0.4185634370780096\n", - "Chromosome 13: 0.42117917239984404\n", - "Chromosome 14: 0.39845735792304493\n", - "Chromosome 15: 0.40346861517903765\n", - "Chromosome 16: 0.39846240000598415\n", - "Chromosome 17: 0.395304979654295\n", - "Chromosome 18: 0.41437506238370103\n", - "Chromosome 19: 0.4425118135710343\n", - "Chromosome 2: 0.3889598461816933\n", - "Chromosome 20: 0.43686865328167446\n", - "Chromosome 21: 0.3849138600053731\n", - "Chromosome 22: 0.43046292359639526\n", - "Chromosome 3: 0.4111657046267522\n", - "Chromosome 4: 0.4291713768129795\n", - "Chromosome 5: 0.39581618467547613\n", - "Chromosome 6: 0.37446130946623823\n", - "Chromosome 7: 0.4059565003311735\n", - "Chromosome 8: 0.44203370064434944\n", - "Chromosome 9: 0.40815294157407295\n", - "Chromosome X: 0.12625008528673395\n" - ] - } - ], - "source": [ - "## Correlation between old and new scores\n", - "\n", - "overall_corr = comparison_pdf[\"old_score\"].corr(comparison_pdf[\"new_score\"])\n", - "print(\"SCORES CORRELATION\", overall_corr)\n", - "\n", - "print(\"Split by chromosome...\")\n", - "\n", - "comparison_pdf[\"chromosome\"] = comparison_pdf[\"variantId\"].str.split(\"_\", expand=True)[0]\n", - "\n", - "for group in comparison_pdf.sort_values(\"chromosome\").groupby(\"chromosome\"):\n", - " corr = group[1][\"old_score\"].corr(group[1][\"new_score\"])\n", - " print(f\"Chromosome {group[0]}: {corr}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Add correlation coefficient to finished run in W&B\n", - "# See dashboard here to find run ID: https://wandb.ai/open-targets/otg_l2g/table?workspace=user-opentargets\n", - "my_run = \"4cyi1qvz\"\n", - "\n", - "wandb.init(id=my_run, project=\"otg_l2g\", resume=True)\n", - "wandb.log({\"correlationProduction\": overall_corr})\n", - "wandb.finish()" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB7pklEQVR4nO3dd3hUZdoG8HsySSa9kEpCICREpBcp0kFRVBRxdRdxFeQDdRXEFV27YAV210Vc1I+VtYuIoquuIIL0Ji0EUGkhCYSSZNIrqef7gy9jJnPmnHnPnJlJuX/Xlesi5z3nzJtJyHnylucxSJIkgYiIiKiN8PJ0B4iIiIj0xOCGiIiI2hQGN0RERNSmMLghIiKiNoXBDREREbUpDG6IiIioTWFwQ0RERG0KgxsiIiJqUxjcEBERUZvC4IbIhV544QUYDAa3vNbYsWMxduxYy+dbt26FwWDAmjVr3PL69957LxITE93yWlqVl5dj1qxZiI2NhcFgwJ///GdPd4mIXIDBDZGDPvjgAxgMBsuHn58f4uLiMGHCBPzzn/9EWVmZLq9z4cIFvPDCC0hLS9PlfnpqyX1zxMKFC/HBBx/gwQcfxMcff4x77rnH7rmJiYm4+eabFe/31VdfYcqUKUhKSkJAQAC6d++Oxx57DMXFxbLnV1dXY9myZRg5ciTCw8Ph6+uLuLg4TJo0CatWrUJ9fb0zXx4R/T9vT3eAqLV56aWX0LVrV9TW1iInJwdbt27Fn//8ZyxZsgTffvst+vbtazn3ueeew1NPPSV0/wsXLuDFF19EYmIi+vfv7/B1GzZsEHodLZT6tmLFCjQ0NLi8D87YvHkzrr76aixYsECX+91///2Ii4vD3Xffjc6dO+Po0aN48803sW7dOqSmpsLf399yrtlsxo033oiDBw9iwoQJeO6559ChQwfk5OTgxx9/xF133YX09HQ8//zzuvSNqD1jcEMk6MYbb8SgQYMsnz/99NPYvHkzbr75ZkyaNAnHjh2zPNS8vb3h7e3a/2aVlZUICAiAr6+vS19HjY+Pj0df3xF5eXno2bOnbvdbs2aN1VQgAFx11VWYPn06Vq5ciVmzZlmO33PPPTh06BC+/PJL/O53v7O65umnn8aBAwdw4sQJ3frmKg0NDaipqYGfn5+nu0JkF6eliHRwzTXX4Pnnn8eZM2fwySefWI7LrbnZuHEjRo4cibCwMAQFBaF79+545plnAFxeJzN48GAAwIwZMyxTYB988AGAy+tqevfujYMHD2L06NEICAiwXNt8zU2j+vp6PPPMM4iNjUVgYCAmTZqE7Oxsq3MSExNx77332lzb9J5qfZNbc1NRUYHHHnsMCQkJMJlM6N69O1577TVIkmR1nsFgwJw5c/D111+jd+/eMJlM6NWrF9avXy//hjeTl5eHmTNnIiYmBn5+fujXrx8+/PBDS3vj+qPMzEysXbvW0vesrCyH7m+P3Pt92223AQCOHTtmObZnzx788MMPuP/++20Cm0aDBg3CH//4R9XXVPr5aXTp0iW88MILuOKKK+Dn54eOHTvid7/7HU6fPm05R/R7s3LlSvTq1Qsmk8nyfTl//jz+53/+BzExMZbv2XvvvWfT52XLlqFXr14ICAhAeHg4Bg0ahE8//VT1ayXSiiM3RDq555578Mwzz2DDhg247777ZM/55ZdfcPPNN6Nv37546aWXYDKZkJ6ejl27dgEAevTogZdeegnz58/H/fffj1GjRgEAhg8fbrlHQUEBbrzxRtx55524++67ERMTo9ivV199FQaDAU8++STy8vKwdOlSjB8/HmlpaVbTJmoc6VtTkiRh0qRJ2LJlC2bOnIn+/fvjhx9+wF/+8hecP38er7/+utX5O3fuxFdffYWHHnoIwcHB+Oc//4nbb78dZ8+eRUREhN1+VVVVYezYsUhPT8ecOXPQtWtXfPHFF7j33ntRXFyMRx55BD169MDHH3+MRx99FJ06dcJjjz0GAIiKinL463dUTk4OACAyMtJy7L///S8A4O6773bq3mo/P8DlYPbmm2/Gpk2bcOedd+KRRx5BWVkZNm7ciJ9//hnJycnC35vNmzfj888/x5w5cxAZGYnExETk5ubi6quvtgQ/UVFR+P777zFz5kyUlpZaFmuvWLECc+fOxR133IFHHnkEly5dwpEjR7B3717cddddTr0fRHZJROSQ999/XwIg7d+/3+45oaGh0oABAyyfL1iwQGr63+z111+XAEhms9nuPfbv3y8BkN5//32btjFjxkgApOXLl8u2jRkzxvL5li1bJABSfHy8VFpaajn++eefSwCkN954w3KsS5cu0vTp01XvqdS36dOnS126dLF8/vXXX0sApFdeecXqvDvuuEMyGAxSenq65RgAydfX1+rY4cOH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K1ciMTERwOWg6cYbb8SuXbvwySef4Ndff8XixYthNBoBAAcPHsQf/vAH3HnnnTh69CheeOEFPP/88/jggw+sXuO1115Dv379cOjQITz//PM4ffo0brjhBtx+++04cuQIVq9ejZ07d2LOnDn6vLFEJM7TlTuJqPUbM2aMNHLkSKtjgwcPlp588klpx44dUkhIiHTp0iWr9uTkZOlf//qXJEmSNG/ePGnixImSJEnS0qVLpSlTpkj9+vWTvv/+e0mSJKlbt27SO++8o9qPhx9+WLrmmmukhoYGm7YffvhB8vLykk6cOCF77V133SVdd911Vsf+8pe/SD179rR83qVLF2ny5MlW58ycOVO6//77rY7t2LFD8vLykqqqqlT7TET648gNEemib9++Vp937NgReXl5OHz4MMrLyxEREYGgoCDLR2ZmJk6fPg0AGDNmDHbu3In6+nps27YNY8eOxdixY7F161ZcuHAB6enpGDt2rGof7r33XqSlpaF79+6YO3cuNmzYYGlLS0tDp06dcMUVV8hee+zYMYwYMcLq2IgRI3Dq1CnU19dbjg0aNMjqnMOHD+ODDz6w+tomTJiAhoYGZGZmqvaZiPTn7ekOEFHb4OPjY/W5wWBAQ0MDysvL0bFjR8u0U1NhYWEAgNGjR6OsrAypqanYvn07Fi5ciNjYWCxevBj9+vVDXFwcUlJSVPswcOBAZGZm4vvvv8ePP/6IP/zhDxg/fjzWrFkDf39/Pb5MBAYGWn1eXl6OBx54AHPnzrU5t3Pnzrq8JhGJYXBDRC41cOBA5OTkwNvb27L+pbmwsDD07dsXb775Jnx8fHDllVciOjoaU6ZMwXfffefQeptGISEhmDJlCqZMmYI77rgDN9xwAwoLC9G3b1+cO3cOJ0+elB296dGjB3bt2mV1bNeuXbjiiiss63LsfX2//vorunXr5nAfici1OC1FRC41fvx4DBs2DJMnT8aGDRuQlZWF3bt349lnn7XskAIu77hauXKlJZDp0KEDevTogdWrVzsc3CxZsgSrVq3C8ePHcfLkSXzxxReIjY1FWFgYxowZg9GjR+P222/Hxo0bLSM869evBwA89thj2LRpE15++WWcPHkSH374Id588008/vjjiq/55JNPYvfu3ZgzZw7S0tJw6tQpfPPNN1xQTORBDG6IyKUMBgPWrVuH0aNHY8aMGbjiiitw55134syZM4iJibGcN2bMGNTX11utrRk7dqzNMSXBwcH429/+hkGDBmHw4MHIysrCunXr4OV1+Vfdl19+icGDB2Pq1Kno2bMnnnjiCct6moEDB+Lzzz/HZ599ht69e2P+/Pl46aWXcO+99yq+Zt++fbFt2zacPHkSo0aNwoABAzB//nzExcUJvU9EpB+DJEmSpztBREREpBeO3BAREVGbwuCGiFqNhQsXWm25bvpx4403erp7RNRCcFqKiFqNwsJCFBYWyrb5+/sjPj7ezT0iopaIwQ0RERG1KZyWIiIiojaFwQ0RERG1KQxuiIiIqE1hcENERERtCoMbIiIialMY3BAREVGbwuCGiIiI2hQGN0RERNSm/B+aYjrtMdzCDAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "comparison_pdf.plot.scatter(\n", - " x=\"new_score\",\n", - " y=\"old_score\",\n", - " title=\"Distribution of L2G scores\",\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/pics_benchmark.ipynb b/notebooks/pics_benchmark.ipynb index d8a2f6e83..0dd05b18b 100644 --- a/notebooks/pics_benchmark.ipynb +++ b/notebooks/pics_benchmark.ipynb @@ -1,904 +1,878 @@ { - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Benchmarking new PICS implementation\n", - "\n", - "The objective of this notebook is to compare the new implementation of PICS estimated on GWAS Catalog associations using gnomAD LD reference, against the previous implementation using 1000 genomes phase III LD reference. \n", - "\n", - "1. Describe the new dataset\n", - " - Number of signals covered.\n", - " - Number of signals dropped.\n", - "2. Copare with old PICS Dataset.\n", - " - Ξ” number of covered study (not particularly relevant given updates in GWAS Catalog)\n", - " - Ξ” number of covered peaks from studies found in the old release - might see increased coverage.\n", - " - Ξ” in the recovered credible set: number of variants, change in posterior probability.\n", - " - Ξ” in the average number of credible sets.\n", - "\n", - " " - ] - }, + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking new PICS implementation\n", + "\n", + "The objective of this notebook is to compare the new implementation of PICS estimated on GWAS Catalog associations using gnomAD LD reference, against the previous implementation using 1000 genomes phase III LD reference. \n", + "\n", + "1. Describe the new dataset\n", + " - Number of signals covered.\n", + " - Number of signals dropped.\n", + "2. Copare with old PICS Dataset.\n", + " - Ξ” number of covered study (not particularly relevant given updates in GWAS Catalog)\n", + " - Ξ” number of covered peaks from studies found in the old release - might see increased coverage.\n", + " - Ξ” in the recovered credible set: number of variants, change in posterior probability.\n", + " - Ξ” in the average number of credible sets.\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import pyspark.sql.functions as f\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.window import Window\n", + "\n", + "spark = SparkSession.builder.getOrCreate()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 Describing the new dataset\n", + "\n", + "1. Study count.\n", + "2. Association count.\n", + "3. Studies split.\n", + "4. Associations not resolved in LD set." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import pyspark.sql.functions as f\n", - "import pyspark.sql.types as t\n", - "from pyspark.sql import SparkSession, DataFrame\n", - "from pyspark.sql.window import Window\n", - "\n", - "spark = SparkSession.builder.getOrCreate()" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- chromosome: string (nullable = true)\n", + " |-- variantId: string (nullable = true)\n", + " |-- studyId: string (nullable = true)\n", + " |-- position: string (nullable = true)\n", + " |-- referenceAllele: string (nullable = true)\n", + " |-- alternateAllele: string (nullable = true)\n", + " |-- pValueMantissa: float (nullable = true)\n", + " |-- pValueExponent: integer (nullable = true)\n", + " |-- beta: string (nullable = true)\n", + " |-- beta_ci_lower: double (nullable = true)\n", + " |-- beta_ci_upper: double (nullable = true)\n", + " |-- odds_ratio: string (nullable = true)\n", + " |-- odds_ratio_ci_lower: double (nullable = true)\n", + " |-- odds_ratio_ci_upper: double (nullable = true)\n", + " |-- qualityControl: array (nullable = true)\n", + " | |-- element: string (containsNull = true)\n", + " |-- sampleSize: double (nullable = true)\n", + " |-- tagVariantId: string (nullable = true)\n", + " |-- R_overall: double (nullable = true)\n", + " |-- pics_mu: double (nullable = true)\n", + " |-- pics_std: double (nullable = true)\n", + " |-- pics_postprob: double (nullable = true)\n", + " |-- pics_95_perc_credset: boolean (nullable = true)\n", + " |-- pics_99_perc_credset: boolean (nullable = true)\n", + " |-- hasResolvedCredibleSet: boolean (nullable = false)\n", + "\n" + ] }, { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1 Describing the new dataset\n", - "\n", - "1. Study count.\n", - "2. Association count.\n", - "3. Studies split.\n", - "4. Associations not resolved in LD set." - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 82:> (0 + 1) / 1]\r" + ] }, { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "root\n", - " |-- chromosome: string (nullable = true)\n", - " |-- variantId: string (nullable = true)\n", - " |-- studyId: string (nullable = true)\n", - " |-- position: string (nullable = true)\n", - " |-- referenceAllele: string (nullable = true)\n", - " |-- alternateAllele: string (nullable = true)\n", - " |-- pValueMantissa: float (nullable = true)\n", - " |-- pValueExponent: integer (nullable = true)\n", - " |-- beta: string (nullable = true)\n", - " |-- beta_ci_lower: double (nullable = true)\n", - " |-- beta_ci_upper: double (nullable = true)\n", - " |-- odds_ratio: string (nullable = true)\n", - " |-- odds_ratio_ci_lower: double (nullable = true)\n", - " |-- odds_ratio_ci_upper: double (nullable = true)\n", - " |-- qualityControl: array (nullable = true)\n", - " | |-- element: string (containsNull = true)\n", - " |-- sampleSize: double (nullable = true)\n", - " |-- tagVariantId: string (nullable = true)\n", - " |-- R_overall: double (nullable = true)\n", - " |-- pics_mu: double (nullable = true)\n", - " |-- pics_std: double (nullable = true)\n", - " |-- pics_postprob: double (nullable = true)\n", - " |-- pics_95_perc_credset: boolean (nullable = true)\n", - " |-- pics_99_perc_credset: boolean (nullable = true)\n", - " |-- hasResolvedCredibleSet: boolean (nullable = false)\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 82:> (0 + 1) / 1]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0------------------------------------------\n", - " chromosome | 6 \n", - " variantId | 6_13215826_A_G \n", - " studyId | GCST000101_1 \n", - " position | 13215826 \n", - " referenceAllele | A \n", - " alternateAllele | G \n", - " pValueMantissa | 3.0 \n", - " pValueExponent | -6 \n", - " beta | null \n", - " beta_ci_lower | null \n", - " beta_ci_upper | null \n", - " odds_ratio | null \n", - " odds_ratio_ci_lower | null \n", - " odds_ratio_ci_upper | null \n", - " qualityControl | [Subsignificant p-value] \n", - " sampleSize | 1094.0 \n", - " tagVariantId | 6_13215826_A_G \n", - " R_overall | 1.0 \n", - " pics_mu | 5.522878745280337 \n", - " pics_std | 0.0 \n", - " pics_postprob | 0.12718888994626093 \n", - " pics_95_perc_credset | true \n", - " pics_99_perc_credset | true \n", - " hasResolvedCredibleSet | true \n", - "only showing top 1 row\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "new_study_locus = (\n", - " spark.read.parquet(\"gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/pics_credible_set/\")\n", - " .withColumn('pics_99_perc_credset', f.when(f.col('tagVariantId').isNull(), False).otherwise(f.col('pics_99_perc_credset')))\n", - " .withColumn(\n", - " 'hasResolvedCredibleSet', \n", - " f.when(\n", - " f.array_contains(\n", - " f.collect_set(f.col('pics_99_perc_credset')).over(Window.partitionBy('studyId', 'variantId')), \n", - " True\n", - " ),\n", - " True\n", - " ).otherwise(False)\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "\n", - "new_study_locus.printSchema()\n", - "new_study_locus.show(1, False, True)" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------------------\n", + " chromosome | 6 \n", + " variantId | 6_13215826_A_G \n", + " studyId | GCST000101_1 \n", + " position | 13215826 \n", + " referenceAllele | A \n", + " alternateAllele | G \n", + " pValueMantissa | 3.0 \n", + " pValueExponent | -6 \n", + " beta | null \n", + " beta_ci_lower | null \n", + " beta_ci_upper | null \n", + " odds_ratio | null \n", + " odds_ratio_ci_lower | null \n", + " odds_ratio_ci_upper | null \n", + " qualityControl | [Subsignificant p-value] \n", + " sampleSize | 1094.0 \n", + " tagVariantId | 6_13215826_A_G \n", + " R_overall | 1.0 \n", + " pics_mu | 5.522878745280337 \n", + " pics_std | 0.0 \n", + " pics_postprob | 0.12718888994626093 \n", + " pics_95_perc_credset | true \n", + " pics_99_perc_credset | true \n", + " hasResolvedCredibleSet | true \n", + "only showing top 1 row\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 11:45:49 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "[Stage 224:============================================> (173 + 16) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Study count: 35956\n", - "Association (unique study/variant pairs) count: 433108\n", - "Associations with resolved credible set: 381056 (88.0%)\n", - "Number of good (non-flagged) associations without resolved credible set: 39763 (9.2%)\n", - "Number of good (non-flagged) associations with resolved credible set: 260736 (60.2%)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "study_count = new_study_locus.select('studyId').distinct().count()\n", - "association_count = new_study_locus.select('studyId', 'variantId').distinct().count()\n", - "association_w_credible_set = new_study_locus.filter(f.col('hasResolvedCredibleSet')).persist()\n", - "credible_set_count = association_w_credible_set.select('studyId', 'variantId').distinct().count()\n", - "failed_w_ld = (\n", - " new_study_locus\n", - " # Selecting good associations without credible sets:\n", - " .filter(\n", - " (~f.col('hasResolvedCredibleSet')) & \n", - " (f.size(f.col('qualityControl'))>0)\n", - " )\n", - " # Get associations:\n", - " .select('studyId', 'variantId')\n", - " .distinct()\n", - " .count()\n", - ")\n", - "good_association_count = (\n", - " association_w_credible_set\n", - " # Drop failed associations:\n", - " .filter(f.size(f.col('qualityControl')) == 0)\n", - " .select('studyId', 'variantId')\n", - " .distinct()\n", - " .count()\n", - ")\n", - "\n", - "print(f'Study count: {study_count}')\n", - "print(f'Association (unique study/variant pairs) count: {association_count}')\n", - "print(f'Associations with resolved credible set: {credible_set_count} ({round(credible_set_count/association_count*100, 1)}%)')\n", - "print(f'Number of good (non-flagged) associations without resolved credible set: {failed_w_ld} ({round(failed_w_ld/association_count*100, 1)}%)')\n", - "print(f'Number of good (non-flagged) associations with resolved credible set: {good_association_count} ({round(good_association_count/association_count*100, 1)}%)')\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "new_study_locus = (\n", + " spark.read.parquet(\"gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/pics_credible_set/\")\n", + " .withColumn(\"pics_99_perc_credset\", f.when(f.col(\"tagVariantId\").isNull(), False).otherwise(f.col(\"pics_99_perc_credset\")))\n", + " .withColumn(\n", + " \"hasResolvedCredibleSet\",\n", + " f.when(\n", + " f.array_contains(\n", + " f.collect_set(f.col(\"pics_99_perc_credset\")).over(Window.partitionBy(\"studyId\", \"variantId\")),\n", + " True\n", + " ),\n", + " True\n", + " ).otherwise(False)\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "\n", + "new_study_locus.printSchema()\n", + "new_study_locus.show(1, False, True)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 11:45:49 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "[Stage 224:============================================> (173 + 16) / 200]\r" + ] }, { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Focusing only on the actual credible sets." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Study count: 35956\n", + "Association (unique study/variant pairs) count: 433108\n", + "Associations with resolved credible set: 381056 (88.0%)\n", + "Number of good (non-flagged) associations without resolved credible set: 39763 (9.2%)\n", + "Number of good (non-flagged) associations with resolved credible set: 260736 (60.2%)\n" + ] }, { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 11:57:56 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of resolved credible sets: 381056\n", - "Studies with resolved credible sets: 33723\n", - "Number of lead/tag pairs: 18722043\n" - ] - } - ], - "source": [ - "# Thu\n", - "credible_sets = new_study_locus.filter(f.col('pics_99_perc_credset')).persist()\n", - "resolved_assoc_count = credible_sets.select('studyId', 'variantId').distinct().count()\n", - "resolved_study_count = credible_sets.select('studyId').distinct().count()\n", - "lead_tag_pair_count = credible_sets.select('studyId', 'variantId', 'tagVariantId').distinct().count()\n", - "\n", - "grouped_credset_pdf = credible_sets.groupBy('studyId', 'variantId').count().toPandas()\n", - "\n", - "print(f'Number of resolved credible sets: {resolved_assoc_count}')\n", - "print(f'Studies with resolved credible sets: {resolved_study_count}')\n", - "print(f'Number of lead/tag pairs: {lead_tag_pair_count}')\n", - "\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "study_count = new_study_locus.select(\"studyId\").distinct().count()\n", + "association_count = new_study_locus.select(\"studyId\", \"variantId\").distinct().count()\n", + "association_w_credible_set = new_study_locus.filter(f.col(\"hasResolvedCredibleSet\")).persist()\n", + "credible_set_count = association_w_credible_set.select(\"studyId\", \"variantId\").distinct().count()\n", + "failed_w_ld = (\n", + " new_study_locus\n", + " # Selecting good associations without credible sets:\n", + " .filter(\n", + " (~f.col(\"hasResolvedCredibleSet\")) &\n", + " (f.size(f.col(\"qualityControl\"))>0)\n", + " )\n", + " # Get associations:\n", + " .select(\"studyId\", \"variantId\")\n", + " .distinct()\n", + " .count()\n", + ")\n", + "good_association_count = (\n", + " association_w_credible_set\n", + " # Drop failed associations:\n", + " .filter(f.size(f.col(\"qualityControl\")) == 0)\n", + " .select(\"studyId\", \"variantId\")\n", + " .distinct()\n", + " .count()\n", + ")\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Focusing only on the actual credible sets." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 11:57:56 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + " \r" + ] }, { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "grouped_credset_pdf.query('count < 500')['count'].hist(bins=100)" + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of resolved credible sets: 381056\n", + "Studies with resolved credible sets: 33723\n", + "Number of lead/tag pairs: 18722043\n" + ] + } + ], + "source": [ + "# Thu\n", + "credible_sets = new_study_locus.filter(f.col(\"pics_99_perc_credset\")).persist()\n", + "resolved_assoc_count = credible_sets.select(\"studyId\", \"variantId\").distinct().count()\n", + "resolved_study_count = credible_sets.select(\"studyId\").distinct().count()\n", + "lead_tag_pair_count = credible_sets.select(\"studyId\", \"variantId\", \"tagVariantId\").distinct().count()\n", + "\n", + "grouped_credset_pdf = credible_sets.groupBy(\"studyId\", \"variantId\").count().toPandas()\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" }, { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Credible sets with only one variant: 29536 (7.8)%\n", - "Median size of credible sets: 21.0\n" - ] - } - ], - "source": [ - "median_credset_size = grouped_credset_pdf['count'].median()\n", - "credsets_with_single = len(grouped_credset_pdf.query('count == 1'))\n", - "\n", - "print(f'Credible sets with only one variant: {credsets_with_single} ({round(credsets_with_single/len(grouped_credset_pdf)*100, 1)})%')\n", - "print(f'Median size of credible sets: {median_credset_size}')" + "data": { + "image/png": "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", + "text/plain": [ + "
" ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grouped_credset_pdf.query(\"count < 500\")[\"count\"].hist(bins=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Credible sets with only one variant: 29536 (7.8)%\n", + "Median size of credible sets: 21.0\n" + ] + } + ], + "source": [ + "median_credset_size = grouped_credset_pdf[\"count\"].median()\n", + "credsets_with_single = len(grouped_credset_pdf.query(\"count == 1\"))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 285:====================================> (139 + 8) / 200]\r" + ] }, { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 285:====================================> (139 + 8) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+---------------+-----+\n", - "| studyId| variantId|count|\n", - "+------------+---------------+-----+\n", - "|GCST90095125|17_46142465_T_A|11930|\n", - "|GCST90095124|17_46142465_T_A|11221|\n", - "|GCST006483_1|17_45608332_A_G| 9666|\n", - "| GCST011766|17_45846834_C_G| 9566|\n", - "|GCST006481_2|17_45608332_A_G| 9445|\n", - "|GCST006483_1|17_45605039_C_G| 8912|\n", - "|GCST006483_3|17_45605039_C_G| 8602|\n", - "|GCST006481_4|17_45605039_C_G| 8545|\n", - "|GCST006483_1|17_46770468_T_G| 7465|\n", - "|GCST006481_2|17_46770468_T_G| 7396|\n", - "|GCST006483_3|17_46770468_T_G| 7374|\n", - "|GCST006481_4|17_46770468_T_G| 7327|\n", - "|GCST001651_9|17_46257341_G_A| 6926|\n", - "|GCST90134596|17_45707983_T_C| 6748|\n", - "| GCST012099|17_45610951_A_G| 6603|\n", - "|GCST90104034|17_46152620_T_C| 6545|\n", - "| GCST012101|17_45610951_A_G| 6374|\n", - "|GCST90134597|17_45707983_T_C| 6372|\n", - "| GCST007692|17_45846834_C_G| 6331|\n", - "|GCST90013445|17_45996523_A_G| 5668|\n", - "|GCST008675_1|17_45733530_C_T| 5196|\n", - "|GCST004008_1|17_45749271_G_A| 5101|\n", - "|GCST006483_1|17_46785767_T_C| 4913|\n", - "|GCST006481_2|17_46785767_T_C| 4880|\n", - "| GCST007065|11_55736589_G_A| 4071|\n", - "|GCST90100220|10_73256607_T_A| 3897|\n", - "|GCST90095190|17_45913906_A_G| 3858|\n", - "|GCST90095190|17_46055092_G_A| 3855|\n", - "|GCST90095190|17_45609706_G_A| 3764|\n", - "|GCST000996_1|11_55368743_C_T| 3727|\n", - "+------------+---------------+-----+\n", - "only showing top 30 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "credible_sets.groupBy('studyId', 'variantId').count().filter(f.col('count') > 1000).orderBy('count', ascending=False).show(30)" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------+---------------+-----+\n", + "| studyId| variantId|count|\n", + "+------------+---------------+-----+\n", + "|GCST90095125|17_46142465_T_A|11930|\n", + "|GCST90095124|17_46142465_T_A|11221|\n", + "|GCST006483_1|17_45608332_A_G| 9666|\n", + "| GCST011766|17_45846834_C_G| 9566|\n", + "|GCST006481_2|17_45608332_A_G| 9445|\n", + "|GCST006483_1|17_45605039_C_G| 8912|\n", + "|GCST006483_3|17_45605039_C_G| 8602|\n", + "|GCST006481_4|17_45605039_C_G| 8545|\n", + "|GCST006483_1|17_46770468_T_G| 7465|\n", + "|GCST006481_2|17_46770468_T_G| 7396|\n", + "|GCST006483_3|17_46770468_T_G| 7374|\n", + "|GCST006481_4|17_46770468_T_G| 7327|\n", + "|GCST001651_9|17_46257341_G_A| 6926|\n", + "|GCST90134596|17_45707983_T_C| 6748|\n", + "| GCST012099|17_45610951_A_G| 6603|\n", + "|GCST90104034|17_46152620_T_C| 6545|\n", + "| GCST012101|17_45610951_A_G| 6374|\n", + "|GCST90134597|17_45707983_T_C| 6372|\n", + "| GCST007692|17_45846834_C_G| 6331|\n", + "|GCST90013445|17_45996523_A_G| 5668|\n", + "|GCST008675_1|17_45733530_C_T| 5196|\n", + "|GCST004008_1|17_45749271_G_A| 5101|\n", + "|GCST006483_1|17_46785767_T_C| 4913|\n", + "|GCST006481_2|17_46785767_T_C| 4880|\n", + "| GCST007065|11_55736589_G_A| 4071|\n", + "|GCST90100220|10_73256607_T_A| 3897|\n", + "|GCST90095190|17_45913906_A_G| 3858|\n", + "|GCST90095190|17_46055092_G_A| 3855|\n", + "|GCST90095190|17_45609706_G_A| 3764|\n", + "|GCST000996_1|11_55368743_C_T| 3727|\n", + "+------------+---------------+-----+\n", + "only showing top 30 rows\n", + "\n" + ] }, { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparing with old dataset\n", - "\n", - "- Data: `gs://genetics-portal-dev-staging/v2d/220210/ld.parquet`" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "credible_sets.groupBy(\"studyId\", \"variantId\").count().filter(f.col(\"count\") > 1000).orderBy(\"count\", ascending=False).show(30)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing with old dataset\n", + "\n", + "- Data: `gs://genetics-portal-dev-staging/v2d/220210/ld.parquet`" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 336:===================================================> (16 + 1) / 17]\r" + ] }, { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 336:===================================================> (16 + 1) / 17]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of lead/tag count: 19406519\n", - "NUmber of studies covered: 18349\n", - "Number of associations covered: 265715\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "old_study_locus = (\n", - " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220210/ld.parquet\")\n", - " .select(\n", - " f.col('study_id').alias(\"studyId\"), \n", - " f.concat_ws(\"_\", f.col(\"lead_chrom\"), f.col(\"lead_pos\"), f.col(\"lead_ref\"), f.col(\"lead_alt\")).alias(\"variantId\"), \n", - " f.concat_ws(\"_\", f.col(\"tag_chrom\"), f.col(\"tag_pos\"), f.col(\"tag_ref\"), f.col(\"tag_alt\")).alias(\"tagVariantId\"),\n", - " 'pics_postprob',\n", - " 'pics_95perc_credset',\n", - " 'pics_99perc_credset'\n", - " )\n", - " .distinct()\n", - ")\n", - "lead_tag_pair_count = old_study_locus.count()\n", - "study_count = old_study_locus.select('studyId').distinct().count()\n", - "association_count = old_study_locus.select('studyId', 'variantId').distinct().count()\n", - "\n", - "print(f'Number of lead/tag count: {lead_tag_pair_count}')\n", - "print(f'NUmber of studies covered: {study_count}')\n", - "print(f'Number of associations covered: {association_count}')\n" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of lead/tag count: 19406519\n", + "NUmber of studies covered: 18349\n", + "Number of associations covered: 265715\n" + ] }, { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 13:53:16 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The median number of tag size: 21.0\n", - "Number of associations with single credible set: 9231\n", - "Number of associations with more than 1000 tags set: 441\n", - "+-------------+---------------+-----+\n", - "| studyId| variantId|count|\n", - "+-------------+---------------+-----+\n", - "| GCST001482|17_45900461_C_T| 3685|\n", - "| GCST90018953|17_45856424_G_T| 3684|\n", - "| GCST007692|17_45846834_C_G| 3649|\n", - "| GCST90018960|17_45761354_C_T| 3360|\n", - "| GCST90018996|17_46112544_A_G| 3348|\n", - "| GCST90091060|17_45873075_C_A| 3295|\n", - "| GCST002970|17_45846317_A_G| 3294|\n", - "| GCST001548|17_45846853_T_C| 3294|\n", - "| GCST007328|17_45887201_A_C| 3294|\n", - "| GCST007430|17_45887201_A_C| 3294|\n", - "| GCST010701|17_45855805_C_T| 3294|\n", - "| GCST001126|17_45846317_A_G| 3294|\n", - "| GCST012009|17_45862033_A_C| 3294|\n", - "| GCST006941|17_45841739_C_T| 3293|\n", - "| GCST004601|17_45841730_A_G| 3293|\n", - "| GCST010002|17_45895867_C_T| 3293|\n", - "| GCST90025948|17_45834077_T_C| 3293|\n", - "| GCST008733|17_45834077_T_C| 3293|\n", - "| GCST008734|17_45834077_T_C| 3293|\n", - "|GCST009518_66|17_45841730_A_G| 3293|\n", - "+-------------+---------------+-----+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "tag_count = old_study_locus.groupBy('studyId', 'variantId').count().persist()\n", - "median_tag_count = tag_count.toPandas()['count'].median()\n", - "single_count = tag_count.filter(f.col('count') == 1).count()\n", - "over_1000 = tag_count.filter(f.col('count') >= 1000).count()\n", - "\n", - "print(f'The median number of tag size: {median_credset_size}')\n", - "print(f'Number of associations with single credible set: {single_count}')\n", - "print(f'Number of associations with more than 1000 tags set: {over_1000}')\n", - "\n", - "tag_count.orderBy('count',ascending=False).show(20)" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "old_study_locus = (\n", + " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220210/ld.parquet\")\n", + " .select(\n", + " f.col(\"study_id\").alias(\"studyId\"),\n", + " f.concat_ws(\"_\", f.col(\"lead_chrom\"), f.col(\"lead_pos\"), f.col(\"lead_ref\"), f.col(\"lead_alt\")).alias(\"variantId\"),\n", + " f.concat_ws(\"_\", f.col(\"tag_chrom\"), f.col(\"tag_pos\"), f.col(\"tag_ref\"), f.col(\"tag_alt\")).alias(\"tagVariantId\"),\n", + " \"pics_postprob\",\n", + " \"pics_95perc_credset\",\n", + " \"pics_99perc_credset\"\n", + " )\n", + " .distinct()\n", + ")\n", + "lead_tag_pair_count = old_study_locus.count()\n", + "study_count = old_study_locus.select(\"studyId\").distinct().count()\n", + "association_count = old_study_locus.select(\"studyId\", \"variantId\").distinct().count()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 13:53:16 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n" + ] }, { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Compare credible sets\n", - "\n", - "To make datasets comparable, both datasets need to updated with `studyAccession`: getting the GWAS Catalog study identifier by removing the suffix." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "The median number of tag size: 21.0\n", + "Number of associations with single credible set: 9231\n", + "Number of associations with more than 1000 tags set: 441\n", + "+-------------+---------------+-----+\n", + "| studyId| variantId|count|\n", + "+-------------+---------------+-----+\n", + "| GCST001482|17_45900461_C_T| 3685|\n", + "| GCST90018953|17_45856424_G_T| 3684|\n", + "| GCST007692|17_45846834_C_G| 3649|\n", + "| GCST90018960|17_45761354_C_T| 3360|\n", + "| GCST90018996|17_46112544_A_G| 3348|\n", + "| GCST90091060|17_45873075_C_A| 3295|\n", + "| GCST002970|17_45846317_A_G| 3294|\n", + "| GCST001548|17_45846853_T_C| 3294|\n", + "| GCST007328|17_45887201_A_C| 3294|\n", + "| GCST007430|17_45887201_A_C| 3294|\n", + "| GCST010701|17_45855805_C_T| 3294|\n", + "| GCST001126|17_45846317_A_G| 3294|\n", + "| GCST012009|17_45862033_A_C| 3294|\n", + "| GCST006941|17_45841739_C_T| 3293|\n", + "| GCST004601|17_45841730_A_G| 3293|\n", + "| GCST010002|17_45895867_C_T| 3293|\n", + "| GCST90025948|17_45834077_T_C| 3293|\n", + "| GCST008733|17_45834077_T_C| 3293|\n", + "| GCST008734|17_45834077_T_C| 3293|\n", + "|GCST009518_66|17_45841730_A_G| 3293|\n", + "+-------------+---------------+-----+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "tag_count = old_study_locus.groupBy(\"studyId\", \"variantId\").count().persist()\n", + "median_tag_count = tag_count.toPandas()[\"count\"].median()\n", + "single_count = tag_count.filter(f.col(\"count\") == 1).count()\n", + "over_1000 = tag_count.filter(f.col(\"count\") >= 1000).count()\n", + "\n", + "\n", + "tag_count.orderBy(\"count\",ascending=False).show(20)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare credible sets\n", + "\n", + "To make datasets comparable, both datasets need to updated with `studyAccession`: getting the GWAS Catalog study identifier by removing the suffix." + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1][Stage 1072:========> (9 + 7) / 16]\r" + ] + } + ], + "source": [ + "processed_new = (\n", + " credible_sets\n", + " # Dropping leads with sub-significant p-values:\n", + " .filter(f.size(f.col(\"qualityControl\")) == 0)\n", + " .select(\n", + " f.split(f.col(\"studyId\"), \"_\").getItem(0).alias(\"studyAccession\"),\n", + " \"variantId\",\n", + " \"tagVariantId\",\n", + " \"pics_mu\",\n", + " \"pics_postprob\",\n", + " \"pics_95_perc_credset\",\n", + " \"pics_99_perc_credset\"\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "processed_old = (\n", + " old_study_locus\n", + " .select(\n", + " f.split(f.col(\"studyId\"), \"_\").getItem(0).alias(\"studyAccession\"),\n", + " \"variantId\",\n", + " \"tagVariantId\",\n", + " \"pics_postprob\",\n", + " \"pics_95perc_credset\",\n", + " \"pics_99perc_credset\"\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "processed_old.show(1, False, True)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "[Stage 414:> (0 + 1) / 1][Stage 431:============>(187 + 7) / 200]\r" + ] }, { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1][Stage 1072:========> (9 + 7) / 16]\r" - ] - } - ], - "source": [ - "processed_new = (\n", - " credible_sets\n", - " # Dropping leads with sub-significant p-values:\n", - " .filter(f.size(f.col('qualityControl')) == 0)\n", - " .select(\n", - " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", - " 'variantId', \n", - " 'tagVariantId', \n", - " 'pics_mu', \n", - " 'pics_postprob', \n", - " 'pics_95_perc_credset', \n", - " 'pics_99_perc_credset'\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "processed_old = (\n", - " old_study_locus\n", - " .select(\n", - " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", - " 'variantId', \n", - " 'tagVariantId',\n", - " 'pics_postprob',\n", - " 'pics_95perc_credset',\n", - " 'pics_99perc_credset' \n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "processed_old.show(1, False, True)" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------+---------------+---------------------+---------------------+\n", + "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", + "+--------------+---------------+---------------------+---------------------+\n", + "| GCST000114|15_48099968_A_G| 13| 38|\n", + "| GCST000172|3_190632672_A_G| 12| null|\n", + "| GCST000184|18_60217517_G_A| 233| 214|\n", + "| GCST000189|16_81270154_T_C| 6| null|\n", + "| GCST000189|9_105892815_G_T| 26| null|\n", + "| GCST000282|19_11100236_C_T| 34| 69|\n", + "| GCST000425|16_23055939_T_G| 227| null|\n", + "| GCST000452|2_156696348_A_C| 19| null|\n", + "| GCST000679| 10_6056986_C_T| 12| null|\n", + "| GCST000817|9_136220024_G_T| 23| 27|\n", + "| GCST000876|11_18349351_G_C| 2| 6|\n", + "| GCST000943| 20_1960525_G_A| null| 2|\n", + "| GCST000957|22_49692725_G_A| 16| null|\n", + "| GCST000964|13_77957479_G_A| null| 47|\n", + "| GCST000998|10_44280376_C_T| 193| null|\n", + "| GCST000998|21_34226827_C_T| 29| 32|\n", + "| GCST001010| 6_32689801_T_C| 1| 112|\n", + "| GCST001040|17_37738049_G_A| null| 21|\n", + "| GCST001057|13_66393490_A_G| 7| null|\n", + "| GCST001059|2_198123211_C_A| 8| null|\n", + "+--------------+---------------+---------------------+---------------------+\n", + "only showing top 20 rows\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "[Stage 414:> (0 + 1) / 1][Stage 431:============>(187 + 7) / 200]\r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+---------------+---------------------+---------------------+\n", - "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", - "+--------------+---------------+---------------------+---------------------+\n", - "| GCST000114|15_48099968_A_G| 13| 38|\n", - "| GCST000172|3_190632672_A_G| 12| null|\n", - "| GCST000184|18_60217517_G_A| 233| 214|\n", - "| GCST000189|16_81270154_T_C| 6| null|\n", - "| GCST000189|9_105892815_G_T| 26| null|\n", - "| GCST000282|19_11100236_C_T| 34| 69|\n", - "| GCST000425|16_23055939_T_G| 227| null|\n", - "| GCST000452|2_156696348_A_C| 19| null|\n", - "| GCST000679| 10_6056986_C_T| 12| null|\n", - "| GCST000817|9_136220024_G_T| 23| 27|\n", - "| GCST000876|11_18349351_G_C| 2| 6|\n", - "| GCST000943| 20_1960525_G_A| null| 2|\n", - "| GCST000957|22_49692725_G_A| 16| null|\n", - "| GCST000964|13_77957479_G_A| null| 47|\n", - "| GCST000998|10_44280376_C_T| 193| null|\n", - "| GCST000998|21_34226827_C_T| 29| 32|\n", - "| GCST001010| 6_32689801_T_C| 1| 112|\n", - "| GCST001040|17_37738049_G_A| null| 21|\n", - "| GCST001057|13_66393490_A_G| 7| null|\n", - "| GCST001059|2_198123211_C_A| 8| null|\n", - "+--------------+---------------+---------------------+---------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "aggregated_new = (\n", - " processed_new\n", - " .join(processed_old.select('studyAccession').distinct(), on='studyAccession', how='right')\n", - " .groupBy('studyAccession', 'variantId')\n", - " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('new_credible_set_size'))\n", - " .persist()\n", - ")\n", - "\n", - "aggregated_old = (\n", - " processed_old\n", - " .groupBy('studyAccession', 'variantId')\n", - " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('old_credible_set_size'))\n", - " .persist()\n", - ")\n", - "\n", - "credset_compare = (\n", - " aggregated_new\n", - " .join(aggregated_old.filter(f.col('studyAccession').startswith('GCST')), on=['studyAccession', 'variantId'], how='outer')\n", - " .persist()\n", - ")\n", - "\n", - "credset_compare.show()" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] }, { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The number of extra credible sets covered by the new dataset: 104508 (53.0%)\n", - "Number of lost credible sets in the new datasets: 49292 (25.0%)\n", - "The number of extra credible sets with more than 1 tags covered by the new dataset: 94745 (48.1%)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "extra_coverage = credset_compare.filter(f.col('old_credible_set_size').isNull()).count()\n", - "lost_coverage = credset_compare.filter(f.col('new_credible_set_size').isNull()).count()\n", - "old_full_count = aggregated_old.filter(f.col('studyAccession').startswith('GCST')).count()\n", - "\n", - "print(f'The number of extra credible sets covered by the new dataset: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", - "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", - "\n", - "extra_coverage_more = credset_compare.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", - "\n", - "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "aggregated_new = (\n", + " processed_new\n", + " .join(processed_old.select(\"studyAccession\").distinct(), on=\"studyAccession\", how=\"right\")\n", + " .groupBy(\"studyAccession\", \"variantId\")\n", + " .agg(f.size(f.collect_list(f.col(\"tagVariantId\"))).alias(\"new_credible_set_size\"))\n", + " .persist()\n", + ")\n", + "\n", + "aggregated_old = (\n", + " processed_old\n", + " .groupBy(\"studyAccession\", \"variantId\")\n", + " .agg(f.size(f.collect_list(f.col(\"tagVariantId\"))).alias(\"old_credible_set_size\"))\n", + " .persist()\n", + ")\n", + "\n", + "credset_compare = (\n", + " aggregated_new\n", + " .join(aggregated_old.filter(f.col(\"studyAccession\").startswith(\"GCST\")), on=[\"studyAccession\", \"variantId\"], how=\"outer\")\n", + " .persist()\n", + ")\n", + "\n", + "credset_compare.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] }, { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+--------------------+---------------------+---------------------+\n", - "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", - "+--------------+--------------------+---------------------+---------------------+\n", - "| GCST000943| 20_1960525_G_A| null| 2|\n", - "| GCST000964| 13_77957479_G_A| null| 47|\n", - "| GCST001040| 17_37738049_G_A| null| 21|\n", - "| GCST002216| 7_73450539_A_G| null| 94|\n", - "| GCST002221| 9_133372523_G_C| null| 20|\n", - "| GCST002223| 8_19973410_C_T| null| 106|\n", - "| GCST002223| 8_20009083_C_T| null| 98|\n", - "| GCST003043| 16_11271643_C_T| null| 14|\n", - "| GCST003191| 20_22824423_G_A| null| 30|\n", - "| GCST003879| 22_23030688_C_G| null| 104|\n", - "| GCST004132| 16_10871740_T_C| null| 74|\n", - "| GCST004365| 3_186755027_C_T| null| 12|\n", - "| GCST004600| 6_35756341_T_C| null| 17|\n", - "| GCST004601| 11_8721318_TC_T| null| 171|\n", - "| GCST004601| 6_27878966_G_C| null| 267|\n", - "| GCST004603|16_88730362_G_GGG...| null| 10|\n", - "| GCST004603| 4_17777672_A_T| null| 9|\n", - "| GCST004605| 6_28489735_CT_C| null| 1|\n", - "| GCST004607| 20_56413821_A_G| null| 15|\n", - "| GCST004607| 2_218258320_T_A| null| 235|\n", - "+--------------+--------------------+---------------------+---------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "credset_compare.filter(f.col('new_credible_set_size').isNull()).show()" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "The number of extra credible sets covered by the new dataset: 104508 (53.0%)\n", + "Number of lost credible sets in the new datasets: 49292 (25.0%)\n", + "The number of extra credible sets with more than 1 tags covered by the new dataset: 94745 (48.1%)\n" + ] }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Conclusion:**\n", - "- The reason of the disagreement is the fact that the old dataset contains data from summary stats finemapping.\n", - "- To resolve this problem, we exclude those studies which have summary stats. These credible sets should be in a better agreement." - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "extra_coverage = credset_compare.filter(f.col(\"old_credible_set_size\").isNull()).count()\n", + "lost_coverage = credset_compare.filter(f.col(\"new_credible_set_size\").isNull()).count()\n", + "old_full_count = aggregated_old.filter(f.col(\"studyAccession\").startswith(\"GCST\")).count()\n", + "\n", + "\n", + "extra_coverage_more = credset_compare.filter(f.col(\"old_credible_set_size\").isNull() & (f.col(\"new_credible_set_size\")>1)).count()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------+--------------------+---------------------+---------------------+\n", + "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", + "+--------------+--------------------+---------------------+---------------------+\n", + "| GCST000943| 20_1960525_G_A| null| 2|\n", + "| GCST000964| 13_77957479_G_A| null| 47|\n", + "| GCST001040| 17_37738049_G_A| null| 21|\n", + "| GCST002216| 7_73450539_A_G| null| 94|\n", + "| GCST002221| 9_133372523_G_C| null| 20|\n", + "| GCST002223| 8_19973410_C_T| null| 106|\n", + "| GCST002223| 8_20009083_C_T| null| 98|\n", + "| GCST003043| 16_11271643_C_T| null| 14|\n", + "| GCST003191| 20_22824423_G_A| null| 30|\n", + "| GCST003879| 22_23030688_C_G| null| 104|\n", + "| GCST004132| 16_10871740_T_C| null| 74|\n", + "| GCST004365| 3_186755027_C_T| null| 12|\n", + "| GCST004600| 6_35756341_T_C| null| 17|\n", + "| GCST004601| 11_8721318_TC_T| null| 171|\n", + "| GCST004601| 6_27878966_G_C| null| 267|\n", + "| GCST004603|16_88730362_G_GGG...| null| 10|\n", + "| GCST004603| 4_17777672_A_T| null| 9|\n", + "| GCST004605| 6_28489735_CT_C| null| 1|\n", + "| GCST004607| 20_56413821_A_G| null| 15|\n", + "| GCST004607| 2_218258320_T_A| null| 235|\n", + "+--------------+--------------------+---------------------+---------------------+\n", + "only showing top 20 rows\n", + "\n" + ] }, { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "data": { - "text/plain": [ - "141" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "(\n", - " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220401/ld.parquet\")\n", - " .filter(f.col('study_id') == 'GCST002223')\n", - " .select('lead_chrom', 'lead_pos', 'lead_ref', 'lead_alt')\n", - " .distinct()\n", - " .count()\n", - ")" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] }, { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 15:57:00 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of credible sets in the selected studies (27054): 105658\n", - "The number of extra credible sets covered by the new dataset in the same studies: 73250 (69.3%)\n", - "Number of lost credible sets in the new datasets: 8454 (8.0%)\n", - "The number of extra credible sets with more than 1 tags covered by the new dataset: 67183 (63.6%)\n" - ] - } - ], - "source": [ - "studies_with_no_sumstats = (\n", - " spark.read.parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/gwas_catalog_studies/')\n", - " .filter(~f.col('hasSumstats'))\n", - " .select(f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'))\n", - " .distinct()\n", - ")\n", - "\n", - "# Dropping studies with summary statistics:\n", - "credset_compare_update = credset_compare.join(studies_with_no_sumstats, on='studyAccession', how='inner').distinct().persist()\n", - "\n", - "old_full_count = credset_compare_update.filter(f.col('old_credible_set_size').isNotNull()).count()\n", - "extra_coverage = credset_compare_update.filter(f.col('old_credible_set_size').isNull()).count()\n", - "lost_coverage = credset_compare_update.filter(f.col('new_credible_set_size').isNull()).count()\n", - "\n", - "print(f'Number of credible sets in the selected studies ({studies_with_no_sumstats.count()}): {old_full_count}')\n", - "print(f'The number of extra credible sets covered by the new dataset in the same studies: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", - "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", - "\n", - "extra_coverage_more = credset_compare_update.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", - "\n", - "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "credset_compare.filter(f.col(\"new_credible_set_size\").isNull()).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Conclusion:**\n", + "- The reason of the disagreement is the fact that the old dataset contains data from summary stats finemapping.\n", + "- To resolve this problem, we exclude those studies which have summary stats. These credible sets should be in a better agreement." + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] }, { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "1+1" + "data": { + "text/plain": [ + "141" ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] } - ], - "metadata": { - "kernelspec": { - "display_name": "otgenetics-Z1loiStc-py3.8", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.16 (default, Dec 7 2022, 01:39:17) \n[Clang 14.0.0 (clang-1400.0.29.202)]" + ], + "source": [ + "(\n", + " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220401/ld.parquet\")\n", + " .filter(f.col(\"study_id\") == \"GCST002223\")\n", + " .select(\"lead_chrom\", \"lead_pos\", \"lead_ref\", \"lead_alt\")\n", + " .distinct()\n", + " .count()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 15:57:00 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + " \r" + ] }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "5a448d06c31dd563cc2d2f896cd972f1626bb3e0fbcfc3d2f2ab4cc41131eab9" - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets in the selected studies (27054): 105658\n", + "The number of extra credible sets covered by the new dataset in the same studies: 73250 (69.3%)\n", + "Number of lost credible sets in the new datasets: 8454 (8.0%)\n", + "The number of extra credible sets with more than 1 tags covered by the new dataset: 67183 (63.6%)\n" + ] } + ], + "source": [ + "studies_with_no_sumstats = (\n", + " spark.read.parquet(\"gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/gwas_catalog_studies/\")\n", + " .filter(~f.col(\"hasSumstats\"))\n", + " .select(f.split(f.col(\"studyId\"), \"_\").getItem(0).alias(\"studyAccession\"))\n", + " .distinct()\n", + ")\n", + "\n", + "# Dropping studies with summary statistics:\n", + "credset_compare_update = credset_compare.join(studies_with_no_sumstats, on=\"studyAccession\", how=\"inner\").distinct().persist()\n", + "\n", + "old_full_count = credset_compare_update.filter(f.col(\"old_credible_set_size\").isNotNull()).count()\n", + "extra_coverage = credset_compare_update.filter(f.col(\"old_credible_set_size\").isNull()).count()\n", + "lost_coverage = credset_compare_update.filter(f.col(\"new_credible_set_size\").isNull()).count()\n", + "\n", + "\n", + "extra_coverage_more = credset_compare_update.filter(f.col(\"old_credible_set_size\").isNull() & (f.col(\"new_credible_set_size\")>1)).count()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1+1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "otgenetics-Z1loiStc-py3.8", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16 (default, Dec 7 2022, 01:39:17) \n[Clang 14.0.0 (clang-1400.0.29.202)]" }, - "nbformat": 4, - "nbformat_minor": 2 + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "5a448d06c31dd563cc2d2f896cd972f1626bb3e0fbcfc3d2f2ab4cc41131eab9" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/notebooks/susie_inf_benchmark.ipynb b/notebooks/susie_inf_benchmark.ipynb index 21de23b47..d9039d0d1 100644 --- a/notebooks/susie_inf_benchmark.ipynb +++ b/notebooks/susie_inf_benchmark.ipynb @@ -28,8 +28,9 @@ "source": [ "import numpy as np\n", "import pandas as pd\n", - "from gentropy.method.susie_inf import SUSIE_inf\n", - "from scipy.stats import pearsonr\n" + "from scipy.stats import pearsonr\n", + "\n", + "from gentropy.method.susie_inf import SUSIE_inf\n" ] }, { @@ -83,10 +84,10 @@ } ], "source": [ - "plt.scatter(x=first_lbf_susie_r, y=first_lbf_susie_inf)\n", - "plt.xlabel(\"susie_r\")\n", - "plt.ylabel(\"susie_inf\")\n", - "plt.show()\n", + "# plt.scatter(x=first_lbf_susie_r, y=first_lbf_susie_inf)\n", + "# plt.xlabel(\"susie_r\")\n", + "# plt.ylabel(\"susie_inf\")\n", + "# plt.show()\n", "\n", "corr = pearsonr(first_lbf_susie_r, first_lbf_susie_inf)\n", "print(\"Pearson's correlation coefficient: \" + str(corr[0])) # noqa: T201" @@ -116,10 +117,10 @@ } ], "source": [ - "plt.scatter(x=second_lbf_susie_r, y=second_lbf_susie_inf)\n", - "plt.xlabel(\"susie_r\")\n", - "plt.ylabel(\"susie_inf\")\n", - "plt.show()\n", + "# plt.scatter(x=second_lbf_susie_r, y=second_lbf_susie_inf)\n", + "# plt.xlabel(\"susie_r\")\n", + "# plt.ylabel(\"susie_inf\")\n", + "# plt.show()\n", "\n", "corr = pearsonr(second_lbf_susie_r, second_lbf_susie_inf)\n", "print(\"Pearson's correlation coefficient: \" + str(corr[0])) # noqa: T201" @@ -142,7 +143,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.14" }, "orig_nbformat": 4 }, diff --git a/notebooks/ukb_ppp_benchmark.ipynb b/notebooks/ukb_ppp_benchmark.ipynb new file mode 100644 index 000000000..3e2f4a23e --- /dev/null +++ b/notebooks/ukb_ppp_benchmark.ipynb @@ -0,0 +1,1459 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"d831fede-136f-40d0-a9cd-423fefca302f\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"d831fede-136f-40d0-a9cd-423fefca302f\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# import matplotlib.pyplot as plt\n", + "import pyspark.sql.functions as f\n", + "\n", + "from gentropy.common.session import Session\n", + "from gentropy.common.spark_helpers import order_array_of_structs_by_field\n", + "from gentropy.dataset.ld_index import LDIndex\n", + "from gentropy.dataset.study_index import StudyIndex\n", + "from gentropy.dataset.study_locus import StudyLocus\n", + "from gentropy.method.susie_inf import SUSIE_inf\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 09:34:15 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + } + ], + "source": [ + "session = Session(\n", + " extended_spark_conf={\n", + " \"spark.driver.memory\": \"10g\",\n", + " \"spark.executor.memory\": \"10g\",\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Context\n", + "UKB-PPP summary statistics were ingested, a deduplication and sanity filter was run on harmonised summary statistics prior to clumping\n", + "Locus breaker clumping was performed on the resulting studies\n", + "\n", + "Parameters: \n", + " lbc_baseline_pvalue: 1e-5, \n", + " lbc_distance_cutoff: 250_000, \n", + " lbc_pvalue_threshold: 1e-8, \n", + " lbc_flanking_distance: 100_000, \n", + " large_loci_size: 1_500_000, \n", + " wbc_clump_distance: 500_000, \n", + " wbc_pvalue_threshold: 1e-8, \n", + " collect_locus: bool = True, \n", + " remove_mhc: bool = True,\n", + "\n", + "Loci with less than 100 variants, or more than 15,000, were filtered out and fine-mapped with PICS.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "study_index = StudyIndex.from_parquet(\n", + " session, \"/Users/dc16/data/study_index/ukb_ppp/\"\n", + ")\n", + "ld_index = LDIndex.from_parquet(session, \"/Users/dc16/data/ld_index\")\n", + "susie_loci = StudyLocus(\n", + " session.spark.read.parquet(\"/Users/dc16/output/ukb_ppp/clean_loci.parquet/\"),\n", + " StudyLocus.get_schema(),\n", + ")\n", + "pics_loci = StudyLocus(\n", + " session.spark.read.parquet(\"/Users/dc16/output/ukb_ppp/filtered_loci.parquet/\"),\n", + " StudyLocus.get_schema(),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "susie_loci.df = susie_loci.df.filter(f.col(\"pValueExponent\") < -11)\n", + "pics_loci.df = pics_loci.df.filter(f.col(\"pValueExponent\") < -11)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Susie fine mapping\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the total number of unique studyIds\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "2387" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "susie_loci.df.select(\"studyId\").distinct().count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the total number of loci for finemapping:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "17117" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "susie_loci.df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "df = susie_loci.df.withColumns(\n", + " {\n", + " \"locusSize\": f.size(\"locus\"),\n", + " \"locusLength\": f.col(\"locusEnd\") - f.col(\"locusStart\"),\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanLocusLength | 820240.6895484022 \n", + " q1LocusLength | 371912 \n", + " medianLocusLength | 651459 \n", + " q3LocusLength | 1500000 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 63:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-----------------------------\n", + " meanLocusSize | 4029.3360986154116 \n", + " minLocusSize | 116 \n", + " q1LocusSize | 1997 \n", + " medianLocusSize | 3348 \n", + " q3LocusSize | 5727 \n", + " maxLocusSize | 13348 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "length = df.select(\n", + " f.mean(\"locusLength\").alias(\"meanLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.25).alias(\"q1LocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.5).alias(\"medianLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.75).alias(\"q3LocusLength\"),\n", + ")\n", + "size = df.select(\n", + " f.mean(\"locusSize\").alias(\"meanLocusSize\"),\n", + " f.min(\"locusSize\").alias(\"minLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.25).alias(\"q1LocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.5).alias(\"medianLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.75).alias(\"q3LocusSize\"),\n", + " f.max(\"locusSize\").alias(\"maxLocusSize\"),\n", + ")\n", + "length.show(vertical=True)\n", + "size.show(vertical=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABq3ElEQVR4nO3deVhV5f7//xeDDA6AqICkIjnPmppyHNI0UTmlacccMjXMBiyHUvNUag5pVg6V6alM7Jtm2mlUU8khG3AicZYccCgFLRXEo4hw//7ox/64BU22sDbI83Fd+6q91r3Xft+3uLl97bXu5WKMMQIAAAAAAAAs5OrsAgAAAAAAAFD8EEoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBhUjVqlU1cOBAZ5dx23v99dd15513ys3NTY0bN3Z2ObgJGzZskIuLiz777DNnlwIAKISYQ1mDOdTfi46OlouLi44cOeLsUoAigVAKKCDZv5C2bduW6/527dqpfv36t/w+K1eu1IQJE275OMXFmjVrNHr0aLVq1UoLFizQq6++et22AwcOVOnSpS2sruBVrVpV//znP51dxnUtXrxYs2bNcnYZAAAnYg5VOBX3OdTly5c1e/ZsNWnSRD4+PvLz81O9evU0ZMgQ7d+/39nlAUWWu7MLAPB/EhIS5Oqat6x45cqVmjNnDpOqm7Ru3Tq5urpq/vz58vDwcHY5uMbixYu1e/duDR8+3NmlAACKEOZQBa+4z6F69uypb7/9Vn369NHjjz+ujIwM7d+/X8uXL9c//vEP1a5dW5LUv39/9e7dW56enk6uGCgaCKWAQqQo/vK6cOGCSpUq5ewybtqpU6fk7e1dLCdTAADcrphDFbziPIfaunWrli9frilTpujf//633b533nlH586dsz13c3OTm5ubxRUCRReX7wGFyLXrIWRkZOiVV15RjRo15OXlpXLlyql169aKiYmR9Nep0XPmzJEkubi42B7ZLly4oOeee06VK1eWp6enatWqpTfeeEPGGLv3vXjxop599lmVL19eZcqU0QMPPKDff/9dLi4udt8eTpgwQS4uLtq7d6/69u2rsmXLqnXr1pKknTt3auDAgbrzzjvl5eWloKAgPfbYY/rzzz/t3iv7GL/++qseeeQR+fr6qkKFCnr55ZdljNHx48fVrVs3+fj4KCgoSG+++eZNjd2VK1c0adIkVatWTZ6enqpatar+/e9/Kz093dbGxcVFCxYs0IULF2xjFR0dfVPHv5Fly5apadOm8vb2Vvny5fXII4/o999/z9Fu//796tWrlypUqCBvb2/VqlVLL774om3/wIEDVbVq1Ryvyx6zq8XExKh169by8/NT6dKlVatWrRyTpFvx8ccf2/rk7++v3r176/jx43Ztsi+f2Lt3r9q3b6+SJUvqjjvu0PTp03Mc7+jRo3rggQdUqlQpBQQEaMSIEVq9erVcXFy0YcMG2/FWrFiho0eP2v58rh2PrKwsTZkyRZUqVZKXl5c6dOiggwcP5lu/AQBFE3Mo5lAFOYc6dOiQJKlVq1Y59rm5ualcuXK259euKZVdQ26Pq39ms7KyNGvWLNWrV09eXl4KDAzUE088obNnz96wNqCo40wpoIClpKTojz/+yLE9IyPjb187YcIETZ06VYMHD9bdd9+t1NRUbdu2Tb/88ovuu+8+PfHEEzpx4oRiYmL0//7f/7N7rTFGDzzwgNavX6/IyEg1btxYq1ev1qhRo/T7779r5syZtrYDBw7U0qVL1b9/f7Vs2VLff/+9IiIirlvXv/71L9WoUUOvvvqqbXIWExOjw4cPa9CgQQoKCtKePXv03nvvac+ePdq0aVOOCcHDDz+sOnXqaNq0aVqxYoUmT54sf39//ec//9G9996r1157TYsWLdLzzz+v5s2bq23btjccq8GDB2vhwoV66KGH9Nxzz2nz5s2aOnWq9u3bpy+++EKS9P/+3//Te++9py1btuiDDz6QJP3jH//42z+HG4mOjtagQYPUvHlzTZ06VcnJyZo9e7Z++uknbd++XX5+fpL+mnC2adNGJUqU0JAhQ1S1alUdOnRI33zzjaZMmZKn99yzZ4/++c9/qmHDhpo4caI8PT118OBB/fTTT7fUl2xTpkzRyy+/rF69emnw4ME6ffq03n77bbVt29auT5J09uxZde7cWT169FCvXr302WefacyYMWrQoIG6dOki6a+J/b333quTJ09q2LBhCgoK0uLFi7V+/Xq7933xxReVkpKi3377zfbzee16FNOmTZOrq6uef/55paSkaPr06erXr582b96cL30HABQezKGYQ0mF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u5off/zRJCYmmg0bNpj4+HiLKy9YeR2XRYsWGU9PT7No0SKTmJhoVq9ebSpWrGhGjBhhceUFa+XKlebFF180n3/+uZFkvvjiixu2P3z4sClZsqQZOXKk2bt3r3n77beNm5ubWbVqlTUFWySv4zJs2DDz2muvmS1btphff/3VjB071pQoUcL88ssv1hRskbyOS7azZ8+aO++803Tq1Mk0atSoQGtE8eDoPKAoCA8PNwsWLDC7d+828fHxpmvXrqZKlSomLS3N1ubJJ580lStXNmvXrjXbtm0zLVu2NP/4xz9s+69cuWLq169vOnbsaLZv325Wrlxpypcvb8aOHWtrU1Q/z7ds2WKqVq1qGjZsaIYNG2bbXtzG5MyZMyYkJMQMHDjQbN682Rw+fNisXr3aHDx40NZm2rRpxtfX13z55Zdmx44d5oEHHjChoaHm4sWLtjadO3c2jRo1Mps2bTI//PCDqV69uunTp49tf0pKigkMDDT9+vUzu3fvNp988onx9vY2//nPfyzt782YMmWKKVeunFm+fLlJTEw0y5YtM6VLlzazZ8+2tSkOY/J3v6utGoOffvrJuLm5menTp5u9e/eal156yZQoUcLs2rWrwMfgWjcak3PnzpmOHTuaTz/91Ozfv9/Exsaau+++2zRt2tTuGMVpTK72+eefm0aNGpng4GAzc+ZMu32FZUwIpQrY3XffbaKiomzPMzMzTXBwsJk6depNvf7KlSumTJkyZuHChQVVolM4Mi5Xrlwx//jHP8wHH3xgBgwYcNuGUnkdm7lz55o777zTXL582aoSnSKv4xIVFWXuvfdeu20jR440rVq1KtA6nelmQobRo0ebevXq2W17+OGHTXh4eAFW5lx5CV+uVrduXfPKK6/kf0GFRF7G5eGHHzYvvfSSGT9+PKEU8sWtzo+KklOnThlJ5vvvvzfG/PUPqBIlSphly5bZ2uzbt89IMrGxscaYv/6x4erqapKSkmxt5s6da3x8fEx6eroxpmh+np8/f97UqFHDxMTEmHvuuccWShXHMRkzZoxp3br1dfdnZWWZoKAg8/rrr9u2nTt3znh6eppPPvnEGGPM3r17jSSzdetWW5tvv/3WuLi4mN9//90YY8y7775rypYtaxuj7PeuVatWfnfplkVERJjHHnvMbluPHj1Mv379jDHFc0yu/V1t5Rj06tXLRERE2NXTokUL88QTT+RrH/PqZuYvW7ZsMZLM0aNHjTHFd0x+++03c8cdd5jdu3ebkJAQu1CqMI0Jl+8VoMuXLysuLk4dO3a0bXN1dVXHjh0VGxt7U8f43//+p4yMDPn7+xdUmZZzdFwmTpyogIAARUZGWlGmUzgyNl9//bXCwsIUFRWlwMBA1a9fX6+++qoyMzOtKrvAOTIu//jHPxQXF2e7HOTw4cNauXKlunbtaknNhVVsbKzdOEpSeHj4TX8mFRdZWVk6f/78bfXZ66gFCxbo8OHDGj9+vLNLwW0iP+ZHRUlKSook2T5P4uLilJGRYdf/2rVrq0qVKrb+x8bGqkGDBgoMDLS1CQ8PV2pqqvbs2WNrU9Q+z6OiohQREZGj7uI4Jl9//bWaNWumf/3rXwoICFCTJk30/vvv2/YnJiYqKSnJrj++vr5q0aKF3Zj4+fmpWbNmtjYdO3aUq6urNm/ebGvTtm1beXh42NqEh4crISFBZ8+eLehu5sk//vEPrV27Vr/++qskaceOHfrxxx/VpUsXScVzTK5l5RgUpb9P10pJSZGLi4v8/PwkFc8xycrKUv/+/TVq1CjVq1cvx/7CNCbueeoZ8uSPP/5QZmam3S9PSQoMDNT+/ftv6hhjxoxRcHBwjj/oosyRcfnxxx81f/58xcfHW1Ch8zgyNocPH9a6devUr18/rVy5UgcPHtTTTz+tjIyM2+YfkY6MS9++ffXHH3+odevWMsboypUrevLJJ/Xvf//bipILraSkpFzHMTU1VRcvXpS3t7eTKitc3njjDaWlpalXr17OLsWpDhw4oBdeeEE//PCD3N2ZMiB/5Mf8qKjIysrS8OHD1apVK9WvX1/SX5/DHh4etn8sZQsMDFRSUpKtTW7jk73vRm0K6+f5kiVL9Msvv2jr1q059hXHMTl8+LDmzp2rkSNH6t///re2bt2qZ599Vh4eHhowYICtT7n15+r+BgQE2O13d3eXv7+/XZvQ0NAcx8jeV7Zs2QLpnyNeeOEFpaamqnbt2nJzc1NmZqamTJmifv36SVKxHJNrWTkG1/v7lH2MwurSpUsaM2aM+vTpIx8fH0nFc0xee+01ubu769lnn811f2EaE2aYhdi0adO0ZMkSbdiwQV5eXs4ux2nOnz+v/v376/3331f58uWdXU6hk5WVpYCAAL333ntyc3NT06ZN9fvvv+v111+/bUIpR2zYsEGvvvqq3n33XbVo0UIHDx7UsGHDNGnSJL388svOLg+F2OLFi/XKK6/oq6++yvHLujjJzMxU37599corr6hmzZrOLgcokqKiorR79279+OOPzi7FqY4fP65hw4YpJiamWM9pr5aVlaVmzZrp1VdflSQ1adJEu3fv1rx58zRgwAAnV+ccS5cu1aJFi7R48WLVq1dP8fHxGj58uIKDg4vtmCBvMjIy1KtXLxljNHfuXGeX4zRxcXGaPXu2fvnlF7m4uDi7nL/F5XsFqHz58nJzc8tx55Dk5GQFBQXd8LVvvPGGpk2bpjVr1qhhw4YFWabl8jouhw4d0pEjR3T//ffL3d1d7u7u+uijj/T111/L3d1dhw4dsqr0AufIz0zFihVVs2ZNubm52bbVqVNHSUlJunz5coHWaxVHxuXll19W//79NXjwYDVo0EAPPvigXn31VU2dOlVZWVlWlF0oBQUF5TqOPj4+heobZGdZsmSJBg8erKVLl95WZ6g64vz589q2bZuGDh1q++ydOHGiduzYIXd3d61bt87ZJaKIupX5UVEydOhQLV++XOvXr1elSpVs24OCgnT58mWdO3fOrv3V/b/eZ3X2vhu1KYyf53FxcTp16pTuuusu2+fJ999/r7feekvu7u4KDAwsdmNSsWJF1a1b125bnTp1dOzYMUn/16cb/T0JCgrSqVOn7PZfuXJFZ86cydO4FRajRo3SCy+8oN69e6tBgwbq37+/RowYoalTp0oqnmNyLSvH4HptCusYZQdSR48eVUxMjO0sKan4jckPP/ygU6dOqUqVKrbP3KNHj+q5555T1apVJRWuMSGUKkAeHh5q2rSp1q5da9uWlZWltWvXKiws7Lqvmz59uiZNmqRVq1bZXeN5u8jruNSuXVu7du1SfHy87fHAAw+offv2io+PV+XKla0sv0A58jPTqlUrHTx40C5o+fXXX1WxYkW763+LMkfG5X//+59cXe0/4rKDO3PVrYWLm7CwMLtxlKSYmJgbfiYVF5988okGDRqkTz75RBEREc4ux+l8fHxyfPY++eSTqlWrluLj49WiRQtnl4giytH5UVFhjNHQoUP1xRdfaN26dTkufWjatKlKlChh1/+EhAQdO3bM1v+wsDDt2rXL7h8M2f/Iyg4yitLneYcOHXJ8njRr1kz9+vWz/X9xG5NWrVop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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "panda_df = df.select(\"locusSize\", \"locusLength\").toPandas()\n", + "\n", + "# plt.figure(figsize=(12, 6))\n", + "\n", + "# # Histogram for locusLength\n", + "# plt.subplot(1, 2, 1) # 1 row, 2 columns, 1st subplot\n", + "# plt.hist(panda_df[\"locusLength\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Length\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Length\")\n", + "\n", + "# # Histogram for locusSize\n", + "# plt.subplot(1, 2, 2) # 1 row, 2 columns, 2nd subplot\n", + "# plt.hist(panda_df[\"locusSize\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Size\")\n", + "\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2MAAAIjCAYAAACOHsPRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9d5xdd3Xvjb93P33O9KI2GhU3yXJvsrGNsY1xyDUdm+JCCpeWhOcm9+dLHrBxCJd2Q0ISSB6eYAMPxEAw3bZsbAzYYNxtWb1L0+vpu39/f+xzjmY0M9KojmV/36+XXpL2OXvv765nre9a67MUIYRAIpFIJBKJRCKRSCQnFHW+ByCRSCQSiUQikUgkr0WkMyaRSCQSiUQikUgk84B0xiQSiUQikUgkEolkHpDOmEQikUgkEolEIpHMA9IZk0gkEolEIpFIJJJ5QDpjEolEIpFIJBKJRDIPSGdMIpFIJBKJRCKRSOYB6YxJJBKJRCKRSCQSyTwgnTGJRCKRSCQSiUQimQekMyaRSCQnmF27dqEoCnffffd8D2UKDzzwAGeddRaxWAxFUZiYmJjvIb3ieKVeO8mrB0VR+MhHPjLfw5BIJCcI6YxJJJJjxksvvcTb3/52lixZQiwWY8GCBVx99dV85StfOW77/M53vsOXv/zlacv7+vq44447eP7554/bvg/kV7/6FYqi1P8YhkFPTw/vf//72bFjxzHZxxNPPMEdd9xxzB2l0dFR3vnOdxKPx/mXf/kXvvWtb5FMJmf87t13342iKDz99NPHdAzzzU9/+lMuv/xy2traSCQS9PT08M53vpMHHnhgvod2XHk1Xs9bbrmFVCo138OYleP1HEskkpMP6YxJJJJjwhNPPMF5553HCy+8wJ/+6Z/yz//8z/zJn/wJqqryj//4j8dtvwdzxu68884T6ozV+NjHPsa3vvUt/v3f/53rr7+ee++9l/PPP5++vr6j3vYTTzzBnXfeecyNuKeeeopCocBdd93FBz7wAd773vdiGMYx3ccrmS9+8Yv88R//MYqicPvtt/MP//APvO1tb2Pr1q3853/+Z/17S5YsoVKp8L73vW8eRys52Tlez7FEIjn50Od7ABKJ5NXBZz7zGRoaGnjqqafIZrNTPhsaGpqfQR0HSqXSrBGjGpdddhlvf/vbAbj11ltZuXIlH/vYx7jnnnu4/fbbT8QwD5vaNTrw2r0W8H2fu+66i6uvvpp169ZN+3zy/asoCrFY7EQOTyKRSCSvYmRkTCKRHBO2b9/OGWecMaMx39bWNm3Zt7/9bS644AISiQSNjY287nWvm2II//jHP+b666+nq6sLy7JYtmwZd911F0EQ1L9zxRVX8POf/5zdu3fXUwO7u7v51a9+xfnnnw9EzlDts8l1Pk8++SRvfOMbaWhoIJFIcPnll/P4449PGeMdd9yBoihs2LCBm266icbGRi699NLDPjevf/3rAdi5c+dBv/fII49w2WWXkUwmyWaz/Lf/9t/YuHHjlPH89V//NQBLly6tH9euXbsOut3vf//7nHvuucTjcVpaWnjve99Lb29v/fMrrriCm2++GYDzzz8fRVG45ZZbDvs4D+S5557juuuuI5PJkEqluOqqq/j9738/7XsTExP81V/9Fd3d3ViWxcKFC3n/+9/PyMgIsD+N7sDjrKWF/upXv6ov27p1K29729vo6OggFouxcOFC3v3ud5PL5WYd58jICPl8nrVr1874+eT798CasQNTUyf/6e7unrKd+++/v3590+k0119/PS+//PJBziA8/fTTKIrCPffcM+2zBx98EEVR+NnPfgZAoVDgL//yL+vnsa2tjauvvppnn332oPuYKyfL9TwcDuc9sG3bNm655Ray2SwNDQ3ceuutlMvlKd+tVCp87GMfo6WlhXQ6zR//8R/T29uLoijccccd9e3N5Tn+0Y9+xKpVq7AsizPOOONVny4rkbxWkZExiURyTFiyZAm/+93vWL9+PatWrTrod++8807uuOMOLrnkEj796U9jmiZPPvkkjzzyCNdccw0QGWypVIqPf/zjpFIpHnnkET75yU+Sz+f5whe+AMAnPvEJcrkc+/bt4x/+4R8ASKVSnHbaaXz605/mk5/8JH/2Z3/GZZddBsAll1wCRE7Pddddx7nnnsunPvUpVFXlG9/4Bq9//ev5zW9+wwUXXDBlvO94xztYsWIFf//3f48Q4rDPzfbt2wFobm6e9TsPP/ww1113HT09Pdxxxx1UKhW+8pWvsHbtWp599lm6u7t561vfypYtW/jud7/LP/zDP9DS0gJAa2vrrNu9++67ufXWWzn//PP57Gc/y+DgIP/4j//I448/znPPPUc2m+UTn/gEp5xyCv/+7//Opz/9aZYuXcqyZcsO+zgn8/LLL3PZZZeRyWT4m7/5GwzD4N/+7d+44ooreOyxx7jwwgsBKBaLXHbZZWzcuJHbbruNc845h5GREX7yk5+wb9+++jHOBdd1ufbaa3Ech49+9KN0dHTQ29vLz372MyYmJmhoaJhxvba2NuLxOD/96U/56Ec/SlNT05z3edppp/Gtb31ryrKJiQk+/vGPT3HivvWtb3HzzTdz7bXX8rnPfY5yucxXv/pVLr30Up577rlpjluN8847j56eHr73ve/VHeYa9957L42NjVx77bUAfPCDH+QHP/gBH/nIRzj99NMZHR3lt7/9LRs3buScc86Z8zHNxMl0PefK4b4H3vnOd7J06VI++9nP8uyzz/L1r3+dtrY2Pve5z9W/c8stt/C9732P973vfVx00UU89thjXH/99VO2M5fn+Le//S0//OEP+dCHPkQ6neaf/umfeNvb3saePXsO+h6RSCQnIUIikUiOAevWrROapglN08TFF18s/uZv/kY8+OCDwnXdKd/bunWrUFVVvOUtbxFBEEz5LAzD+r/L5fK0ffz5n/+5SCQSwrbt+rLrr79eLFmyZNp3n3rqKQGIb3zjG9P2sWLFCnHttddO29/SpUvF1VdfXV/2qU99SgDixhtvnNM5ePTRRwUg/uM//kMMDw+Lvr4+8fOf/1x0d3cLRVHEU089JYQQYufOndPGdtZZZ4m2tjYxOjpaX/bCCy8IVVXF+9///vqyL3zhCwIQO3fuPOR4XNcVbW1tYtWqVaJSqdSX/+xnPxOA+OQnP1lf9o1vfEMA9TEejLl894YbbhCmaYrt27fXl/X19Yl0Oi1e97rX1Zd98pOfFID44Q9/OG0btetT29+Bx1w7348++qgQQojnnntOAOL73//+IY/hQGrjSCaT4rrrrhOf+cxnxDPPPDPtezNduwPH/Ed/9EcilUqJl19+WQghRKFQENlsVvzpn/7plO8ODAyIhoaGacsP5PbbbxeGYYixsbH6MsdxRDabFbfddlt9WUNDg/jwhz8810Ou82q8njfffLNIJpOzfn4k74HJ51oIId7ylreI5ubm+v+feeYZAYi//Mu/nPK9W265RQDiU5/6VH3ZwZ5jQJimKbZt21Zf9sILLwhAfOUrXznksUskkpMLmaYokUiOCVdffTW/+93v+OM//mNeeOEFPv/5z3PttdeyYMECfvKTn9S/96Mf/YgwDPnkJz+Jqk59BSmKUv93PB6v/7tQKDAyMsJll11GuVxm06ZNRzzO559/nq1bt3LTTTcxOjrKyMgIIyMjlEolrrrqKn79618ThuGUdT74wQ8e1j5uu+02Wltb6erq4vrrr6dUKnHPPfdw3nnnzfj9/v5+nn/+eW655ZYpUZkzzzyTq6++ml/84heHf6BEKW5DQ0N86EMfmlLndP3113Pqqafy85///Ii2eyiCIGDdunXccMMN9PT01Jd3dnZy00038dvf/pZ8Pg/Af/3Xf7FmzRre8pa3TNvO5PthLtQiJQ8++OC09LFDceedd/Kd73yHs88+mwcffJBPfOITnHvuuZxzzjlTUkUPxV133cXPfvYz7r77bk4//XQAHnroISYmJrjxxhvr99vIyAiapnHhhRfy6KOPHnSb73rXu/A8jx/+8If1ZevWrWNiYoJ3vetd9WXZbJYnn3zymAjFTOZkvJ6H4li8By677DJGR0frx15LI/zQhz405Xsf/ehHD3t8b3jDG6ZEp88880wymcwxU2WVSCSvHF7Tztivf/1r3vzmN9PV1YWiKPzoRz867G0IIfjiF7/IypUrsSyLBQsW8JnPfObYD1YiOQk4//zz+eEPf8j4+Dh/+MMfuP322ykUCrz97W9nw4YNQJSyp6pq3VCdjZdffpm3vOUtNDQ0kMlkaG1t5b3vfS/AUdWLbN26FYCbb76Z1tbWKX++/vWv4zjOtO0vXbr0sPbxyU9+koceeohHHnmEF198kb6+voOq7+3evRuAU045Zdpnp512Wt1IPFwOtt1TTz21/vmxZnh4mHK5POvxhGHI3r17geh+OFRa61xZunQpH//4x/n6179OS0sL1157Lf/yL/8y5/vlxhtv5De/+Q3j4+OsW7eOm266ieeee443v/nN2LZ9yPUfeOAB7rzzTm6//Xbe9ra31ZfX7rnXv/710+65devWHVLgZs2aNZx66qnce++99WX33nsvLS0t9XpEgM9//vOsX7+eRYsWccEFF3DHHXccE+P9ZL2eB+NI3gOLFy+e8v/GxkYAxsfHgeh5U1V12vti+fLlhz2+A/dV219tXxKJ5NXDa7pmrFQqsWbNGm677Tbe+ta3HtE2/uIv/oJ169bxxS9+kdWrVzM2NsbY2NgxHqlEcnJhmibnn38+559/PitXruTWW2/l+9//Pp/61KfmtP7ExASXX345mUyGT3/60yxbtoxYLMazzz7L//yf/3PajPXhUFv3C1/4AmedddaM3zmwP9HkKN1cWL16NW94wxuOaHyS6cwWUZks5lLjS1/6Erfccgs//vGPWbduHR/72Mf47Gc/y+9//3sWLlw4p/1lMhmuvvpqrr76agzD4J577uHJJ5/k8ssvn3WdnTt38p73vIerr76av/u7v5vyWe2e+9a3vkVHR8e0dXX90D/F73rXu/jMZz7DyMgI6XSan/zkJ9x4441T1n3nO9/JZZddxn333ce6dev4whe+wOc+9zl++MMfct11183p2E8EJ/p6zsSRvAc0TZvxe+II6kgPxYncl0QimV9e087Yddddd9AfKMdx+MQnPsF3v/tdJiYmWLVqFZ/73Oe44oorANi4cSNf/epXWb9+fX3G8HBn0CWSVzu11Lz+/n4Ali1bRhiGbNiwYVYj6Fe/+hWjo6P88Ic/5HWve119+UxqhLMZdrMtr6X+ZDKZV4zDtGTJEgA2b9487bNNmzbR0tJSl9M/nFSvydudHEGpLat9fqxpbW0lkUjMejyqqrJo0SIguh7r168/6PZqEYgDezLNFtlbvXo1q1ev5m//9m954oknWLt2LV/72temOUlz4bzzzuOee+6p378zUalUeOtb30o2m+W73/3utPTb2j3X1tZ2xPfcu971Lu68807+67/+i/b2dvL5PO9+97unfa+zs5MPfehDfOhDH2JoaIhzzjmHz3zmM0fljL2armeN4/EeWLJkCWEYsnPnTlasWFFfvm3btmnfPdyUTYlE8urlNZ2meCg+8pGP8Lvf/Y7//M//5MUXX+Qd73gHb3zjG+vpDT/96U/p6enhZz/7GUuXLqW7u5s/+ZM/kZExyWuSRx99dMZZ21q9U23C4oYbbkBVVT796U9Pi3DV1q/NCk/enuu6/Ou//uu07SeTyRnTlmrOy4EG37nnnsuyZcv44he/SLFYnLbe8PDwrMd4vOjs7OSss87innvumTLe9evXs27dOt70pjfVl812XDNx3nnn0dbWxte+9jUcx6kvv//++9m4ceM0lbdjhaZpXHPNNfz4xz+eItc9ODjId77zHS699FIymQwAb3vb23jhhRe47777pm2ndv1rhvOvf/3r+mdBEPDv//7vU76fz+fxfX/KstWrV6Oq6pTjP5Byuczvfve7GT+7//77gZlTPWt88IMfZMuWLdx33311R2My1157LZlMhr//+7/H87xpn8/lnjvttNNYvXo19957L/feey+dnZ1TJiqCIJj2HLS1tdHV1XXQY58LJ9v1nAvH4z1QU7U88D31la98Zdp3D+c5lkgkr25e05Gxg7Fnzx6+8Y1vsGfPHrq6ugD4H//jf/DAAw/wjW98g7//+79nx44d7N69m+9///t885vfJAgC/uqv/oq3v/3tPPLII/N8BBLJieWjH/0o5XKZt7zlLZx66qm4rssTTzzBvffeS3d3N7feeisQ1U984hOf4K677uKyyy7jrW99K5Zl8dRTT9HV1cVnP/tZLrnkEhobG7n55pv52Mc+hqIofOtb35rR2Tv33HO59957+fjHP875559PKpXizW9+M8uWLSObzfK1r32NdDpNMpnkwgsvZOnSpXz961/nuuuu44wzzuDWW29lwYIF9Pb28uijj5LJZPjpT396ok8fX/jCF7juuuu4+OKL+cAHPlCXtm9oaKj3J6odL0Sy/u9+97sxDIM3v/nNMzaiNgyDz33uc9x6661cfvnl3HjjjXVp++7ubv7qr/7qqMb8H//xHzP2PvqLv/gL/u7v/o6HHnqISy+9lA996EPous6//du/4TgOn//85+vf/eu//mt+8IMf8I53vIPbbruNc889l7GxMX7yk5/wta99jTVr1nDGGWdw0UUXcfvttzM2NkZTUxP/+Z//Oc1Qf+SRR/jIRz7CO97xDlauXInv+3zrW99C07QpNVwHUi6XueSSS7jooot44xvfyKJFi5iYmOBHP/oRv/nNb7jhhhs4++yzZ1z35z//Od/85jd529vexosvvsiLL75Y/yyVSnHDDTeQyWT46le/yvve9z7OOecc3v3ud9Pa2sqePXv4+c9/ztq1a/nnf/7nQ57vd73rXXzyk58kFovxgQ98YEoErlAosHDhQt7+9rezZs0aUqkUDz/8ME899RRf+tKXDrltePVczxqe580YPWtqauJDH/rQMX8PnHvuubztbW/jy1/+MqOjo3Vp+y1btgBTo2GH8xxLJJJXOfOm4/gKAxD33Xdf/f816edkMjnlj67r4p3vfKcQQog//dM/FYDYvHlzfb2atO2mTZtO9CFIJPPK/fffL2677TZx6qmnilQqJUzTFMuXLxcf/ehHxeDg4LTv/8d//Ic4++yzhWVZorGxUVx++eXioYceqn/++OOPi4suukjE43HR1dVVl8pnkvS1EEIUi0Vx0003iWw2K4ApMvc//vGPxemnny50XZ8mR/7cc8+Jt771raK5uVlYliWWLFki3vnOd4pf/vKX9e/UJK2Hh4fndA5q0tyHkuKeTR794YcfFmvXrhXxeFxkMhnx5je/WWzYsGHa+nfddZdYsGCBUFV1TjL39957b/1cNzU1ife85z1i3759U75zJNL2s/3Zu3evEEKIZ599Vlx77bUilUqJRCIhrrzySvHEE09M297o6Kj4yEc+IhYsWCBM0xQLFy4UN998sxgZGal/Z/v27eINb3iDsCxLtLe3i//1v/6XeOihh6bcDzt27BC33XabWLZsmYjFYqKpqUlceeWV4uGHHz7o8XieJ/6f/+f/ETfccINYsmSJsCxLJBIJcfbZZ4svfOELwnGc+ncPvHYHOxcHtlx49NFHxbXXXisaGhpELBYTy5YtE7fccot4+umnD3nOhYjaQtS2/dvf/nbKZ47jiL/+678Wa9asEel0WiSTSbFmzRrxr//6r4fc7qvtegoRSdvPdjzLli2rf+9o3gMzSfSXSiXx4Q9/WDQ1NYlUKiVuuOEGsXnzZgGI//2///eU9Wd7joEZWxQsWbJE3HzzzYc8dolEcnKhCCGrQSGasbrvvvu44YYbgEip6j3veQ8vv/zytELaVCpFR0cHn/rUp6alnVQqFRKJBOvWrePqq68+kYcgkUgkEonkFcbzzz/P2Wefzbe//W3e8573zPdwJBLJKwyZpjgLZ599NkEQMDQ0xGWXXTbjd9auXYvv+2zfvr2eA19LRzhehfESiUQikUhemVQqlWnqq1/+8pdRVXVKjZ9EIpHUeE07Y8VicYrK0c6dO3n++edpampi5cqVvOc97+H9738/X/rSlzj77LMZHh7ml7/8JWeeeSbXX389b3jDGzjnnHO47bbb+PKXv0wYhnz4wx/m6quvZuXKlfN4ZBKJRCKRSE40n//853nmmWe48sor0XWd+++/n/vvv58/+7M/qytOSiQSyWRe02mKv/rVr7jyyiunLb/55pu5++6768W/3/zmN+nt7aWlpYWLLrqIO++8k9WrVwPQ19fHRz/6UdatW0cymeS6667jS1/6Ek1NTSf6cCQSiUQikcwjDz30EHfeeScbNmygWCyyePFi3ve+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plt.figure(figsize=(10, 6))\n", + "# plt.scatter(panda_df[\"locusSize\"], panda_df[\"locusLength\"], alpha=0.5)\n", + "# plt.title(\"Scatter Plot of Locus Size vs Locus Length\")\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Locus Length\")\n", + "# plt.grid(True)\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 09:53:33 WARN SharedInMemoryCache: Evicting cached table partition metadata from memory due to size constraints (spark.sql.hive.filesourcePartitionFileCacheSize = 262144000 bytes). This may impact query planning performance.\n" + ] + } + ], + "source": [ + "susie_fm = StudyLocus.from_parquet(session, \"/Users/dc16/output/ukb_ppp_fm\")\n", + "susie_fm.df = (\n", + " susie_fm.df\n", + " .filter(f.col(\"pValueExponent\") < -11)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total credible sets:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "57880" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "susie_fm.df.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check for NaN and nulls in the credible set logBF\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets with 'not a number' as the logBF: 25\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 73:====================================================> (868 + 8) / 893]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets with 'null' as the logBF: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "nan = susie_fm.df.filter(f.isnan(\"credibleSetlog10BF\"))\n", + "null = susie_fm.df.filter(f.isnull(\"credibleSetlog10BF\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------\n", + " meanTopPP | 0.9005192231704642 \n", + " minTopPP | 0.011231041748358246 \n", + " q1TopPP | 0.9884181401759444 \n", + " medianTopPP | 0.9999999997648601 \n", + " q3TopPP | 1.0 \n", + " maxTopPP | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanCredSetSize | 4.344101633393829 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 1 \n", + " q3CredSetSize | 2 \n", + " maxCredSetSize | 1767 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0----------------------------------\n", + " meanPurityMeanR2 | 0.8042287002688577 \n", + " minPurityMeanR2 | 0.011839476509578747 \n", + " q1PurityMeanR2 | 0.6278035788726534 \n", + " medianPurityMeanR2 | 1.0 \n", + " q3PurityMeanR2 | 1.0 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 87:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------------\n", + " meanPurityMinR2 | 0.7062586247097518 \n", + " minPurityMinR2 | 0.0 \n", + " q1PurityMinR2 | 0.06978249208480057 \n", + " medianPurityMinR2 | 1.0 \n", + " q3PurityMinR2 | 1.0 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "susie_results = (\n", + " susie_fm.df.withColumn(\"credSetSize\", f.size(\"locus\"))\n", + " .withColumn(\n", + " \"locus\",\n", + " f.slice(order_array_of_structs_by_field(\"locus\", \"posteriorProbability\"), 1, 1)[\n", + " 0\n", + " ],\n", + " )\n", + " .withColumn(\"topPP\", f.col(\"locus\").getField(\"posteriorProbability\"))\n", + " .filter(~f.isnan(\"topPP\"))\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " susie_results.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "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+ik3N1dvvvmmAgIC9Nprr2nOnDm6//77dfvtt+utt95S48aN9cILL+jLL7+85rUaPny4Jk+erLZt22r27Nm69957FRkZqf79+5s1//73v9WpUye5urqa16pz585XPe6JEyfUq1cv+fv7a/r06apbt65Gjx6dr/kojD///FM9e/aUn5+f5syZo65du+arad68uV599VVJFxqpS8c7cOBAZWdna9myZXavycrK0sqVK9WnTx+5ubnZ7RswYICSk5PtGsCYmBh169ZNHh4e1z32gwcPqm/fvrr//vs1c+ZM3XbbbRo8eLD27t17zdfmNaW33XbbNWtTUlIkyfwkEABQttAf0R9drjT0R6mpqerYsaO++OILhYeHa+7cuWrcuLGGDRumOXPmmHXp6elauHChunTporfeektTp07V8ePHFRwcXOBcWDExMZoxY4aeeuopvfbaa/r111/16KOPXtffB/orlAgGgBJn0aJFhqSrPlq0aGH3mvr16xuhoaHm8zZt2hghISFXPU9YWJhR0D8Dn376qSHJeO211+y29+3b13BycjIOHjxoGIZhJCYmGpKMMWPG2NUNHjzYkGRMmTLF3DZlyhRDkvH444/nO9+ZM2fybfv4448NScaXX36Z7xgjR440t2VnZxt169Y1nJycjDfffNPcfuLECaNixYp216QgSUlJhiRj+PDhdttfeOEFQ5KxceNGc1toaKhRuXLlqx4vz7333mtIMmbOnGluy8zMNPz8/AwPDw8jKyvLMIyLP+vDhw/bvX7Tpk2GJGPTpk35jhkVFVXg+e69917z+fbt2w1JxqJFi/LVBgYGGgEBAXbbVq1aVeD58v6ctWvXzhg2bJhhGBeurYuLi7F48WJznCtWrDBfV9B7ql+/fr6f57FjxwxXV1fj+eefz/e+P/jgA+P48ePG0aNHjXXr1hmNGzc2nJycjG3btuV7P5cbNmyY4ezsbPz000/XrAUAlB70R/RHpbk/GjZsmOHl5WX88ccfdufo37+/4e7ubv68s7OzjczMTLuaEydOGLVr1zaGDh1qbjt8+LAhyahRo4bx119/mds/++wzQ5Lx+eefm9vy/owcOHDAOH78uPHrr78aH3zwgVGxYkWjVq1aRkZGRr7rcanMzEzD19fX8PHxMc6fP3/VWqCwuFMKKMHmz5+vuLi4fI/WrVtf87XVqlXT3r17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nM6fP6/u3bsrIyPDrBk7dqw+//xzrVixQlu2bNHRo0ftQq+81YuzsrK0detWLV68WNHR0Zo8ebJZk7d6cdeuXZWUlKQxY8Zo+PDhWr9+vVmTt3rxlClT9P3336tNmzYKDg6268sAAACupEir7xWXp59+WjExMfrss8/UrFkzc7u7u7sqVqwoSRo9erTWrFmj6Oho2Ww2PfPMM5KkrVu3SrrQVPn5+alOnTqaPn26UlJSNHDgQA0fPlxvvPGGpAtNVcuWLRUWFqahQ4dq48aNevbZZxUbG6vg4GBJF5qq0NBQ/fOf/1SHDh00Z84cLV++XPv3788311RBWDkGAIAbcyusvnczlObVi6WSf30BACjpSvPqe0W6U0qSsrOz9cUXX+if//ynTp06JUk6evSoTp8+fd3HeO+995SWlqYuXbrIy8vLfCxbtsysmT17th544AH16dNHnTt3lqenp1atWmXud3Z21urVq+Xs7KzAwEA9+eSTGjRokF599VWzxsfHR7GxsYqLi1ObNm00c+ZMLVy40AykJKlfv356++23NXnyZPn5+SkpKUnr1q27rkAKAADgehVHD3Wpwq5eLOmKqxenp6dr7969Zk1BqxfnHSNv9eJLa661erF0YQXj9PR0uwcAALg1lS/Ki/73v/+pR48eOnLkiDIzM3X//feratWqeuutt5SZmamoqKjrOs713KTl5uam+fPna/78+VesqV+/vtasWXPV43Tp0kU7d+68ak14eLjCw8OvOSYAAICiKK4eKo8jVy8+ceLEFVcv3r9//xXHHBkZqVdeeaVQ7xMAAJRNRbpT6rnnnlO7du104sQJ82t2kvTII4/km7sJAAAAFxR3D1XaVi+WWMEYAABcVKQ7pb766itt3bpVLi4udtsbNGig//u//yuWgQEAAJQ1xdlD5a1e/OWXX15x9eJL75a6fPXiy1fJK+zqxc7OzoVevVi6sIKxq6trod4rAAAom4p0p1Rubq5ycnLybf/9999VtWrVGx4UAABAWVQcPRSrFwMAgLKiSKFU9+7dNWfOHPO5k5OTTp8+rSlTpqhXr17FNTYAAIAypTh6qLCwMH300UeKiYlR1apVlZKSopSUFJ09e1bShVWMhw0bpoiICG3atEmJiYkaMmSIAgMD1bFjR3Mcvr6+GjhwoH744QetX79ekyZNUlhYmHkX06hRo/TL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1ezatUudOnWSm5ubvL29NX369HxjWbFihe644w65ubmpVatWWrNmTbG/XwAAAAAAAFzg0FAqIyNDbdq00fz58wvcP336dP3jH/9QVFSUvvvuO1WuXFnBwcE6d+6cWfPEE09o7969iouL0+rVq/Xll19q5MiR5v709HR1795d9evXV2JiombMmKGpU6dqwYIFZs3WrVv1+OOPa9iwYdq5c6d69+6t3r17a8+ePTfvzQMAAAAAANzCyjvy5D179lTPnj0L3GcYhubMmaNJkybp4YcfliR9+OGHql27tj799FP1799fP/74o9atW6ft27erXbt2kqR33nlHvXr10ttvv606depoyZIlysrK0gcffCAXFxe1aNFCSUlJmjVrlhlezZ07Vz169NC4ceMkSdOmTVNcXJzmzZunqKgoC64EAAAAAADAraXEzil1+PBhpaSkKCgoyNzm7u6ugIAAJSQkSJISEhJUrVo1M5CSpKCgIJUrV07fffedWdO5c2e5uLiYNcHBwTpw4IBOnDhh1lx6nryavPMUJDMzU+np6XYPAAAAAAAAXJ8SG0qlpKRIkmrXrm23vXbt2ua+lJQUeXh42O0vX768qlevbldT0DEuPceVavL2FyQyMlLu7u7mw9vbu7BvEQAAoEiYlxMAAJQFJTaUKukmTpyotLQ08/Hbb785ekgAAOAWwbycAACgLHDonFJX4+npKUlKTU2Vl5eXuT01NVV+fn5mzbFjx+xel52drb/++st8vaenp1JTU+1q8p5fqyZvf0FcXV3l6upahHcGAABwY0rzvJyZmZnKzMw0nzMFAgAAt64Se6eUj4+PPD09FR8fb25LT0/Xd999p8DAQElSYGCgTp48qcTERLNm48aNys3NVUBAgFnz5Zdf6vz582ZNXFycmjVrpttuu82sufQ8eTV55wEAACgtSvq8nEyBAAAA8jg0lDp9+rSSkpKUlJQk6UITlZSUpCNHjsjJyUljxozRa6+9pv/+97/avXu3Bg0apDp16qh3796SpObNm6tHjx4aMWKEtm3bpm+++Ubh4eHq37+/6tSpI0kaMGCAXFxcNGzYMO3du1fLli3T3LlzFRERYY7jueee07p16zRz5kzt379fU6dO1Y4dOxQeHm71JQEAALghJX1eTqZAAAAAeRz69b0dO3aoa9eu5vO8oCg0NFTR0dEaP368MjIy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t912m2677TYFBQVd8+eDiwr7ZzvP0qVL5eTkpN69e9/cAZYxhb3eJ0+eVFhYmLy8vOTq6qqmTZvy70khFPZ6z5kzR82aNVPFihXl7e2tsWPH6ty5cxaNtvT68ssv9eCDD6pOnTpycnLSp59+es3XbN68WW3btpWrq6saN26s6Ojomz5O3Fz0StajX7IefZO16JusR+9krVLRQxlwuKVLlxouLi7GBx98YOzdu9cYMWKEUa1aNSM1NbXA+m+++cZwdnY2pk+fbuzbt8+YNGmSUaFCBWP37t0Wj7x0Kuz1HjBggDF//nxj586dxo8//mgMHjzYcHd3N37//XeLR176FPZa5zl8+LBx++23G506dTIefvhhawZbBhT2emdmZhrt2rUzevXqZXz99dfG4cOHjc2bNxtJSUkWj7x0Kuz1XrJkieHq6mosWbLEOHz4sLF+/XrDy8vLGDt2rMUjL33WrFljvPzyy8aqVasMScYnn3xy1fpffvnFqFSpkhEREWHs27fPeOeddwxnZ2dj3bp11gwYxY5eyXr0S9ajb7IWfZP16J2sVxp6KEKpEqBDhw5GWFiY+TwnJ8eoU6eOERkZWWD93/72NyMkJMRuW0BAgPHUU0/d1HGWFYW93pfLzs42qlataixevPhmDbHMKMq1zs7ONu666y5j4cKFRmhoKM1VIRT2er/33ntGw4YNjaysLKuGWKYU9nqHhYUZ9913n922iIgI4+67776p4yxrrqehGj9+vNGiRQu7bf369TOCg4Nv4shwM9ErWY9+yXr0Tdaib7IevZNjldQeiq/vOVhWVpYSExMVFBRkbitXrpyCgoKUkJBQ4GsSEhLs6iUpODj4ivW4qCjX+3JnzpzR+fPnVb169Zs1zDKhqNf61VdflYeHh4YNG2bFMMuMolzv//73vwoMDFRYWJhq166tli1b6o033lBOTo5Vwy61inK977rrLiUmJpq3qf/yyy9as2aNevXqZcmYbyX8nixb6JWsR79kPfoma9E3WY/eqXRwxO/P8jftyLguf/zxh3JyclS7dm277bVr19b+/fsLfE1KSkqB9SkpKTdtnGVFUa735SZMmKA6derk+8sKe0W51l9//bXef/99JSUlWTDCsqUo1/uXX37Rxo0b9cQTT2jNmjU6ePCgnn76aZ0/f15TpkyxYtilVlGu94ABA/THH3/onnvu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mqbrVaFCBbvnTk5Oys3Ntdvm6empxo0bq3Hjxlq0aJF69eqlffv25Qudli5dquHDh2vFihUKCgq67jEAAICypTT1SKdPn5YkxcbG6vbbb7fb5+rqKulCj/PCCy9o5syZCgwMVNWqVTVjxgx99913dvXX01e5u7urcePGkqTly5ercePG6tixY77ead++ferWrZtGjhypSZMmXfV6ALgxhFIASqzLm41vv/1WTZo0kbOzs2rVqmU3n8HPP/+sM2fOFPocLi4uBX6qWKNGDfXu3VuLFi1SQkLCVeeJ6tGjh7KysuTk5JRvTobi1KFDB/n7++v111+3m+Dz448/1tChQ7V06VKFhITctPMDAICSoaz0SL6+vnJ1ddWRI0d07733FniMb775RnfddZc55YEku7uoiqpKlSp67rnn9MILL2jnzp3mnWd79+7Vfffdp9DQUL3++us3fB4AV0coBaDEOnLkiCIiIvTUU0/p+++/1zvvvKOZM2dKku677z7NmzdPgYGBysnJ0YQJE/J9QnY9GjRooMOHDyspKUl169ZV1apVzU/mhg8frgceeEA5OTkKDQ294jGcnZ31448/mv99M40ZM0aPPPKIxo8fr9tvv10xMTEKDQ3V3LlzFRAQoJSUFEkX5oJwd3e/qWMBAACOUVZ6pKpVq+qFF17Q2LFjlZubq3vuuUdpaWn65ptvZLPZFBoaqiZNmujDDz/U+vXr5ePjo3//+9/avn27fHx8Cv2eLvfUU09p2rRp+s9//qO+fftqz549uu+++xQcHKyIiAizr8oL+wAUP+aUAlBiDRo0SGfPnlWHDh0UFham5557TiNHjpR0YeU6b29vderUSQMGDNALL7ygSpUqFfocffr0UY8ePdS1a1fVqlVLH3/8sbkvKChIXl5eCg4OVp06da56HJvNJpvNVujzF1aPHj3k4+NjfnK3YMECZWdnKywsTF5eXubjueeeu+ljAQAAjlGWeqRp06bp73//uyIjI9W8eXP16NFDsbGxZuj01FNP6dFHH1W/fv0UEBCgP//80+6uqRtRvXp1DRo0SFOnTlVubq5Wrlyp48eP66OPPrLrq9q3b18s5wOQn5Nx+ReOAaAE6NKli/z8/DRnzhyHjeH06dO6/fbbtWjRoiuuTgMAAGAleiQAZQlf3wOAy+Tm5uqPP/7QzJkzVa1aNT300EOOHhIAAIDD0SMBKG6EUgBwmSNHjsjHx0d169ZVdHS0ypfnn0oAAAB6JADFja/vAQAAAAAAwHJMdA4AAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBKJQGDRpo8ODBjh5GmTdjxgw1bNhQzs7O8vPzc/RwAAAo0+hvrFFa+pvS8udh6tSpcnJycvQwgBtCKAXcwqKjo+Xk5KQdO3YUuL9Lly5q2bLlDZ9nzZo1mjp16g0f51axYcMGjR8/XnfffbcWLVqkN95444q1MTExmjNnjiXjymt88h6VKlWSr6+vJk2apPT0dLMu789V3sPNzU1NmzZVeHi4UlNTLRkrAODWRX9TMhWmvymJfv31Vw0ZMkSNGjWSm5ubPD091blzZ02ZMqVIx7van5/Tp09rypQpatmypSpXrqwaNWrIz89Pzz33nI4ePXoD7+L/sXfv8T3X///H7zvYgdl7TtvsY1jOcsowKym1rKyD0ifKR2iIRlhFyoeoT0Q5FNFBpiKHz7dUhDRRsRyWFYqcimKjD9tY7Pj8/dFvL95tTrO9ZnO7Xi7vS96v1+P9ej9eTy+9n7vv9X69gCuPe2k3AKBs2bVrl1xdLy3P/uyzzzRz5kwmbhdpzZo1cnV11Zw5c+Th4XHe2gULFmj79u0aNmyYPc1JmjVrlnx8fHTy5El9/vnn+s9//qM1a9Zo/fr1Tr+tGz9+vEJCQnT69Gl98803mjVrlj777DNt375dFStWtK1fAAAuhPlNybuU+c2VZs+ePWrbtq28vb31yCOPqG7dujp8+LC+++47vfTSSxo3btwlb/Ncx092drY6duyonTt3qnfv3hoyZIhOnjypHTt2aMGCBbr33nsVFBQkSRo9erSefvrp4thFoNQQSgG4JJ6enqXdwiXLyMhQpUqVSruNi3bkyBF5e3tfsRO2+++/X9WrV5ckDRw4UN26ddOHH36ob7/9VuHh4VbdHXfcoTZt2kiS+vXrp2rVqmnKlCn6+OOP9eCDD5ZK7wAAFIb5TcmzY35TUmMydepUnTx5UklJSapTp47TuiNHjhTrey1dulRbt27V/Pnz9dBDDzmtO336tLKysqzn7u7ucnfnR3qUbXx9D8Al+ft37LOzszVu3Dg1aNBAXl5eqlatmjp06KDVq1dLkvr06aOZM2dKktNXuvJlZGToiSeeUHBwsDw9PdWoUSO9/PLLMsY4ve+pU6f0+OOPq3r16qpcubLuvvtu/f7773JxcXH6DVP+V8x+/PFHPfTQQ6pSpYo6dOggSfrhhx/Up08fXXPNNdZp14888oj+97//Ob1X/jZ+/vln/etf/5LD4VCNGjX073//W8YYHTx4UPfcc498fX0VGBioV1555aLGLicnR88//7zq1asnT09P1a1bV88884wyMzOtGhcXF82dO1cZGRnWWMXFxRW6vZtvvlnLly/Xr7/+atXWrVvXWn/kyBFFR0crICBAXl5eatmypebNm+e0jV9++UUuLi56+eWXNXXqVNWpU0fe3t666aabtH379ovar1tuuUWStH///mKpAwDAbsxvrpz5Tb6NGzeqS5cuqlKliipVqqQWLVpo+vTp1vo+ffrIx8dHe/fuVZcuXVS5cmX17NlTkpSXl6dp06bp2muvlZeXlwICAvToo4/q+PHjTu9hjNELL7ygWrVqqWLFiurUqZN27NhRoJe9e/eqVq1aBQIpSfL39y+wbMWKFbrxxhtVqVIlVa5cWVFRUU7bPd/xs3fvXknSDTfcUGC7Xl5e8vX1tZ7//ZpSffr0cdre2Y+zj6fMzEyNHTtW9evXl6enp4KDgzVixAinvzPALsSqAJSWlqY//vijwPLs7OwLvva5557ThAkT1K9fP7Vr107p6enasmWLvvvuO91222169NFHdejQIa1evVrvvfee02uNMbr77rv15ZdfKjo6Wq1atdKqVav01FNP6ffff9fUqVOt2j59+mjx4sXq1auX2rdvr3Xr1ikqKuqcff3zn/9UgwYN9OKLL1oTwNWrV2vfvn3q27evAgMDtWPHDr355pvasWOHvv322wIXiuzevbuaNGmiiRMnavny5XrhhRdUtWpVvfHGG7rlllv00ksvaf78+XryySfVtm1bdezY8bxj1a9fP82bN0/333+/nnjiCW3cuFETJkzQTz/9pI8++kiS9N577+nNN9/Upk2b9Pbbb0uSrr/++kK39+yzzyotLU2//fabNVY+Pj6S/prk3nzzzdqzZ48GDx6skJAQLVmyRH369FFqaqqGDh3qtK13331XJ06cUExMjE6fPq3p06frlltu0bZt2xQQEHDe/cqfPFWrVq1Y6gAAKA7Mb8rm/CZ/n+68807VrFlTQ4cOVWBgoH766SctW7bMaQ6Tk5OjyMhIdejQQS+//LJ1eYBHH31UcXFx6tu3rx5//HHt379fM2bM0NatW7V+/XpVqFBBkjRmzBi98MIL6tKli7p06aLvvvtOnTt3djobSZLq1KmjL774QmvWrLF+yXYu7733nnr37q3IyEi99NJL+vPPPzVr1ix16NBBW7duVd26dc97/OQHX++++65Gjx59SRcyf/TRRxUREeG0bOXKlZo/f74VnuXl5enuu+/WN998owEDBqhJkybatm2bpk6dqp9//llLly696PcDioUBcNWaO3eukXTex7XXXuv0mjp16pjevXtbz1u2bGmioqLO+z4xMTGmsP/dLF261EgyL7zwgtPy+++/37i4uJg9e/YYY4xJTEw0ksywYcOc6vr06WMkmbFjx1rLxo4daySZBx98sMD7/fnnnwWWffDBB0aS+eqrrwpsY8CAAdaynJwcU6tWLePi4mImTpxoLT9+/Ljx9vZ2GpPCJCUlGUmmX79+TsuffPJJI8msWbPGWta7d29TqVKl824vX1RUlKlTp06B5dOmTTOSzPvvv28ty8rKMuHh4cbHx8ekp6cbY4zZv3+/kWS8vb3Nb7/9ZtVu3LjRSDLDhw+3luWPy65du8zRo0fN/v37zRtvvGE8PT1NQECAycjIMMacOa6++OILc/ToUXPw4EGzcOFCU61atQLvAwBAcWN+U7bnNzk5OSYkJMTUqVPHHD9+3GldXl6e0/Ykmaefftqp5uuvvzaSzPz5852Wr1y50mn5kSNHjIeHh4mKinLa7jPPPGMkOe379u3bjbe3t5FkWrVqZYYOHWqWLl1qzX3ynThxwvj5+Zn+/fs7LU9OTjYOh8Np+bmOnz///NM0atTISDJ16tQxffr0MXPmzDEpKSkFavP/Ts9l9+7dxuFwmNtuu83k5OQYY4x57733jKurq/n666+damfPnm0kmfXr159ze0BJ4Ot7ADRz5kytXr26wKNFixYXfK2fn5927Nih3bt3X/L7fvbZZ3Jzc9Pjjz/utPyJJ56QMUYrVqyQ9NdveCTpsccec6obMmTIObc9cODAAsu8vb2tP58+fVp//PGH2rdvL0n67rvvCtT369fP+rObm5vatGkjY4yio6Ot5X5+fmrUqJH27dt3zl6kv/ZVkmJjY52WP/HEE5Kk5cuXn/f1l+qzzz5TYGCg07WbKlSooMcff1wnT57UunXrnOq7du2qf/zjH9bzdu3aKSwszOr7bI0aNVKNGjUUEhKiRx99VPXr19fy5csLXLw8IiJCNWrUUHBwsHr06CEfHx999NFHTu8DAEBJYX5TNuc3W7du1f79+zVs2DD5+fk5rSvsrKFBgwY5PV+yZIkcDoduu+02/fHHH9YjNDRUPj4++vLLLyVJX3zxhbKysjRkyBCn7RZ285hrr71WSUlJ+te//qVffvlF06dPV9euXRUQEKC33nrLqlu9erVSU1P14IMPOr23m5ubwsLCrPc+H29vb23cuFFPPfWUpL/uJhkdHa2aNWtqyJAhF/0Vu4yMDN17772qUqWKPvjgA7m5uVnj06RJEzVu3Nipx/wzwC6mR6A48fU9AGrXrp11QeqzValSpdDT3s82fvx43XPPPWrYsKGaNWum22+/Xb169bqoCd+vv/6qoKAgVa5c2Wl5kyZNrPX5/3V1dVVISIhTXf369c+57b/XStKxY8c0btw4LVy4sMBFKdPS0grU165d2+m5w+GQl5eXdZHvs5f//boNf5e/D3/vOTAwUH5+fta+Fpdff/1VDRo0KHAnob+Pbb4GDRoU2EbDhg21ePHiAsv/7//+T76+vqpQoYJq1aqlevXqFdrDzJkz1bBhQ7m7uysgIECNGjW65DsbAQBQVMxvyub8Jv/r/s2aNbtgrbu7u2rVquW0bPfu3UpLSyv0Wk/SmQuT5/f29zlQjRo1VKVKlQKva9iwod577z3l5ubqxx9/1LJlyzRp0iQNGDBAISEhioiIsELMc33F7+zrQZ2Pw+HQpEmTNGnSJP3666+Kj4/Xyy+/rBkzZsjhcOiFF1644Db69++vvXv3asOGDU6XTti9e7d++ukn1ahRo9DXFfeF24ELIZQCcFk6duyovXv36uOPP9bnn3+ut99+W1OnTtXs2bOdfhNnt7N/a5jvgQce0IYNG/TUU0+pVatW8vHxUV5enm6//Xbl5eUVqM//jdKFlkkqcOHSc7mU6wJcqTp27Fhg4lqYc/0wAADAlY75zV+u9PmNp6dngV945eXlyd/fX/Pnzy/0NecKYy6Wm5ubmjdvrubNmys8PFydOnXS/PnzFRERYY33e++9p8DAwAKvLcqd8urUqaNHHnlE9957r6655hrNnz//gqHU9OnT9cEHH+j9999Xq1atnNbl5eWpefPmmjJlSqGvDQ4OvuQegctBKAXgslWtWlV9+/ZV3759dfLkSXXs2FHPPfecNWk710Ql/6KRJ06ccPpt4s6dO631+f/Ny8vT/v37nX6btWfPnovu8fjx44qPj9e4ceM0ZswYa3lRTssvivx92L17t/WbUklKSUlRampqoXdzuRjnG9sffvhBeXl5TpO1v49tvsLG4eeff3a6mx8AAFcT5jcXVhLzm/wzsLdv317got0X+/ovvvhCN9xwQ6Eh3tm9S3+N1TXXXGMtP3r0aIG79J1L/i/fDh8+7NS7v7//BXu/1CCvSpUqqlev3gXvjvz111/rySef1LBhw6y7EZ6tXr16+v7773XrrbeWi1+WouzjexQALsvfT+v28fFR/fr1nb7vXqlSJUlSamqqU22XLl2Um5urGTNmOC2fOnWqXFxcdMcdd0iSIiMjJUmvv/66U91rr7120X3m/wbw77/xmzZt2kVv43J06dKl0PfL/y3V+e60cz6VKlUq9NT8Ll26KDk5WYsWLbKW5eTk6LXXXpOPj49uuukmp/qlS5fq999/t55v2rRJGzdutP4OAAC4mjC/uTglMb9p3bq1QkJCNG3atAJjezFnbj3wwAPKzc3V888/X2BdTk6Otc2IiAhVqFBBr732mtN2Cxu7r7/+utC7NuZfU6tRo0aS/vo79fX11Ysvvlho/dGjR60/n+v4+f777wv9eumvv/6qH3/80Xqvwhw+fFgPPPCAOnTooMmTJxda88ADD+j33393uhZWvlOnTikjI+Oc2wdKAmdKAbgsTZs21c0336zQ0FBVrVpVW7Zs0X//+18NHjzYqgkNDZUkPf7444qMjJSbm5t69Oihu+66S506ddKzzz6rX375RS1bttTnn3+ujz/+WMOGDbN+2xQaGqpu3bpp2rRp+t///mfdMvnnn3+WdHG/afL19VXHjh01adIkZWdn6x//+Ic+//xz7d+/vwRGpaCWLVuqd+/eevPNN5WamqqbbrpJmzZt0rx589S1a1d16tSpSNsNDQ3VokWLFBsbq7Zt28rHx0d33XWXBgwYoDfeeEN9+vRRYmKi6tatq//+979av369pk2bVuA6F/Xr11eHDh00aNAgZWZmatq0aapWrZpGjBhRHLsPAECZwvzm4pTE/MbV1VWzZs3SXXfdpVatWqlv376qWbOmdu7cqR07dmjVqlXnff1NN92kRx99VBMmTFBSUpI6d+6sChUqaPfu3VqyZImmT5+u+++/XzVq1NCTTz6pCRMm6M4771SXLl20detWrVixosBlCl566SUlJibqvvvus64r9t133+ndd99V1apVrYuj+/r6atasWerVq5dat26tHj16qEaNGjpw4ICWL1+uG264wQorz3X8rF69WmPHjtXdd9+t9u3by8fHR/v27dM777yjzMxMPffcc+fc98cff1xHjx7ViBEjtHDhQqd1LVq0UIsWLdSrVy8tXrxYAwcO1JdffqkbbrhBubm52rlzpxYvXqxVq1Zx+QXYq7Ru+weg9OXfMnnz5s2Frr/pppsueMvkF154wbRr1874+fkZb29v07hxY/Of//zHZGVlWTU5OTlmyJAhpkaNGsbFxcXp1rUnTpwww4cPN0FBQaZChQqmQYMGZvLkyU635jXGmIyMDBMTE2OqVq1qfHx8TNeuXc2uXbuMJKdbGOffGvfo0aMF9ue3334z9957r/Hz8zMOh8P885//NIcOHTrnbZf/vo1z3cq4sHEqTHZ2thk3bpwJCQkxFSpUMMHBwWbUqFHm9OnTF/U+hTl58qR56KGHjJ+fn3Xr4HwpKSmmb9++pnr16sbDw8M0b97czJ071+n1+/fvN5LM5MmTzSuvvGKCg4ONp6enufHGG83333/vVHu+sT3bhY4rAABKEvObsj+/McaYb775xtx2222mcuXKplKlSqZFixbmtddeu+jtvfnmmyY0NNR4e3ubypUrm+bNm5sRI0aYQ4cOWTW5ublm3LhxpmbNmsbb29vcfPPNZvv27QWOh/Xr15uYmBjTrFkz43A4TIUKFUzt2rVNnz59zN69ewu895dffmkiIyONw+EwXl5epl69eqZPnz5my5YtVs25jp99+/aZMWPGmPbt2xt/f3/j7u5uatSoYaKiosyaNWuc3if/7zTfTTfdZCQV+jj7WMjKyjIvvfSSufbaa42np6epUqWKCQ0NNePGjTNpaWkX/ssBipGLMRd59ToAuMIkJSXpuuuu0/vvv1/od+ZxYb/88otCQkI0efJkPfnkk6XdDgAAVz3mNwCuJlxTCkCZcOrUqQLLpk2b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JScny8PDQ35+fk7LAwIClJycbNWcHUjlr89fd76a9PR0nTp1Sn/88Ydyc3MLrcnfRmFGjRqltLQ063Hw4MGL22kAAAAAAADIvbTe+ODBgxo6dKhWr14tLy+v0mqjyDw9PeXp6VnabQAAAAAAAJRJpXamVGJioo4cOaLWrVvL3d1d7u7uWrdunV599VW5u7srICBAWVlZSk1NdXpdSkqKAgMDJUmBgYEF7saX//xCNb6+vvL29lb16tXl5uZWaE3+NgAAAAAAAFC8Si2UuvXWW7Vt2zYlJSVZjzZt2qhnz57WnytUqKD4+HjrNbt27dKBAwcUHh4uSQoPD9e2bduc7pK3evVq+fr6qmnTplbN2dvIr8nfhoeHh0JDQ51q8vLyFB8fb9UAAAAAAACgeJXa1/cqV66sZs2aOS2rVKmSqlWrZi2Pjo5WbGysqlatKl9fXw0ZMkTh4eFq3769JKlz585q2rSpevXqpUmTJik5OVmjR49WTEyM9dW6gQMHasaMGRoxYoQeeeQRrVmzRosXL9by5cut942NjVXv3r3Vpk0btWvXTtOmTVNGRob69u1r02gAAAAAAABcXUr97nvnM3XqVN15553q1q2bOnbsqMDAQH344YfWejc3Ny1btkxubm4KDw/Xv/71Lz388MMaP368VRMSEqLly5dr9erVatmypV555RW9/fbbioyMtGq6d++ul19+WWPGjFGrVq2UlJSklStXFrj4OQAAQGl77rnn5OLi4vRo3Lixtf706dOKiYlRtWrV5OPjo27duhW4TMGBAwcUFRWlihUryt/fX0899ZRycnKcatauXavWrVvL09NT9evXV1xcXIFeZs6cqbp168rLy0thYWHatGlTiewzAAAon0rtTKnCrF271um5l5eXZs6cqZkzZ57zNXXq1NFnn3123u3efPPN2rp163lrBg8erMGDB190rwAAAKXl2muv1RdffGE9d3c/M6UbPny4li9friVLlsjhcGjw4MG67777tH79eklSbm6uoqKiFBgYqA0bNujw4cN6+OGHVaFCBb344ouSpP379ysqKkoDBw7U/PnzFR8fr379+qlmzZrWL/YWLVqk2NhYzZ49W2FhYZo2bZoiIyO1a9cu+fv72zgaAACgrLqiz5QCAABAQe7u7goMDLQe1atXlySlpaVpzpw5mjJlim655RaFhoZq7ty5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XH0CAACUG8yhAAAALjOU2rJlix577DHVrFlTU6ZM0ZNPPqm9e/dq9erVOnTokO65557i6hMAAKDcYA4FAAAguRflRVOmTNHcuXO1a9cudenSRe+++666dOkiV9e/Mq6QkBDFxcWpbt26xdkrAABAmcYcCgAA4IwihVKzZs3SI488oj59+qhmzZqF1vj7+2vOnDmX1RwAAEB5whwKAADgjCKFUrt3775gjYeHh3r37l2UzQMAAJRLzKEAAADOKNI1pebOnaslS5YUWL5kyRLNmzfvspsCAAAoj5hDAQAAnFGkUGrChAmqXr16geX+/v568cUXL7spAACA8og5FAAAwBlFCqUOHDigkJCQAsvr1KmjAwcOXHZTAAAA5RFzKAAAgDOKFEr5+/vrhx9+KLD8+++/V7Vq1S67KQAAgPKIORQAAMAZRQqlHnzwQT3++OP68ssvlZubq9zcXK1Zs0ZDhw5Vjx49irtHAACAcoE5FAAAwBlFuvve888/r19++UW33nqr3N3/2kReXp4efvhhrocAAABwDsyhAAAAzihSKOXh4aFFixbp+eef1/fffy9vb281b95cderUKe7+AAAAyg3mUAAAAGcUKZTK17BhQzVs2LC4egEAALgqMIcCAAAoYiiVm5uruLg4xcfH68iRI8rLy3Nav2bNmmJpDgAAoDxhDgUAAHBGkUKpoUOHKi4uTlFRUWrWrJlcXFyKuy8AAIByhzkUAADAGUUKpRYuXKjFixerS5cuxd0PAABAucUcCgAA4AzXorzIw8ND9evXL+5eAAAAyjXmUAAAAGcUKZR64oknNH36dBljirsfAACAcos5FAAAwBlF+vreN998oy+//FIrVqzQtddeqwoVKjit//DDD4ulOQAAgPKEORQAAMAZRQql/Pz8dO+99xZ3LwAAAOUacygAAIAzihRKzZ07t7j7AAAAKPeYQwEAAJxRpGtKSVJOTo6++OILvfHGGzpx4oQk6dChQzp58mSxNQcAAFDeMIcCAAD4S5HOlPr11191++2368CBA8rMzNRtt92mypUr66WXXlJmZqZmz55d3H0CAACUecyhAAAAzijSmVJDhw5VmzZtdPz4cXl7e1vL7733XsXHxxdbcwAAAOUJcygAAIAzinSm1Ndff60NGzbIw8PDaXndunX1+++/F0tjAAAA5Q1zKAAAgDOKdKZUXl6e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zQ8//GDuueceExISYk6dOmVt4/bbbzfXXXed2bhxo/nmm29MgwYNzIMPPmitT01NNQEBAaZXr15m+/btZuHChaZixYrmjTfesH1/C3O+McjKyjJ33323qVWrlklKSnL6/0P+HdQ2bNhgpk6dapKSkszevXvN+++/b2rUqGEefvhh6z3K8hicOHHCPPnkkyYhIcHs37/ffPHFF6Z169amQYMG5vTp09Y2yvNxkC8tLc1UrFjRzJo1q8Drr7TjgFCqFLz22mumdu3axsPDw7Rr1858++231rqbbrrJ9O7d26l+8eLFpmHDhsbDw8Nce+21Zvny5TZ3XPZdypjXqVPHSCrwGDt2rP2Nl1GXeoyfjVCqaC51zDds2GDCwsKMp6enueaaa8x//vMfk5OTY3PXZduljHl2drZ57rnnTL169YyXl5cJDg42jz32mDl+/Lj9jZdBX375ZaH/X84f4969e5ubbrqpwGtatWplPDw8zDXXXGPmzp1re98oXef7N1qWFfZvQZJ1jB84cMB07NjRVK1a1Xh6epr69eubp556yqSlpTlt55dffjF33HGH8fb2NtWrVzdPPPGEyc7OLoU9unTdu3c3NWvWNB4eHuYf//iH6d69u9mzZ4+1/tSpU+axxx4zVapUMRUrVjT33nuvOXz4sNM2yvL+51u1apWRZHbt2uW0vLweAxf6LMjLyzP//ve/TUBAgPH09DS33nprgbH53//+Zx588EHj4+NjfH19Td++fQv84vn77783HTp0MJ6enuYf//iHmThxol27eEHnG4P9+/ef8/8PX375pTHGmMTERBMWFmYcDofx8vIyTZo0MS+++KJTYGNM2R2DP//803Tu3NnUqFHDVKhQwdSpU8f079+/wC8kyvNxkO+NN94w3t7eJjU1tcDrr7TjwMUYvjcAAAAAAAAAe3FNKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAADAJfnll1/k4uKipKSk0m5FknTzzTdr2LBhpd0GgEtEKAXgqlJSE5abb75ZLi4ucnFxkZeXl5o2barXX3/dWh8XF2etd3V1Va1atdS3b18dOXKk2HsBAAAoDR999JHat28vh8OhypUr69prr73keZeLi4uWLl3qtCw3N1cTJ05U48aN5e3trapVqyosLExvv/22VfPhhx/q+eefL4a9AGAn99JuAADKi/79+2v8+PH6888/9e677yomJkZVqlTRgw8+KEny9fXVrl27lJeXp++//159+/bVoUOHtGrVqlLuHAAAXK2ys7NVoUKFy95OfHy8unfvrv/85z+6++675eLioh9//FGrV6++7G2PGzdOb7zxhmbMmKE2bdooPT1dW7Zs0fHjx62aqlWrXvb7ALAfZ0oBuGr06dNH69at0/Tp062zln755RetW7dO7dq1k6enp2rWrKmnn35aOTk51utuvvlmDR48WIMHD5bD4VD16tX173//W8YYp+1XrFhRgYGBuuaaa/Tcc8+pQYMG+uSTT6z1Li4uCgwMVFBQkO644w49/vjj+uKLL3Tq1CnbxgAAAJR/eXl5mjRpkurXry9PT0/Vrl1b//nPf6yv3C1atEg33XSTvLy8NH/+fEnS22+/rSZNmsjLy0uNGzd2OuNbkjZt2qTrrrtOXl5eatOmjbZu3eq0/tNPP9UNN9ygp556So0aNVLDhg3VtWtXzZw506nu448/VuvWreXl5aVrrrlG48aNs+ZddevWlSTde++9cnFxsZ5/8skneuyxx/TPf/5TISEhatmypaKjo/Xkk09a2z37bPi1a9dac72zH3369LmoPgDYhzOlAFw1pk+frp9//lnNmjXT+PHjJf11OniXLl3Up08fvfvuu9q5c6f69+8vLy8vPffcc9Zr582bp+joaG3atElbtmzRgAEDVLt2bfXv3/+c7+ft7a2srKzzrs/Ly2MCBAAAitWoUaP01ltvaerUqerQoYMOHz6snTt3WuuffvppvfLKK1bINH/+fI0ZM0YzZszQddddp61bt6p///6qVKmSevfurZMnT+rOO+/Ubbfdpvfff1/79+/X0KFDnd4zMDBQCxYs0Pbt29WsWbNC+/r666/18MMP69VXX9WNN96ovXv3asCAAZKksWPHavPmzfL399fcuXN1++23y83Nzdr2mjVr9Nhjj6lGjRoX3P/rr79ehw8ftp7/9NNP6tKlizp27HhRfQCwkQGAq8hNN91khg4daj1/5plnTKNGjUxeXp61bObMmcbHx8fk5uZar2nSpIlTzciRI02TJk0K3W5OTo557733jCQzY8YMY4wxc+fONQ6Hw6r/+eefTcOGDU2bNm1KYC8BAMDVKj093Xh6epq33nqrwLr9+/cbSWbatGlOy+vVq2cWLFjgtOz555834eHhxhhj3njjDVOtWjVz6tQpa/2sWbOMJLN161ZjjDEnT540Xbp0MZJMnTp1TPfu3c2cOXPM6dOnrdfceuut5sUXX3R6n/fee8/UrFnTei7JfPTRR041O3bsME2aNDGurq6mefPm5tFHHzWfffaZU83f53j5/vjjD3PNNdeYxx577JL6AGAPvr4H4Kr2008/KTw8XC4uLtayG264QSdPntRvv/1mLWvfvr1TTXh4uHbv3q3c3Fxr2euvvy4fHx95e3urf//+Gj58uAYNGmStT0tLk4+PjypWrKhGjRopICDAOmUeAACgOPz000/KzMzUrbfees6aNm3aWH/OyMjQ3r17FR0dLR8fH+vxwgsvaO/evdY2W7RoIS8vL+t14eHhTtusVKmSli9frj179mj06NHy8fHRE088oXbt2unPP/+UJH3//fcaP3680/v0799fhw8ftmoK07RpU23fvl3ffvutHnnkER05ckR33XWX+vXrd96xyM7OVrdu3VSnTh1Nnz7dWl7UPgAUP76+BwDFpGfPnnr22Wfl7e2tmjVrytXVOfevXLmyvvvuO7m6uqpmzZry9vYupU4BAEB5dTHzi0qVKll/PnnypCTprbfeUlhYmFNd/tfnLkW9evVUr1499evXT88++6waNmyoRYsWqW/fvjp58qTGjRun++67r8Drzg68CuPq6qq2bduqbdu2GjZsmN5//3316tVLzz77rEJCQgp9zaBBg3Tw4EFt2rRJ7u5nfvS9nD4AFC9CKQBXFQ8PD6ezm5o0aaL/+7//kzHGOhNq/fr1qly5smrVqmXVbdy40Wk73377rRo0aOA0WXM4HKpfv/4539vV1fW86wEAAC5XgwYN5O3trfj4+AueSSRJAQEBCgoK0r59+9SzZ89Ca5o0aaL33ntPp0+ftkKbb7/99oLbrlu3ripWrKiMjAz9v/buJxTWL47j+OdH/iymJqFYMFZjTIlRJLMYG/kTuyllMRbI5G8NjaZhUDbKMJGdYm07sniwkyIpYTEbJquJBSvSJL/F7U7N7+Zm9bj97vtVz+p5zul7dqdP5/scSWpoaFAikfjtfigvLy9rr/YZp9MpSZm5/2t1dVW7u7s6OTlRcXFx1ruv1AHAHIRSAP4qVVVVOj09VTKZlMVi0cjIiGKxmMbHxzU2NqZEIqH5+XkFAoGsk0739/cKBAIaHh7WxcWFNjY2FI1Gv3ElAAAAvyosLNTMzIyCwaDy8/Pldrv1+Piom5ubT1v6FhcXNTExIavVqo6ODr29ven8/FxPT08KBALq6+tTOBzW0NCQQqGQksmkVlZWsuZYWFjQy8uLurq6ZLPZ9Pz8rPX1daXTabW1tUmSIpGIuru7VVlZKa/Xq5ycHF1eXur6+lpLS0uSfuzVjo6O5Ha7VVBQoKKiInm9XrndbrW0tKisrEx3d3cKhUKy2+1yOBy/rOfw8FDBYFCbm5sqKSlRKpWS9OMUmdVq/VIdAMzBP6UA/FWmp6eVm5srp9Op0tJSpdNp7e/v6+zsTHV1dfL7/RoYGNDs7GzWOJ/Pp9fXVzU1NWl0dFSTk5OZW1oAAAD+JHNzc5qamlIkElFNTY16e3v18PDw6feDg4Pa2trS9va2amtr5fF4tLOzk2mLs1gsisfjurq6ksvlUjgc1vLyctYcHo9Ht7e38vl8cjgc6uzsVCqVkmEYqq6uliS1t7drb29PhmGosbFRzc3NWltbk81my8wTjUZ1cHCgiooKuVyuzLh4PK6enh7Z7Xb19/fL4XDIMIystryfjo+P9f7+Lr/fr/Ly8szz88bAr9QBwBz/fHx8fHx3EQDwJ2ttbVV9fb1isdh3lwIAAAAA/xuclAIAAAAAAIDpCKUAAAAAAABgOtr3AAAAAAAAYDpOSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANMRSgEAAAAAAMB0hFIAAAAAAAAwHaEUAAAAAAAATEcoBQAAAAAAANP9C6kl2AG33XGVAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "pdf = susie_results.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Repeating the same steps, but filtering for only the first credible set" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Total number of primary credible sets and number of unique studyIds:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of primary credible sets: 9495\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 209:====================================================>(880 + 8) / 893]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of unique studyIds in primary credible sets: 2015\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "first_credset = susie_results.filter(f.col(\"credibleSetIndex\") == 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------\n", + " meanTopPP | 0.8085156719419792 \n", + " minTopPP | 0.011231041748358246 \n", + " q1TopPP | 0.6270685668930966 \n", + " medianTopPP | 0.9999984922517341 \n", + " q3TopPP | 1.0 \n", + " maxTopPP | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanCredSetSize | 5.875934702474987 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 1 \n", + " q3CredSetSize | 4 \n", + " maxCredSetSize | 1022 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0----------------------------------\n", + " meanPurityMeanR2 | 0.7587573150386597 \n", + " minPurityMeanR2 | 0.011839476509578747 \n", + " q1PurityMeanR2 | 0.520396112272186 \n", + " medianPurityMeanR2 | 0.9839697266684606 \n", + " q3PurityMeanR2 | 1.0 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 226:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------------\n", + " meanPurityMinR2 | 0.6480281642261705 \n", + " minPurityMinR2 | 0.0 \n", + " q1PurityMinR2 | 0.002472980432442... \n", + " medianPurityMinR2 | 0.9659616302635498 \n", + " q3PurityMinR2 | 1.0 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "(\n", + " first_credset.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " first_credset.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "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/vjjeuCBB/TGG28oKChII0eO1FdffXXbY9W3b1+NGzdOdevW1ezZs9W0aVNNnTpVXbp0scx5//339eijj8rZ2dlyrJo0aXLL9Z47d05t27ZVcHCwpk+frrJly+qFF17I0njkxN9//602bdqoTp06mjNnjpo3b55lTrVq1TRp0iRJ/zZR19fbvXt3paWl6aOPPrL6TEpKij7++GN17NhRLi4uVsuee+45nT592qr5W7FihR577DH5+Pjcce2//fabOnXqpMcff1wzZ85U8eLF1bNnTx08ePC2n81sSIsXL37bufHx8ZJkOQsIACh86JHokW5UEHqkhIQENWrUSF9++aUGDhyouXPnKigoSH369NGcOXMs85KSkrRo0SI1a9ZMb7zxhiZMmKCzZ88qNDQ023thrVixQjNmzFD//v01ZcoUHT9+XB06dLijfx/osXBPMgDY1JIlSwxJt3zVqFHD6jMBAQFGeHi45f2DDz5ohIWF3XI7ERERRnb/yn/22WeGJGPKlClW4506dTLs7OyM3377zTAMw4iNjTUkGUOHDrWa17NnT0OSMX78eMvY+PHjDUnGs88+m2V7ly9fzjL24YcfGpKMr776Kss6+vXrZxlLS0szypYta9jZ2RnTpk2zjJ87d85wdXW1OibZiYuLMyQZffv2tRofOXKkIcnYsmWLZSw8PNwoVqzYLdeXqWnTpoYkY+bMmZax5ORko06dOoaPj4+RkpJiGMa1n/WxY8esPr9161ZDkrF169Ys61ywYEG222vatKnl/Z49ewxJxpIlS7LMDQkJMRo2bGg1tmbNmmy3l/l7Vq9ePaNPnz6GYfx7bJ2cnIylS5da6ly9erXlc9ntU0BAQJaf55kzZwxnZ2djxIgRWfb7vffeM86ePWucOnXK2LBhgxEUFGTY2dkZ3333XZb9uVGfPn0Me3t745dffrntXABAwUKPRI9UkHukPn36GKVLlzb++usvq2106dLF8PT0tPy809LSjOTkZKs5586dM3x9fY3evXtbxo4dO2ZIMkqWLGn8888/lvHPP//ckGR88cUXlrHM35HDhw8bZ8+eNY4fP2689957hqurq+Ht7W1cunQpy/G4XnJyslG9enUjMDDQSE1NveVc4G5xpRRwj4iMjFRMTEyWV+3atW/7WS8vLx08eFC//vprjre7bt062dvba/DgwVbjI0aM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8mSlpaVp69atluVz5szR6NGjVb9+fVWqVEmvv/66KlWqpC+++OKOjzUAAChYCluflJGRoalTpyowMFCurq568MEH9fHHH1uWp6enq0+fPpblVapUyXL1Us+ePdWuXTu9+eabKl26tEqWLKmIiAilpqZazStatKj8/PwUEBCgXr16qXbt2oqJibEs7927t+bOnaumTZuqQoUK6tatm3r16mW1HwDyF6EUgHvC0qVL5eDgoO+++05z587VrFmztGjRohyt4+WXX9aQIUP0008/KTQ01GpZ586dNWLECNWoUUOnT5/W6dOn1blzZ/Xt21cbNmzQ6dOnLXPXrl2ry5cvq3Pnzlbr6N27t5YsWWJ5/95776lXr153VNvMmTNVr1497du3Ty+++KJeeOEFHT58ONu5aWlplkbPycnppuvMyMjQhQsXVKJEiTuqAQAAFEyFqU+aOnWqli1bpgULFujgwYMaNmyYunXrpu3bt0v6t78pW7asVq9erUOHDmncuHF65ZVXtGrVKqv1bN26VUeOHNHWrVu1dOlSRUVFWYK4GxmGoa+//lo///zzLXsrSUpMTKS3AkzkYOsCAED697Lv2bNny87OTlWqVNH+/fs1e/ZsPf/883e8jqFDh6pDhw7ZLnN1dZWbm5scHBzk5+dnGX/44YdVpUoVvf/++xo9erSkf79G95///Edubm5W6+jWrZvGjBmj33//XZK0c+dOrVy5Utu2bbttbW3bttWLL74oSXrppZc0e/Zsbd26VVWqVLHMefbZZ2Vvb68rV64oIyND5cuX1zPPPHPTdb755pu6ePHiLecAAICCr7D0ScnJyXr99df15ZdfKiQkRJJUoUIF7dixQ++8846aNm0qR0dHTZw40fKZwMBA7d69W6tWrbLqeYoXL6558+bJ3t5eVatWVVhYmDZv3mx1TN5++20tWrRIKSkpSk1NlYuLiwYPHnzTY7Rr1y599NFHio6Ovt3hBJBHuFIKwD2hUaNGsrOzs7wPCQnRr7/+qvT09DteR7169XK17b59+1rO7CUkJGj9+vXq3bt3lnne3t4KCwtTVFSUlixZorCwMJUqVeqOtlG7dm3Ln+3s7OTn56czZ85YzZk9e7bi4uK0fv16Va9eXYsWLbrpmboVK1Zo4sSJWrVqVZ7dDwIAANybCkuf9Ntvv+ny5ct6/PHH5ebmZnktW7ZM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OiazZ8/WxYsXFRcXp4CAAKtlZ86cydNtffbZZ9q3b5+WL1+u5557zmrZ1atXlZKSYnnv4OAgBwf+9x2FD1/fA3BLN37PPjU1VRMnTlSlSpXk4uKikiVLqnHjxoqJiZEk9ezZU5GRkZJk9ZWuTJcuXdKIESPk7+8vZ2dnValSRW+++aYMw7Da7pUrVzR48GCVKlVK7u7ueuqpp/Tnn3/Kzs7O6ixT5lfMDh06pOeee07FixdX48aNJUk//vijevbsqQoVKlguve7du7f+/vtvq21lruOXX35Rt27d5OnpKW9vb/33v/+VYRg6efKknn76aXl4eMjPz08zZ868o2OXlpamyZMnq2LFinJ2dlb58uX1yiuvKDk52TLHzs5OS5Ys0aVLlyzHKioqKtv1NWvWTNHR0fr9998tc8uXL29ZfubMGfXp00e+vr5ycXHRgw8+qKVLl1qt4/jx47Kzs9Obb76p2bNnKyAgQK6urmratKkOHDhwR/vVokULSdKxY8fyZB4AAGait7l3eptM3377rdq2bavixYurWLFiql27tubOnWtZ3rNnT7m5uenIkSNq27at3N3d1bVrV0lSRkaG5syZoxo1asjFxUW+vr7q37+/zp07Z7UNwzA0ZcoUlS1bVkWLFlXz5s118ODBLLUcOXJEZcuWzRJISZKPj0+WsfXr1+vRRx9VsWLF5O7urrCwMKv13ur358iRI5KkRx55JMt6XVxc5OHhYXl/4z2levbsabW+61/X/z4lJydr/PjxCgoKkrOzs/z9/TV69GirnxlgS0StwH0oMTFRf/31V5bx1NTU2352woQJmjp1qvr27asGDRooKSlJ33//vfbu3avHH39c/fv316lTpxQTE6P333/f6rOGYeipp57S1q1b1adPH9WpU0cbN27UqFGj9Oeff2r27NmWuT179tSqVavUvXt3NWrUSNu3b1dYWNhN6/rPf/6jSpUq6fXXX7c0gTExMTp69Kh69eolPz8/HTx4UAsXLtTBgwf1zTffZLlZZOfOnVWtWjVNmzZN0dHRmjJlikqUKKF33nlHLVq00BtvvKHly5dr5MiRql+/vpo0aXLLY9W3b18tXbpUnTp10ogRI/Ttt99q6tSp+umnn/Tpp59Kkt5//30tXLhQ3333nRYtWiRJevjhh7Nd36uvvqrExET98ccflmPl5uYm6d9Gt1mz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AABsRygFAAAAAAAA2xFKAQAAAAAAwHaEUmUsKSlJN998s3x8fNS+fXtt27btF+uXLVumJk2ayMfHRy1atNCqVats6rTyuZq1nzdvnu666y7VqlVLtWrVUnR09K/+s8KlXe3PfIklS5bIw8NDDzzwQPk2WEld7brn5uYqISFBISEhcjgcuvXWW/n3TSld7dpPnz5djRs3lq+vr8LCwjRixAidPXvWpm4rh40bN+q+++5TaGioPDw89PHHH//qa9avX682bdrI4XCoYcOGSk5OLvc+YZ/S/u7BeRMnTtTtt9+umjVrKjAwUA888IAyMzNdas6ePauEhATVqVNHNWrUUO/evZWTk+NSk5WVpdjYWFWrVk2BgYEaOXKkzp07Z+dUKpxJkybJw8NDw4cPt46x1mXrhx9+0COPPKI6derI19dXLVq00I4dO6xxY4zGjh2rkJAQ+fr6Kjo6Wt98843LOY4fP664uDj5+fkpICBA8fHxOnXqlN1Tua4VFRXphRdeUEREhHx9fdWgQQNNmDBBF36XGmtder+2/ymrtf3qq6901113ycfHR2FhYZo8eXJ5T82VQZlZsmSJ8fb2Nu+++67Zu3evGTRokAkICDA5OTmXrP/iiy+Ml5eXmTx5stm3b58ZM2aMqVq1qtm9e7fNnVd8V7v2ffv2NUlJSWbnzp1m//795tFHHzX+/v7m3//+t82dV2xXu+4lDh06ZH7zm9+Yu+66y9x///32NFuJXO265+fnm3bt2pmePXuaTZs2mUOHDpn169ebjIwMmzuv+K527RctWmQcDodZtGiROXTokFmzZo0JCQkxI0aMsLnzim3VqlXm+eefNx9++KGRZD766KNfrD948KCpVq2aSUxMNPv27TOzZs0yXl5eZvXq1fY0jHJV2t89cBUTE2MWLFhg9uzZYzIyMkzPnj1N/fr1zalTp6yaIUOGmLCwMJOammp27NhhOnToYO68805r/Ny5c6Z58+YmOjra7Ny506xatcrUrVvXjB492h1TqhC2bdtmbr75ZtOyZUszbNgw6zhrXXaOHz9uwsPDzaOPPmq2bt1qDh48aNasWWO+/fZbq2bSpEnG39/ffPzxx2bXrl3m97//vYmIiDBnzpyxarp3725uu+02s2XLFvPPf/7TNGzY0Dz88MPumNJ165VXXjF16tQxK1asMIcOHTLLli0zNWrU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LGuto6KitHv3bpf/6ElJSZGfn99FocCNrGvXrhftgdq1a6e4uDjrz6x12enYsaMyMzNdjh04cEDh4eGSpIiICAUHB7ust9Pp1NatW13WOzc3V+np6VbNunXrVFxcrPbt29swi4rhcvuckj0na11+ympto6KitHHjRhUWFlo1KSkpaty4sS0f3ZMkvn2vDC1ZssQ4HA6TnJxs9u3bZwYPHmwCAgKsb8no16+fee6556z6L774wlSpUsW88cYbZv/+/ebFF180VatWNbt373bXFCqsq137SZMmGW9vb/P//t//M0ePHrUeJ0+edNcUKqSrXfef49v3Sudq1z0rK8vUrFnTDB061GRmZpoVK1aYwMBA8/LLL7trChXW1a79iy++aGrWrGn+9re/mYMHD5q1a9eaBg0amD/96U/umkKFdPLkSbNz506zc+dOI8lMnTrV7Ny50/zrX/8yxhjz3HPPmX79+ln1Bw8eNNWqVTMjR440+/fvN0lJScbLy8usXr3aXVNAGfq1v4e4Mk888YTx9/c369evd9kL/fjjj1bNkCFDTP369c26devMjh07TFRUlImKirLGz507Z5o3b266detmMjIyzOrVq81NN91kRo8e7Y4pVSgXfvueMax1Wdq2bZupUqWKeeWVV8w333xjFi1aZKpVq2bef/99q2bSpEkmICDA/OMf/zBfffWVuf/++01ERIQ5c+aMVdO9e3fTunVrs3XrVrNp0ybTqFEj8/DDD7tjStetAQMGmN/85jdmxYoV5tChQ+bDDz80devWNaNGjbJqWOvS+7X9T1msbW5urgkKCjL9+vUze/bsMUuWLDHVqlUzb731lm3zJJQqY7NmzTL169c33t7e5o477jBbtmyxxu6++24zYMAAl/qlS5eaW2+91Xh7e5tmzZqZlStX2txx5XE1ax8eHm4kXfR48cUX7W+8grvan/kLEUqV3tWu++bNm0379u2Nw+Ewt9xyi3nllVfMuXPnbO66criatS8sLDTjxo0zDRo0MD4+PiYsLMw8+eST5sSJE/Y3XoF9/vnnl/x3dslaDxgwwNx9990XvaZVq1bG29vb3HLLLWbBggW2943y80t/D3FlLvV3SpLL35UzZ86YJ5980tSqVctUq1bNPPjgg+bo0aMu5/n+++9Njx49jK+vr6lbt675y1/+YgoLC22eTcXz81CKtS5bn3zyiWnevLlxOBymSZMm5u2333YZLy4uNi+88IIJCgoyDofDdO3a1WRmZrrU/O9//zMPP/ywqVGjhvHz8zMDBw7kf2D/jNPpNMOGDTP169c3Pj4+5pZbbjHPP/+8yc/Pt2pY69L7tf1PWa3trl27TKdOnYzD4TC/+c1vzKRJk+yaojHGGA9j+PwAAAAAAAAA7MU9pQAAAAAAAGA7QikAAAAAAADYjlAKAAAAAAAAtiOUAgAAAAAAgO0IpQAAAAAAAGA7QikAAAAAAADYjlAKAAAAAAAAtiOUAgAAAAAAgO0IpQAAAAAAl/X999/Lw8NDGRkZ7m5FktSlSxcNHz7c3W0AKAOEUgAqtfLatHTp0kUeHh7y8PCQj4+PmjZtqjfffNMaT05OtsY9PT1Vr149DRw4UMeOHSvzXgAAAOz20UcfqUOHDvL391fNmjXVrFmzq95zeXh46OOPP3Y5VlRUpEmTJqlJkyby9fVV7dq11b59e73zzjtWzYcffqgJEyaUwSwAuFsVdzcAABXVoEGDNH78eP3444967733lJCQoFq1aunhhx+WJPn5+SkzM1PFxcXatWuXBg4cqCNHjmjNmjVu7hwAANyICgsLVbVq1Ws+T2pqqh566CG98sor+v3vfy8PDw/t27dPKSkp13zul156SW+99ZZmz56tdu3ayel0aseOHTpx4oRVU7t27Wt+HwDXB66UAlBpPfroo9qwYYNmzJhhXbX0/fffa8OGDbrjjjvkcDgUEhKi5557TufOnbNe16VLFw0dOlRDhw6Vv7+/6tatqxdeeEHGGJfzV6tWTcHBwbrllls0btw4NWrUSMuXL7fGPTw8FBwcrNDQUPXo0UNPP/20PvvsM505c8a2NQAAAJVbcXGxJk+erIYNG8rhcKh+/fp65ZVXrI/cffDBB7r77rvl4+OjRYsWSZLeeecdRUZGysfHR02aNHG52luStm3bptatW8vHx0ft2rXTzp07XcY/+eQTdezYUSNHjlTjxo1166236oEHHlBSUpJL3T/+8Q+1adNGPj4+uuWWW/TSSy9Ze66bb75ZkvTggw/Kw8PDer58+XI9+eST+uMf/6iIiAjddtttio+P1zPPPGOd98Ir4devX2/t8y58PProo1fUBwD34kopAJXWjBkzdODAATVv3lzjx4+X9NMl4T179tSjjz6q9957T19//bUGDRokHx8fjRs3znrtwoULFR8fr23btmnHjh0aPHiw6tevr0GDBl32/Xx9fVVQUPCL48XFxWyCAABAmRk9erTmzZunadOmqVOnTjp69Ki+/vpra/y5557TlClTrJBp0aJFGjt2rGbPnq3WrVtr586dGjRokKpXr64BAwbo1KlT+t3vfqff/va3ev/993Xo0CENGzbM5T2Dg4O1ePFi7dmzR82bN79kX//85z/Vv39/zZw5U3fddZe+++47DR48WJL04osvavv27QoMDNSCBQvUvXt3eXl5Wedet26dnnzySd10002/Ov8777xTR48etZ7v379fPXv2VOfOna+oDwBuZgCgErv77rvNsGHDrOf/93//Zxo3bmyKi4utY0lJSaZGjRqmqKjIek1kZKRLzbPPPmsiIyMved5z586Zv/71r0aSmT17tjHGmAULFhh/f3+r/sCBA+bWW2817dq1K4dZAgCAG5HT6TQOh8PMmzfvorFDhw4ZSWb69Okuxxs0aGAWL17scmzChAkmKirKGGPMW2+9ZerUqWPOnDljjc+ZM8dIMjt37jTGGHPq1CnTs2dPI8mEh4ebhx56yMyfP9+cPXvWek3Xrl3Nq6++6vI+f/3rX01ISIj1XJL56KOPXGr27t1rIiMjjaenp2nRooX585//bFatWuVS8/P9XYn//ve/5pZbbjFPPvnkVfUBwH34+B6AG8r+/fsVFRUlDw8P61jHjh116tQp/fvf/7aOdejQwaUmKipK33zzjYqKiqxjb775pmrUqCFfX18NGjRII0aM0BNPPGGN5+XlqUaNGqpWrZoaN26soKAg67J5AACAa7V//37l5+era9eul61p166d9efTp0/ru+++U3x8vGrUqGE9Xn75ZX333XfWOVu2bCkfHx/rdVFRUS7nrF69ulauXKlvv/1WY8aMUY0aNfSXv/xFd9xxh3788UdJ0q5duzR+/HiX9xk0aJCOHj1q1VxK06ZNtWfPHm3ZskWPPfaYjh07pvvuu0+PP/74L65FYWGhevfurfDwcM2YMcM6Xto+ANiDj+8BQCnFxcXp+eefl6+vr0JCQuTp6Zrz16xZU19++aU8PT0VEhIiX19fN3UKAAAqoyvZW1SvXt3686lTpyRJ8+bNU/v27V3qSj4+dzUaNGigBg0a6PHHH9fzzz+vW2+9VR988IEGDhyoU6dO6aWXXlKvXr0uet2FgdeleHp66vbbb9ftt9+u4cOH6/3331e/fv30/PPPKyIi4pKveeKJJ3T48GFt27ZNVaqc/8/ca+kDQPkjlAJQqXl7e7tc3RQZGam///3vMsZYV0J98cUXqlmzpurVq2fVbd261eU8W7ZsUaNGjVw2bP7+/mrYsOFl39vT0/MXxwEAAK5Fo0aN5Ovrq9TU1F+9kkiSgoKCFBoaqoMHDyouLu6SNZGRkfrrX/+qs2fPWqHNli1bfvXcN998s6pVq6bTp09Lktq0aaPMzMxf3AtVrVrVZZ92OU2bNpUk69w/N3XqVC1dulSbN29WnTp1XMaupA8A7kMoBaBSu/nmm7V161Z9//33qlGjhp588klNnz5dTz31lIYOHarMzEy9+OKLSkxMdLnSKSsrS4mJifrzn/+sL7/8UrNmzdKUKVPcOBMAAABXPj4+evbZZzVq1Ch5e3urY8eO+s9//qO9e/de9iN9L730kp5++mn5+/ure/fuys/P144dO3TixAklJiaqb9++ev755zVo0CCNHj1a33//vd544w2Xc4wbN04//vijevbsqfDwcOXm5mrmzJkqLCzUb3/7W0nS2LFj9bvf/U7169fXH/7wB3l6emrXrl3as2ePXn75ZUk/7dNSU1PVsWNHORwO1apVS3/4wx/UsWNH3XnnnQoODtahQ4c0evRo3XrrrWrSpMlF8/nss880atQoJSUlqW7dusrOzpb001Vk/v7+V9QHAPfhnlIAKrVnnnlGXl5eatq0qW666SYVFhZq1apV2rZtm2677TYNGTJE8fHxGjNmjMvr+vfvrzNnzuiOO+5QQkKChg0bZn1TCwAAwPXihRde0F/+8heNHTtWkZGReuihh3Ts2LHL1j/++ON65513tGDBArVo0UJ33323kpOTrY/F1ahRQ5988ol2796t1q1b6/nnn9drr73mco67775bBw8eVP/+/dWkSRP16NFD2dnZWrt2rRo3bixJiomJ0YoVK7R27Vrdfvvt6tChg6ZNm6bw8HDrPFOmTFFKSorCwsLUunVr63WffPKJ7rvvPt16660aMGCAmjRporVr17p8LK/Epk2bVFRUpCFDhigkJMR6lHxj4JX0AcB9PIwxxt1NAMD1pEuXLmrVqpWmT5/u7lYAAAAAoNLiSikAAAAAAADYjlAKAAAAAAAAtuPjewAAAAAAALAdV0oBAAAAAADAdoRSAAAAAAAAsB2hFAAAAAAAAGxHKAUAAAAAAADbEUoBAAAAAADAdoRSAAAAAAAAsB2hFAAAAAAAAGxHKAUAAAAAAADb/X+pWVkjnevuxAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdf = first_credset.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# # Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Filtering credible sets with qc function" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24/08/07 10:05:27 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of high quality credible sets: 33544\n", + "Number of unique studyIds in high quality credible sets: 2188\n" + ] + } + ], + "source": [ + "qc_credsets = SUSIE_inf.credible_set_qc(\n", + " susie_fm, study_index, ld_index, 1e-5, 0.25, 0.8\n", + ").persist()\n", + "\n", + "qc_credsets = (\n", + " qc_credsets.df.withColumn(\"credSetSize\", f.size(\"locus\"))\n", + " .withColumn(\n", + " \"locus\",\n", + " f.slice(order_array_of_structs_by_field(\"locus\", \"posteriorProbability\"), 1, 1)[\n", + " 0\n", + " ],\n", + " )\n", + " .withColumn(\"topPP\", f.col(\"locus\").getField(\"posteriorProbability\"))\n", + " .filter(~f.isnan(\"topPP\"))\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0---------------------------\n", + " meanTopPP | 0.9033882550691011 \n", + " minTopPP | 0.013988537311438214 \n", + " q1TopPP | 0.9937867852571437 \n", + " medianTopPP | 0.9999999999596412 \n", + " q3TopPP | 1.0 \n", + " maxTopPP | 1.0 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0-------------------------------\n", + " meanCredSetSize | 3.2039709038874316 \n", + " minCredSetSize | 1 \n", + " q1CredSetSize | 1 \n", + " medianCredSetSize | 1 \n", + " q3CredSetSize | 1 \n", + " maxCredSetSize | 1022 \n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0--------------------------------\n", + " meanPurityMeanR2 | 0.9789336464434549 \n", + " minPurityMeanR2 | 0.5417537849178955 \n", + " q1PurityMeanR2 | 1.0 \n", + " medianPurityMeanR2 | 1.0 \n", + " q3PurityMeanR2 | 1.0 \n", + " maxPurityMeanR2 | 1.0 \n", + "\n", + "-RECORD 0--------------------------------\n", + " meanPurityMinR2 | 0.9491503761431416 \n", + " minPurityMinR2 | 0.25018750677013313 \n", + " q1PurityMinR2 | 1.0 \n", + " medianPurityMinR2 | 1.0 \n", + " q3PurityMinR2 | 1.0 \n", + " maxPurityMinR2 | 1.0 \n", + "\n" + ] + } + ], + "source": [ + "(\n", + " qc_credsets.select(\n", + " f.mean(\"topPP\").alias(\"meanTopPP\"),\n", + " f.min(\"topPP\").alias(\"minTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.25).alias(\"q1TopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.5).alias(\"medianTopPP\"),\n", + " f.percentile_approx(\"topPP\", 0.75).alias(\"q3TopPP\"),\n", + " f.max(\"topPP\").alias(\"maxTopPP\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"credSetSize\").alias(\"meanCredSetSize\"),\n", + " f.min(\"credSetSize\").alias(\"minCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.25).alias(\"q1CredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.5).alias(\"medianCredSetSize\"),\n", + " f.percentile_approx(\"credSetSize\", 0.75).alias(\"q3CredSetSize\"),\n", + " f.max(\"credSetSize\").alias(\"maxCredSetSize\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"purityMeanR2\").alias(\"meanPurityMeanR2\"),\n", + " f.min(\"purityMeanR2\").alias(\"minPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.25).alias(\"q1PurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.5).alias(\"medianPurityMeanR2\"),\n", + " f.percentile_approx(\"purityMeanR2\", 0.75).alias(\"q3PurityMeanR2\"),\n", + " f.max(\"purityMeanR2\").alias(\"maxPurityMeanR2\"),\n", + " ).show(vertical=True)\n", + ")\n", + "(\n", + " qc_credsets.select(\n", + " f.mean(\"purityMinR2\").alias(\"meanPurityMinR2\"),\n", + " f.min(\"purityMinR2\").alias(\"minPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.25).alias(\"q1PurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.5).alias(\"medianPurityMinR2\"),\n", + " f.percentile_approx(\"purityMinR2\", 0.75).alias(\"q3PurityMinR2\"),\n", + " f.max(\"purityMinR2\").alias(\"maxPurityMinR2\"),\n", + " ).show(vertical=True)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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1FNPPaVatWrpk08+4SweACBF9Ef/oj9KLjv7o6TPq1evXurTp0+KY5Ku9Pvoo48UFBSkTp06adSoUfL09JSdnZ2mTp2a7IYvUvo+4+bNm1tDyieffFK1a9dWz549FRkZmeLJv/DwcL366qt66aWX9MYbb6S4HyCzuFIKyMdKlCihvn376uOPP9bvv/+uOnXq2NzxJbUv/PLly+vs2bO6du2azfJffvnFuj7pfxMTE3Xq1CmbccePH09zjZcvX9aWLVv02muvaeLEiercubPatm2rihUrpnkbmZF0DPdexn/+/HlduXLFeqwZcfbsWd24ccNm2a+//irp37sBSXfOZl25csVmXGbOQEoPbiJfeOEF/frrr/rhhx+0fPly1a9fP8U7rdzt+eef17fffitXV1fTz5S9/fbbunXrVopXQJ04cULt27eXp6en1q9fL2dnZ1NrAwDkLfRHD0Z/lLX9kYeHh1xcXJSQkJDiVX5t2rSxTo7+ySefqGLFilq7dq169+6tgIAAtWnTJtnd/zLL2dlZ48ePV1RUlFavXp1s/RdffKH+/furS5cu1jtSAtmBUArIp+69XbCzs7MqV65scxvfpEun7/3CDwwMVEJCgubPn2+zfPbs2bJYLOrQoYMkKSAgQJL07rvv2oybN29emutMOrtz79mcu+9Ckp2Smod79zdr1ixJuu+dch4kPj5e77//vvX57du39f7778vDw0N+fn6SpEqVKkmSzV1wEhIStGjRogzvV0r9s03SoUMHlSpVStOmTdM333xz37OASbp166bx48fr3XffzfQl8ulVqVIlde3aVeHh4da7v0j/3gmmXbt2KlSokDZt2iQPDw9T6wIA5C30R2lDf5S1/ZGdnZ26du2qTz/9VIcOHUq2/uLFizZjJdvP/vvvv9eePXseWEt69ezZU2XLltW0adNslu/YsUM9evRQ8+bNtXz58gdOoQBkBr9vAPKpGjVqqGXLlvLz81OJEiW0b98+ffLJJwoNDbWOSfriHzx4sAICAmRnZ6cePXroySefVKtWrTR27FidPn1adevW1ebNm/XFF19o6NCh1kbBz89PXbt21Zw5c/T333+rSZMm+uabb6xnu9Jyyberq6uaN2+u6dOnKy4uTg899JA2b96c7Oxidqlbt6769OmjRYsW6cqVK2rRooX27t2rJUuWqFOnTineUjitypQpo2nTpun06dOqWrWqVq1apaioKC1atEhFihSRJNWsWVNNmjTRmDFjdOnSJZUoUUIrV65UfHx8po6rUqVKcnd318KFC+Xi4qJixYqpcePG1rkoihQpoh49emj+/Pmys7PTc88998Bturm52ZxJNtuoUaO0evVqzZkzR2+//bYkqX379jp58qRGjx6tnTt3aufOndbxXl5e1tt6AwAg0R+lFf1R1vdHb7/9trZt26bGjRvrxRdfVI0aNXTp0iXt379fX3/9tS5duiRJeuKJJ7R27Vp17txZHTt21KlTp7Rw4ULVqFFD169fz9Tx36tIkSIaMmSIRo0apY0bN6p9+/b67bff9NRTT8lisahbt25as2aNzWvq1KmTppsKAGmWI/f8A3BfSbfB/eGHH1Jcf/etaJPce8vjyZMnG40aNTLc3d0NJycn4+GHHzbeeust6612DePfW84OGjTI8PDwMCwWi83tj69du2YMGzbMKFOmjFGkSBGjSpUqxowZM4zExESb/d64ccMICQkxSpQoYTg7OxudOnUyjh49akiyuQVx0q1oL168mOx4/vjjD6Nz586Gu7u74ebmZjzzzDPG2bNnU71t8r3bSO1WxCm9TymJi4szJk6caPj6+hpFihQxfHx8jDFjxhi3bt1K035SkrTvffv2Gf7+/oajo6NRvnx5Y/78+cnGnjhxwmjTpo3h4OBgeHl5Ga+//roRERFx31sQp7S/u295bBj/3hK4Ro0aRuHChVO8/fHevXsNSUa7du3uewz3k9Itj1O6jXP58uVTvAX3vXWntL27tWzZ0nB1dTWuXLliGIZx39uC3/t+AADyNvoj+qO83B8ZhmGcP3/eCAkJMXx8fIwiRYoY3t7exuOPP24sWrTIOiYxMdGYMmWKUb58ecPBwcGoX7++8dVXXxl9+vQxypcvbx136tQpQ5IxY8aMZPtP69+IYRhGTEyM4ebmZn2fkmpP7XH3doGsYDGMNM5yBwBpFBUVpfr16+ujjz5Sz549c7qcHNGyZUv99ddfKV6inVv8+OOPqlevnpYuXarevXvndDkAAORr9Ef0RwCS48ehADLln3/+SbZszpw5KlSokJo3b54DFSGt/ve//8nZ2VldunTJ6VIAAMhX6I/yLvojwFzMKQUgU6ZPn67IyEi1atVKhQsX1oYNG7RhwwYNGDBAPj4+OV0eUvDl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d+7cWVu2bEnzdq5fv66oqChFRUVJkk6dOqWoqCidOXNG169f16hRo/Tdd9/p9OnT2rJli55++mlVrlxZAQEBkqTq1aurffv2evHFF7V3717t2rVLoaGh6tGjh8qUKSNJev7552Vvb6/g4GAdPnxYq1at0ty5c20uNR8yZIg2btyomTNn6pdfftGECRO0b98+hYaGZuTtAQAASFFW9VDpxdXmAAAgN8pQKPXtt9/qjTfesJljQJIqVKigP//8M83b2bdvn+rXr6/69etLkoYPH6769etr3LhxsrOz08GDB/XUU0+patWqCg4Olp+fn7799lubs2vLly/Xww8/rMcff1yBgYFq2rSpFi1aZF3v5uamzZs369SpU/Lz89OIESM0btw46wSdkvToo49qxYoVWrRokerWratPPvlEn3/+OXeNAQAAWSqreqj0ut/V5klSutp8x44diouLs45J7Wrzu3G1OQAASKsM/XwvMTHROifB3f744w+5uLikeTstW7aUYRiprt+0adMDt1GiRAnrrYtTU6dOHX377bf3HfPMM8/omWeeeeD+AAAAMiqreqjr169br3qS7lxtXqJECZUoUUITJ05U165d5e3trRMnTmj06NGpXm2+cOFCxcXFpXi1+cSJExUcHKxXX31Vhw4d0ty5czV79mzrfocMGaIWLVpo5syZ6tixo1auXKl9+/bZnCAEAABITYaulGrXrp3mzJljfW6xWHT9+nWNHz9egYGBWVUbAABAvpJVPRRXmwMAgPzAYtzvUqVU/PHHHwoICJBhGDp27JgaNGigY8eOqVSpUtqxY0eyu7kUBFevXpWbm5tiYmLk6uqa0+UAAJDnBIf/kKnXLw5qmEWV2MrK73h6qOTooQAAyJzM9FA53T9l6Od7ZcuW1Y8//qiVK1fq4MGDun79uoKDg9WzZ0+bSTsBAABwBz0UAADAHRkKpSSpcOHC6tWrV1bWAgAAkO/RQwEAAPwrQ6HU0qVL77v+hRdeyFAxAAAA+Rk9FAAAwB0ZCqWGDBli8zwuLk43b96Uvb29ihYtSkMFAACQAnooAACAOzJ0973Lly/bPK5fv66jR4+qadOm+vjjj7O6RgAAgHyBHgoAAOCODIVSKalSpYrefvvtZGcAAQAAkDp6KAAAUFBlWSgl/Ttx59mzZ7NykwAAAPkePRQAACiIMjSn1P/93//Z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a/TNN9/o7Nmz6tKli3V9QkKCOnbsqNu3b2v37t1asmSJwsPDNW7cOOuYU6dOqWPHjmrVqpWioqI0dOhQ9e/fX5s2bTL1OAEAALIKJ/YAAEBeUDinC3iQwoULy9vbO9nymJgYLV68WCtWrFDr1q0lSWFhYapevbq+++47NWnSRJs3b9aRI0f09ddfy8vLS/Xq1dOkSZP06quvasKECbK3t9fChQvl6+urmTNnSpKqV6+unTt3avbs2QoICDD1WAEAALJKzZo19fXXX1ufFy58p+0bNmyY1q1bpzVr1sjNzU2hoaHq0qWLdu3aJenOiT1vb2/t3r1b586d0wsvvKAiRYpoypQpku6c2HvppZe0fPlybdmyRf3791fp0qXpoQAAQJrk+iuljh07pjJlyqhixYrq2bOnzpw5I0mKjIxUXFyc2rRpYx378MMPq1y5ctqzZ48kac+ePapdu7a8vLysYwICAnT16lUdPnzYOububSSNSdpGamJjY3X16lWbBwAAQG6RdGIv6VGqVClJd07szZo1S61bt5afn5/CwsK0e/dufffdd5JkPbH30UcfqV69eurQoYMmTZqkBQsW6Pbt25Jkc2KvevXqCg0NVbdu3TR79uz71kUPBQAAkuTqUKpx48YKDw/Xxo0b9d577+nUqVNq1qyZrl27pujoaNnb28vd3d3mNV5eXoqOjpYkRUdH2wRSSeuT1t1vzNWrV/XPP/+kWtvUqVPl5uZmffj4+GT2cAEAALJMbj2xRw8FAACS5OpQqkOHDnrmmWdUp04dBQQEaP369bpy5YpWr16d06VpzJgxiomJsT5+//33nC4JAABAUu4+sUcPBQAAkuT6OaXu5u7urqpVq+r48eNq27atbt++rStXrtg0VefPn7fOQeXt7a29e/fabCNpEs+7x9w7sef58+fl6uoqJyenVGtxcHCQg4NDVhwWAABAlurQoYP1n+vUqaPGjRurfPnyWr169X37GzPQQwEAgCS5+kqpe12/fl0nTpxQ6dKl5efnpyJFimjLli3W9UePHtWZM2fk7+8vSfL399dPP/2kCxcuWMdERETI1dVVNWrUsI65extJY5K2AQAAkNfdfWLP29vbemLvbvee2EvppF3SuvuNedCJPQAAgCS5OpQaOXKkvvnmG50+fVq7d+9W586dZWdnp+eee05ubm4KDg7W8OHDtW3b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D8XP9wqo27dvKzIyUm3atLEuK1SokNq0aaM9e/Y88PWGYWjLli06evSomjdvnp2lZqmMHvebb74pT09PBQcHm1FmlsroMV+/fl3ly5eXj4+Pnn76aR0+fNiMcrNERo75//7v/+Tv76+QkBB5eXmpVq1amjJlihISEswqO1My+++0JC1evFg9evRQsWLFsqvMLJWRY3700UcVGRlpvYz85MmTWr9+vQIDA02pObMycsyxsbHJfn7r5OSknTt3ZmutOWnPnj0275EkBQQEpPnfBSA3KYjfablZQfy+zc0KYi+Qm9Gn5H050UMVzrYtI1f766+/lJCQIC8vL5vlXl5e+uWXX1J9XUxMjB566CHFxsbKzs5O7777rtq2bZvd5WaZjBz3zp07tXjxYkVFRZlQYdbLyDFXq1ZNH374oerUqaOYmBi98847evTRR3X48GGVLVvWjLIzJSPHfPLkSW3dulU9e/bU+vXrdfz4cb3yyiuKi4vT+PHjzSg7UzL673SSvXv36tChQ1q8eHF2lZjlMnLMzz//vP766y81bdpUhmEoPj5eL730kl5//XUzSs60jBxzQECAZs2apebNm6tSpUrasmWL1q5dm6//z2l0dHSK79HVq1f1zz//yMnJKYcqA9KvIH6n5WYF8fs2NyuIvUBuRp+S9+VED8WVUkgXFxcXRUVF6YcfftBbb72l4cOHa/v27TldVra5du2aevfurf/9738qVapUTpdjGn9/f73wwguqV6+eWrRoobVr18rDw0Pvv/9+TpeWbRITE+Xp6alFixbJz89P3bt319ixY7Vw4cKcLs0UixcvVu3atdWoUaOcLiVbbd++XVOmTNG7776r/fv3a+3atVq3bp0mTZqU06Vlm7lz56pKlSp6+OGHZW9vr9DQUPXt21eFCtECAPlVQf9Oy80KyvdtblYQe4HcjD4FXClVQJUqVUp2dnY6f/68zfLz58/L29s71dcVKlRIlStXliTVq1dPP//8s6ZOnaqWLVtmZ7lZJr3HfeLECZ0+fVpPPvmkdVliYqIkqXDhwjp69KgqVaqUvUVnUkY/67sVKVJE9evX1/Hjx7OjxCyXkWMuXbq0ihQpIjs7O+uy6tWrKzo6Wrdv35a9vX221pxZmfmcb9y4oZUrV+rNN9/MzhKzXEaO+T//+Y969+6t/v37S5Jq166tGzduaMCAARo7dmyub4AycsweHh76/PPPdevWLf39998qU6aMXnvtNVWsWNGMknOEt7d3iu+Rq6srV0khzymI32m5WUH8vs3NCmIvkJvRp+R9OdFD8W9cAWVvby8/Pz9t2bLFuiwxMVFbtmyRv79/mreTmJio2NjY7CgxW6T3uB9++GH99NNPioqKsj6eeuoptWrVSlFRUfLx8TGz/AzJis86ISFBP/30k0qXLp1dZWapjBzzY489puPHj1tDR0n69ddfVbp06TzRvGfmc16zZo1iY2PVq1ev7C4zS2XkmG/evJms2Uz6P22GYWRfsVkkM5+zo6OjHnroIcXHx+vTTz/V008/nd3l5hh/f3+b90iSIiIi0vX9BuQWBfE7LTcriN+3uVlB7AVyM/qUvC9Heqhsm0Idud7KlSsNBwcHIzw83Dhy5IgxYMAAw93d3YiOjjYMwzB69+5tvPbaa9bxU6ZMMTZv3mycOHHCOHLkiPHOO+8YhQsXNv73v//l1CFkSHqP+1558e576T3miRMnGps2bTJOnDhhREZGGj169DAcHR2Nw4cP59QhpFt6j/nMmTOGi4uLERoaahw9etT46quvDE9PT2Py5Mk5dQjpltG/7aZNmxrdu3c3u9wskd5jHj9+vOHi4mJ8/PHHxsmTJ43NmzcblSpVMp599tmcOoR0S+8xf/fdd8ann35qnDhxwtixY4fRunVrw9fX17h8+XIOHUH6Xbt2zThw4IBx4MABQ5Ixa9Ys48CBA8Zvv/1mGIZhvPbaa0bv3r2t45NuZzxq1Cjj559/NhYsWJDttzMGslNB/E7LzQri921uVhB7gdysIPYpuVle6KEIpQq4efPmGeXKlTPs7e2NRo0aGd999511XYsWLYw+ffpYn48dO9aoXLmy4ejoaBQvXtzw9/c3Vq5cmQNVZ156jvteeTGUMoz0HfPQoUOtY728vIzAwEBj//79OVB15qT3c969e7fRuHFjw8HBwahYsaLx1ltvGfHx8SZXnTnpPeZffvnFkGRs3rzZ5EqzTnqOOS4uzpgwYYJRqVIlw9HR0fDx8TFeeeWVPNf4pOeYt2/fblSvXt1wcHAwSpYsafTu3dv4888/c6DqjNu2bZshKdkj6Tj79OljtGjRItlr6tWrZ9jb2xsVK1Y0wsLCTK8byEoF8TstNyuI37e5WUHsBXKzgtan5GZ5oYeyGAbXKAIAAAAAAMBczCkFAAAAAAAA0xFKAQAAAAAAwHSEUgAAAAAAADAdoRQAAAAAAABMRygFAAAAAAAA0xFKAQAAAAAAwHSEUgAAAAAAADAdoRQAAAAAAABMRygFoEAJDw+Xu7u76ftt2bKlhg4davp+AQAA0iKneiQABRuhFIACpXv37vr111+tzydMmKB69eqleztBQUGyWCx66aWXkq0LCQmRxWJRUFCQddnatWs1adKkdO3DYrFYH66urmrYsKG++OILmzFr165V27Zt5eHhIVdXV/n7+2vTpk3pPh4AAFCw5VSPZJaWLVta+ypHR0dVrVpVU6dOlWEY1jE//vijnnvuOfn4+MjJyUnVq1fX3LlzTa8VKEgIpQAUGHFxcXJycpKnp2eWbM/Hx0crV67UP//8Y11269YtrVixQuXKlbMZW6JECbm4uKR7H2FhYTp37pz27dunxx57TN26ddNPP/1kXb9jxw61bdtW69evV2RkpFq1aqUnn3xSBw4cyPiBAQCAAiUneyQzvfjiizp37pyOHj2qMWPGaNy4cVq4cKF1fWRkpDw9PfXRRx/p8OHDGjt2rMaMGaP58+fnWM1AfkcoBSBXatmypUJDQxUaGio3NzeVKlVK//nPf6xnsywWiz7//HOb17i7uys8PFySdPr0aVksFq1atUotWrSQo6Ojli9fbnNpenh4uCZOnKgff/zReuYsPDxc/fr10xNPPGGz7bi4OHl6emrx4sXWZY888oh8fHy0du1a67K1a9eqXLlyql+/frLjufvnexUqVNCUKVPUr18/ubi4qFy5clq0aFGy98Hd3V3e3t6qWrWqJk2apPj4eG3bts26fs6cORo9erQaNmyoKlWqaMqUKapSpYq+/PLLNL/XAAAg78hvPVJiYqKmTp0qX19fOTk5qW7duvrkk0+s6xMSEhQcHGxdX61atWRXLwUFBalTp0565513VLp0aZUsWVIhISGKi4uzGVe0aFF5e3urfPny6tu3r+rUqaOIiAjr+n79+mnu3Llq0aKFKlasqF69eqlv3742xwEgaxFKAci1lixZosKFC2vv3r2aO3euZs2apQ8++CBd23jttdc0ZMgQ/fzzzwoICLBZ1717d40YMUI1a9bUuXPndO7cOXXv3l39+/fXxo0bde7cOevYr776Sjdv3lT37t1tttGvXz+FhYVZn3/44Yfq27dv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lJo1a5ZmzJhhTqYkqVatWnrhhRf45hgAAIBLYA4FAABwTolCKYfDoaNHj16w/ejRozp58uR1NwUAAFAZMYcCAAA4p0Sh1AMPPKBhw4bpo48+0k8//aSffvpJ//rXvxQdHa1+/fqVdo8AAACVAnMoAACAc0p0Tan4+Hg99dRTGjRokAoKCn47UJUqio6O1iuvvFKqDQIAAFQWzKEAAADOKVEoVa1aNb355pt65ZVXtH//fklSo0aNVL169VJtDgAAoDJhDgUAAHBOiT6+V+zw4cM6fPiwmjRpourVq8swjNLqCwAAoNJiDgUAAFDCUOqXX35Rjx491LRpU/Xp00eHDx+WJEVHR/NVxgAAAJfAHAoAAOCcEoVSY8eOVdWqVZWVlaVq1aqZ2wcMGKCkpKRSaw4AAKAyYQ4FAABwTomuKbVmzRqtXr1a9erVc9repEkT/ec//ymVxgAAACob5lAAAADnlGilVG5urtP/7hU7duyYPDw8rrspAACAyog5FAAAwDklCqW6du2qDz/80Lzv4uKioqIizZw5U927dy+15gAAACoT5lAAAADnlOjjezNnzlSPHj20fft25efna/z48dqzZ4+OHTumr776qrR7BAAAqBSYQwEAAJxTopVSLVu21Pfff68uXbro/vvvV25urvr166cdO3aoUaNGpd0jAABApcAcCgAA4JxrXilVUFCgXr16KT4+XpMmTSqLngAAACod5lAAAADOrnmlVNWqVbVz586y6AUAAKDSYg4FAADgrEQf3/vzn/+s9957r7R7AQAAqNSYQwEAAJxTogudnz17Vu+//74+//xztW/fXtWrV3faP3v27FJpDgAAoDJhDgUAAHDONa2UOnDggIqKirR79261a9dONWvW1Pfff68dO3aYt/T09DJqFQAAoGIq7TnUhg0bdN999ykoKEguLi5avny50/6hQ4fKxcXF6darVy+nmmPHjmnw4MHy9vaWr6+voqOjderUKaeanTt3qmvXrvL09FRwcLBmzpx5QS/Lli1T8+bN5enpqVatWmnVqlVXfR4AAODmdk0rpZo0aaLDhw/riy++kCQNGDBAr7/+uvz9/cukOQAAgMqgtOdQubm5atOmjR599FH169fvojW9evXSwoULzfseHh5O+wcPHqzDhw8rOTlZBQUFGjZsmEaMGKHExERJksPhUM+ePRUeHq74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JESzZs2SJLVo0UIbN27UnDlzFBERccm+8vLylJeXZ953OBylfOYAAAAAAACV1w2/UuqHH35QUFCQGjZsqMGDBysrK0uSlJaWpoKCAoWHh5u1zZs3V/369ZWamipJSk1NVatWreTv72/WREREyOFwaM+ePWbN+ccorik+xqXMmDFDPj4+5i04OLhUzhcAAAAAAOBmcEOHUmFhYUpISFBSUpIWLFigzMxMde3aVSdPnpTdbpe7u7t8fX2dHuPv7y+73S5JstvtToFU8f7ifZercTgcOn369CV7mzhxonJycszbwYMHr/d0AQAAAAAAbho39Mf3evfubf65devWCgsLU4MGDbR06VJ5eXmVY2eSh4eHPDw8yrUHAAAAAACAiuqGXin1e76+vmratKn27dungIAA5efn68SJE0412dnZ5jWoAgICLvg2vuL7V6rx9vYu9+ALAAAAAACgsqpQodSpU6e0f/9+BQYGqn379qpatapSUlLM/RkZGcrKypLNZpMk2Ww27dq1S0eOHDFrkpOT5e3trdDQULPm/GMU1xQfAwAAAAAAAKXvhg6lnnrqKa1fv14//vijNm3apAceeEBubm4aOHCgfHx8FB0drbi4OH3xxRdKS0vTsGHDZLPZ1KlTJ0lSz549FRoaqiFDhuibb77R6tWrNXnyZMXExJgfvRs5cqQOHDig8ePHa+/evXrzzTe1dOlSjR07tjxPHQAAAAAAoFK7oa8p9dNPP2ngwIH65ZdfdMstt6hLly7avHmzbrnlFknSnDlz5Orqqv79+ysvL08RERF68803zce7ublpxYoVGjVqlGw2m6pXr66oqCg9//zzZk1ISIhWrlypsWPHau7cuapXr57effddRUREWH6+AAAAAAAAN4sbOpRavHjxZfd7enpq/vz5mj9//iVrGjRooFWrVl32ON26ddOOHTtK1CMAAAAAAACu3Q398T0AAAAAAABUToRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAABUMtOmTZOLi4vTrXnz5ub+M2fOKCYmRnXq1FGNGjXUv39/ZWdnOx0jKytLkZGRqlatmvz8/DRu3DidPXvWqWbdunVq166dPDw81LhxYyUkJFhxegAAoJIglAIAAKiEbrvt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FRwcrJkzZ5b1qTkzYJnFixcb7u7uxvvvv2/s2bPHGD58uOHr62tkZ2dftP6rr74y3NzcjJkzZxrffvutMXnyZKNq1arGrl27LO684rrWMR80aJAxf/58Y8eOHcZ3331nDB061PDx8TF++uknizuvuK51zItlZmYaf/jDH4yuXbsa999/vzXNVgLXOt55eXlGhw4djD59+hgbN240MjMzjXXr1hnp6ekWd15xXeuYL1q0yPDw8DAWLVpkZGZmGqtXrzYCAwONsWPHWtx5xbVq1Spj0qRJxkcffWRIMj7++OPL1h84cMCoVq2aERcXZ3z77bfGG2+8Ybi5uRlJSUnWNIxyV9L3IvwmIiLCWLhwobF7924jPT3d6NOnj1G/fn3j1KlTZs3IkSON4OBgIyUlxdi+fbvRqVMn48477zT3nz171mjZsqURHh5u7Nixw1i1apVRt25dY+LEieVxSje0rVu3GrfeeqvRunVrY/To0eZ2xvj6HTt2zGjQoIExdOhQY8uWLcaBAweM1atXG/v27TNrXn75ZcPHx8dYvny58c033xh/+tOfjJCQEOP06dNmTa9evYw2bdoYmzdvNr788kujcePGxsCBA8vjlG5IL774olGnTh1jxYoVRmZmprFs2TKjRo0axty5c80axvnaXWn+UxpjmpOTY/j7+xuDBw82du/ebfzzn/80vLy8jLfeesuq0zQIpSx0xx13GDExMeb9wsJCIygoyJgxY8ZF6//nf/7HiIyMdNoWFhZm/OUvfynTPiuTax3z3zt79qxRs2ZN44MPPiirFiudkoz52bNnjTvvvNN49913jaioKEKpa3Ct471gwQKjYcOGRn5+vlUtVjrXOuYxMTHGPffc47QtLi7O6Ny5c5n2WVldTSg1fvx447bbbnPaNmDAACMiIqIMO8ON5Hrf/+HsyJEjhiRj/fr1hmEYxokTJ4yqVasay5YtM2u+++47Q5KRmppqGMZvv0y5uroadrvdrFmwYIHh7e1t5OXlWXsCN7CTJ08aTZo0MZKTk427777bDKUY49IxYcIEo0uXLpfcX1RUZAQEBBivvPKKue3EiROGh4eH8c9//tMwDMP49ttvDUnGtm3bzJrPPvvMcHFxMf773/+WXfMVSGRkpPHoo486bevXr58xePBgwzAY59Lw+/lPaY3pm2++adSqVcvp34wJEyYYzZo1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8OF6/vnn9euvv+rDDz9UTEyMatWqpYEDB0qSvL29lZGRoaKiIn3zzTcaNmyYDh06pNWrV5dz5wAA4GZVUFCgqlWrXvdxUlJSNGDAAL344ov605/+JBcXF3377bdKTk6+7mM/99xzeuuttzRv3jx16NBBDodD27dv1/Hjx82a2rVrX/fzALAeK6UA3DSGDh2q9evXa+7cueaqpR9//FHr16/XHXfcIQ8PDwUGBurpp5/W2bNnzcd169ZNsbGxio2NlY+Pj+rWratnn31WhmE4Hb9atWoKCAhQw4YNNW3aNDVp0kSffPKJud/FxUUBAQEKCgpS79699de//lWff/65Tp8+bdkYAACAyq+oqEgzZ85U48aN5eHhofr16+vFF180P3K3ZMkS3X333fL09NSiRYskSe+++65atGghT09PNW/e3GnFtyRt3bpVt99+uzw9PdWhQwft2LHDaf+nn36qzp07a9y4cWrWrJmaNm2qvn37av78+U51//73v9WuXTt5enqqYcOGeu6558x516233ipJeuCBB+Ti4mLe/+STT/T444/roYceUkhIiNq0aaPo6Gg99dRT5nHPXw2/bt06c653/m3o0KFX1QcA67BSCsBNY+7cufr+++/VsmVLPf/885J+Ww7ep08fDR06VB9++KH27t2r4cOHy9PTU9OmTTMf+8EHHyg6Olpbt27V9u3bNWLECNWvX1/Dhw+/5PN5eXkpPz//svuLioqYAAEAgFI1ceJEvfPOO5ozZ466dOmiw4cPa+/eveb+p59+WrNmzTJDpkWLFmnKlCmaN2+ebr/9du3YsUPDhw9X9erVFRUVpVOnTunee+/VH//4R/3jH/9QZmamRo8e7fScAQEBSkxM1O7du9WyZcuL9vXll1/qkUce0euvv66uXbtq//79GjFihCRp6tSp2rZtm/z8/LRw4UL16tVLbm5u5rHXrl2rxx9/XLfccssVz//OO+/U4cOHzfvfffed+vTpo7vuuuuq+gBgIQMAbiJ33323MXr0aPP+M888YzRr1swoKioyt82fP9+oUaOGUVhYaD6mRYsWTjUTJkwwWrRocdHjnj171vj73/9uSDLmzZtnGIZhLFy40PDx8THrv//+e6Np06ZGhw4dyuAsAQDAzcrhcBgeHh7GO++8c8G+zMxMQ5Lx2muvOW1v1KiRkZiY6LRt+vTphs1mMwzDMN566y2jTp06xunTp839CxYsMCQZO3bsMAzDME6dOmX06dPHkGQ0aNDAGDBggPHee+8ZZ86cMR/To0cP46WXXnJ6nr///e9GYGCgeV+S8fHHHzvV7Nmzx2jRooXh6upqtGrVyvjLX/5irFq1yqnm93O8Yj///LPRsGFD4/HHH7+mPgBYg4/vAbipfffdd7LZbHJxcTG3de7cWadOndJPP/1kbuvUqZNTjc1m0w8//KDCwkJz25tvvqkaNWrIy8tLw4cP19ixYzVq1Chzf05OjmrUqKFq1aqpWbNm8vf3N5fMAwAAlIbvvvtOeXl56tGjxyVrOnToYP45NzdX+/fvV3R0tGrUqGHeXnjhBe3fv988ZuvWreXp6Wk+zmazOR2zevXqWrlypfbt26fJkyerRo0aevLJJ3XHHXfo119/lSR98803ev75552eZ/jw4Tp8+LBZczGhoaHavXu3Nm/erEcffVRHjhzRfffdp8cee+yyY1FQUKD+/furQYMGmjt3rrm9pH0AKH18fA8ASsngwYM1adIkeXl5KTAwUK6uzrl/zZo19fXXX8vV1VWBgYHy8vIqp04BAEBldTXzi+rVq5t/PnXqlCTpnXfeUVhYmFNd8cfnrkWjRo3UqFEjPfbYY5o0aZKaNm2qJUuWaNiwYTp16pSee+459evX74LHnR94XYyrq6s6duyojh07asyYMfrHP/6hIUOGaNKkSQoJCbnoY0aNGqWDBw9q69atqlLl3K++19MHgNJFKAXgpuLu7u60uqlFixb617/+JcMwzJVQX331lWrWrKl69eqZdVu2bHE6zubNm9WkSROnyZqPj48aN258yed2dXW97H4AAIDr1aRJE3l5eSklJeWKK4kkyd/fX0FBQTpw4IAGDx580ZoWLVro73//u86cOWOGNps3b77isW+99VZVq1ZNubm5kqR27dopIyPjsvOhqlWrOs3VLiU0NFSSzGP/3uzZs7V06VJt2rRJderUcdp3NX0AsAahFICbyq233qotW7boxx9/VI0aNfT444/rtdde0xNPPKHY2FhlZGRo6tSpiouLc1rplJWVpbi4OP3lL3/R119/rTfeeEOzZs0qxzMBAAC4kKenpyZMmKDx48fL3d1dnTt31tGjR7Vnz55LfqTvueee01//+lf5+PioV69eysvL0/bt23X8+HHFxcVp0KBBmjRpkoYPH66JEyfqxx9/1Kuvvup0jGnTpunXX39Vnz591KBBA504cUKvv/66CgoK9Mc//lGSNGXKFN17772qX7++HnzwQbm6uuqbb77R7t279cILL0j6ba6WkpKizp07y8PDQ7Vq1dKDDz6ozp07684771RAQIAyMzM1ceJENW3aVM2bN7/gfD7//HONHz9e8+fPV926dWW32yX9torMx8fnqvoAYA2uKQXgpvLUU0/Jzc1NoaGhuuWWW1RQUKBVq1Zp69atatOmjUaOHKno6GhNnjzZ6XGPPPKITp8+rTvuuEMxMTEaPXq0+S0tAAAAN5Jnn31WTz75pKZMmaIWLVpowIABOnLkyCXrH3vsMb377rtauHChWrVqpbvvvlsJCQnmx+Jq1KihTz/9VLt27dLtt9+uSZMm6W9/+5vTMe6++24dOHBAjzzyiJo3b67evXvLbrdrzZo1atasmSQpIiJCK1as0Jo1a9SxY0d16tRJc+bMUYMGDczjzJo1S8nJyQoODtbtt99uPu7TTz/Vfffdp6ZNmyoqKkrNmzfXmjVrnD6WV2zjxo0qLCzUyJEjFRgYaN6KvzHwavoAYA0XwzCM8m4CAG5k3bp1U9u2bfXaa6+VdysAAAAAUGmwUgoAAAAAAACWI5QCAAAAAACA5fj4HgAAAAAAACzHSikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGA5QikAAAAAAABYjlAKAAAAAAAAliOUAgAAAAAAgOUIpQAAAAAAAGC5/wN/Y9JYTDDNOAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pdf = qc_credsets.select(\"purityMinR2\", \"purityMeanR2\", \"topPP\", \"credSetSize\").toPandas()\n", + "# plt.figure(figsize=(12, 12))\n", + "\n", + "# # Histogram for purityMinR2\n", + "# plt.subplot(2, 2, 1)\n", + "# plt.hist(pdf[\"purityMinR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMinR2\")\n", + "# plt.xlabel(\"purityMinR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for purityMeanR2\n", + "# plt.subplot(2, 2, 2)\n", + "# plt.hist(pdf[\"purityMeanR2\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of purityMeanR2\")\n", + "# plt.xlabel(\"purityMeanR2\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for topPP\n", + "# plt.subplot(2, 2, 3)\n", + "# plt.hist(pdf[\"topPP\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of topPP\")\n", + "# plt.xlabel(\"topPP\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Histogram for credSetSize\n", + "# plt.subplot(2, 2, 4)\n", + "# plt.hist(pdf[\"credSetSize\"], bins=30, alpha=0.7)\n", + "# plt.title(\"Histogram of credSetSize\")\n", + "# plt.xlabel(\"credSetSize\")\n", + "# plt.ylabel(\"Frequency\")\n", + "\n", + "# # Adjust layout to prevent overlap\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# WIP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Clumped loci filtered for usage with PICS\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Number of unique studyIds\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pics_loci.df.select(\"studyId\").distinct().count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Number of loci to fine map with PICS\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "18" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pics_loci.df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "df = pics_loci.df.withColumns(\n", + " {\n", + " \"locusSize\": f.size(\"locus\"),\n", + " \"locusLength\": f.col(\"locusEnd\") - f.col(\"locusStart\"),\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many loci with less than 100 variants from summary statistics?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "18" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.filter(f.col(\"locusSize\") < 100).count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many loci with more than 15,000 variants from summary statistics?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.filter(f.col(\"locusSize\") > 15_000).count()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------\n", + " meanLocusLength | 273867.6666666667 \n", + " q1LocusLength | 200000 \n", + " medianLocusLength | 200000 \n", + " q3LocusLength | 302688 \n", + "\n", + "-RECORD 0-----------------------------\n", + " meanLocusSize | 30.055555555555557 \n", + " minLocusSize | 2 \n", + " q1LocusSize | 12 \n", + " medianLocusSize | 19 \n", + " q3LocusSize | 57 \n", + " maxLocusSize | 79 \n", + "\n" + ] + } + ], + "source": [ + "length = df.select(\n", + " f.mean(\"locusLength\").alias(\"meanLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.25).alias(\"q1LocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.5).alias(\"medianLocusLength\"),\n", + " f.percentile_approx(\"locusLength\", 0.75).alias(\"q3LocusLength\"),\n", + ")\n", + "size = df.select(\n", + " f.mean(\"locusSize\").alias(\"meanLocusSize\"),\n", + " f.min(\"locusSize\").alias(\"minLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.25).alias(\"q1LocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.5).alias(\"medianLocusSize\"),\n", + " f.percentile_approx(\"locusSize\", 0.75).alias(\"q3LocusSize\"),\n", + " f.max(\"locusSize\").alias(\"maxLocusSize\"),\n", + ")\n", + "length.show(vertical=True)\n", + "size.show(vertical=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABq3ElEQVR4nO3deVhV5f7//xeDDA6AqICkIjnPmppyHNI0UTmlacccMjXMBiyHUvNUag5pVg6V6alM7Jtm2mlUU8khG3AicZYccCgFLRXEo4hw//7ox/64BU22sDbI83Fd+6q91r3Xft+3uLl97bXu5WKMMQIAAAAAAAAs5OrsAgAAAAAAAFD8EEoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBAAAAAADAcoRSAAAAAAAAsByhFAAAAAAAACxHKAUAAAAAAADLEUoBhUjVqlU1cOBAZ5dx23v99dd15513ys3NTY0bN3Z2ObgJGzZskIuLiz777DNnlwIAKISYQ1mDOdTfi46OlouLi44cOeLsUoAigVAKKCDZv5C2bduW6/527dqpfv36t/w+K1eu1IQJE275OMXFmjVrNHr0aLVq1UoLFizQq6++et22AwcOVOnSpS2sruBVrVpV//znP51dxnUtXrxYs2bNcnYZAAAnYg5VOBX3OdTly5c1e/ZsNWnSRD4+PvLz81O9evU0ZMgQ7d+/39nlAUWWu7MLAPB/EhIS5Oqat6x45cqVmjNnDpOqm7Ru3Tq5urpq/vz58vDwcHY5uMbixYu1e/duDR8+3NmlAACKEOZQBa+4z6F69uypb7/9Vn369NHjjz+ujIwM7d+/X8uXL9c//vEP1a5dW5LUv39/9e7dW56enk6uGCgaCKWAQqQo/vK6cOGCSpUq5ewybtqpU6fk7e1dLCdTAADcrphDFbziPIfaunWrli9frilTpujf//633b533nlH586dsz13c3OTm5ubxRUCRReX7wGFyLXrIWRkZOiVV15RjRo15OXlpXLlyql169aKiYmR9Nep0XPmzJEkubi42B7ZLly4oOeee06VK1eWp6enatWqpTfeeEPGGLv3vXjxop599lmVL19eZcqU0QMPPKDff/9dLi4udt8eTpgwQS4uLtq7d6/69u2rsmXLqnXr1pKknTt3auDAgbrzzjvl5eWloKAgPfbYY/rzzz/t3iv7GL/++qseeeQR+fr6qkKFCnr55ZdljNHx48fVrVs3+fj4KCgoSG+++eZNjd2VK1c0adIkVatWTZ6enqpatar+/e9/Kz093dbGxcVFCxYs0IULF2xjFR0dfVPHv5Fly5apadOm8vb2Vvny5fXII4/o999/z9Fu//796tWrlypUqCBvb2/VqlVLL774om3/wIEDVbVq1Ryvyx6zq8XExKh169by8/NT6dKlVatWrRyTpFvx8ccf2/rk7++v3r176/jx43Ztsi+f2Lt3r9q3b6+SJUvqjjvu0PTp03Mc7+jRo3rggQdUqlQpBQQEaMSIEVq9erVcXFy0YcMG2/FWrFiho0eP2v58rh2PrKwsTZkyRZUqVZKXl5c6dOiggwcP5lu/AQBFE3Mo5lAFOYc6dOiQJKlVq1Y59rm5ualcuXK259euKZVdQ26Pq39ms7KyNGvWLNWrV09eXl4KDAzUE088obNnz96wNqCo40wpoIClpKTojz/+yLE9IyPjb187YcIETZ06VYMHD9bdd9+t1NRUbdu2Tb/88ovuu+8+PfHEEzpx4oRiYmL0//7f/7N7rTFGDzzwgNavX6/IyEg1btxYq1ev1qhRo/T7779r5syZtrYDBw7U0qVL1b9/f7Vs2VLff/+9IiIirlvXv/71L9WoUUOvvvqqbXIWExOjw4cPa9CgQQoKCtKePXv03nvvac+ePdq0aVOOCcHDDz+sOnXqaNq0aVqxYoUmT54sf39//ec//9G9996r1157TYsWLdLzzz+v5s2bq23btjccq8GDB2vhwoV66KGH9Nxzz2nz5s2aOnWq9u3bpy+++EKS9P/+3//Te++9py1btuiDDz6QJP3jH//42z+HG4mOjtagQYPUvHlzTZ06VcnJyZo9e7Z++uknbd++XX5+fpL+mnC2adNGJUqU0JAhQ1S1alUdOnRI33zzjaZMmZKn99yzZ4/++c9/qmHDhpo4caI8PT118OBB/fTTT7fUl2xTpkzRyy+/rF69emnw4ME6ffq03n77bbVt29auT5J09uxZde7cWT169FCvXr302WefacyYMWrQoIG6dOki6a+J/b333quTJ09q2LBhCgoK0uLFi7V+/Xq7933xxReVkpKi3377zfbzee16FNOmTZOrq6uef/55paSkaPr06erXr582b96cL30HABQezKGYQ0mF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u5off/zRJCYmmg0bNpj4+HiLKy9YeR2XRYsWGU9PT7No0SKTmJhoVq9ebSpWrGhGjBhhceUFa+XKlebFF180n3/+uZFkvvjiixu2P3z4sClZsqQZOXKk2bt3r3n77beNm5ubWbVqlTUFWySv4zJs2DDz2muvmS1btphff/3VjB071pQoUcL88ssv1hRskbyOS7azZ8+aO++803Tq1Mk0atSoQGtE8eDoPKAoCA8PNwsWLDC7d+828fHxpmvXrqZKlSomLS3N1ubJJ580lStXNmvXrjXbtm0zLVu2NP/4xz9s+69cuWLq169vOnbsaLZv325Wrlxpypcvb8aOHWtrU1Q/z7ds2WKqVq1qGjZsaIYNG2bbXtzG5MyZMyYkJMQMHDjQbN682Rw+fNisXr3aHDx40NZm2rRpxtfX13z55Zdmx44d5oEHHjChoaHm4sWLtjadO3c2jRo1Mps2bTI//PCDqV69uunTp49tf0pKigkMDDT9+vUzu3fvNp988onx9vY2//nPfyzt782YMmWKKVeunFm+fLlJTEw0y5YtM6VLlzazZ8+2tSkOY/J3v6utGoOffvrJuLm5menTp5u9e/eal156yZQoUcLs2rWrwMfgWjcak3PnzpmOHTuaTz/91Ozfv9/Exsaau+++2zRt2tTuGMVpTK72+eefm0aNGpng4GAzc+ZMu32FZUwIpQrY3XffbaKiomzPMzMzTXBwsJk6depNvf7KlSumTJkyZuHChQVVolM4Mi5Xrlwx//jHP8wHH3xgBgwYcNuGUnkdm7lz55o777zTXL582aoSnSKv4xIVFWXuvfdeu20jR440rVq1KtA6nelmQobRo0ebevXq2W17+OGHTXh4eAFW5lx5CV+uVrduXfPKK6/kf0GFRF7G5eGHHzYvvfSSGT9+PKEU8sWtzo+KklOnThlJ5vvvvzfG/PUPqBIlSphly5bZ2uzbt89IMrGxscaYv/6x4erqapKSkmxt5s6da3x8fEx6eroxpmh+np8/f97UqFHDxMTEmHvuuccWShXHMRkzZoxp3br1dfdnZWWZoKAg8/rrr9u2nTt3znh6eppPPvnEGGPM3r17jSSzdetWW5tvv/3WuLi4mN9//90YY8y7775rypYtaxuj7PeuVatWfnfplkVERJjHHnvMbluPHj1Mv379jDHFc0yu/V1t5Rj06tXLRERE2NXTokUL88QTT+RrH/PqZuYvW7ZsMZLM0aNHjTHFd0x+++03c8cdd5jdu3ebkJAQu1CqMI0Jl+8VoMuXLysuLk4dO3a0bXN1dVXHjh0VGxt7U8f43//+p4yMDPn7+xdUmZZzdFwmTpyogIAARUZGWlGmUzgyNl9//bXCwsIUFRWlwMBA1a9fX6+++qoyMzOtKrvAOTIu//jHPxQXF2e7HOTw4cNauXKlunbtaknNhVVsbKzdOEpSeHj4TX8mFRdZWVk6f/78bfXZ66gFCxbo8OHDGj9+vLNLwW0iP+ZHRUlKSook2T5P4uLilJGRYdf/2rVrq0qVKrb+x8bGqkGDBgoMDLS1CQ8PV2pqqvbs2WNrU9Q+z6OiohQREZGj7uI4Jl9//bWaNWumf/3rXwoICFCTJk30/vvv2/YnJiYqKSnJrj++vr5q0aKF3Zj4+fmpWbNmtjYdO3aUq6urNm/ebGvTtm1beXh42NqEh4crISFBZ8+eLehu5sk//vEPrV27Vr/++qskaceOHfrxxx/VpUsXScVzTK5l5RgUpb9P10pJSZGLi4v8/PwkFc8xycrKUv/+/TVq1CjVq1cvx/7CNCbueeoZ8uSPP/5QZmam3S9PSQoMDNT+/ftv6hhjxoxRcHBwjj/oosyRcfnxxx81f/58xcfHW1Ch8zgyNocPH9a6devUr18/rVy5UgcPHtTTTz+tjIyM2+YfkY6MS9++ffXHH3+odevWMsboypUrevLJJ/Xvf//bipILraSkpFzHMTU1VRcvXpS3t7eTKitc3njjDaWlpalXr17OLsWpDhw4oBdeeEE//PCD3N2ZMiB/5Mf8qKjIysrS8OHD1apVK9WvX1/SX5/DHh4etn8sZQsMDFRSUpKtTW7jk73vRm0K6+f5kiVL9Msvv2jr1q059hXHMTl8+LDmzp2rkSNH6t///re2bt2qZ599Vh4eHhowYICtT7n15+r+BgQE2O13d3eXv7+/XZvQ0NAcx8jeV7Zs2QLpnyNeeOEFpaamqnbt2nJzc1NmZqamTJmifv36SVKxHJNrWTkG1/v7lH2MwurSpUsaM2aM+vTpIx8fH0nFc0xee+01ubu769lnn811f2EaE2aYhdi0adO0ZMkSbdiwQV5eXs4ux2nOnz+v/v376/3331f58uWdXU6hk5WVpYCAAL333ntyc3NT06ZN9fvvv+v111+/bUIpR2zYsEGvvvqq3n33XbVo0UIHDx7UsGHDNGnSJL388svOLg+F2OLFi/XKK6/oq6++yvHLujjJzMxU37599corr6hmzZrOLgcokqKiorR79279+OOPzi7FqY4fP65hw4YpJiamWM9pr5aVlaVmzZrp1VdflSQ1adJEu3fv1rx58zRgwAAnV+ccS5cu1aJFi7R48WLVq1dP8fHxGj58uIKDg4vtmCBvMjIy1KtXLxljNHfuXGeX4zRxcXGaPXu2fvnlF7m4uDi7nL/F5XsFqHz58nJzc8tx55Dk5GQFBQXd8LVvvPGGpk2bpjVr1qhhw4YFWabl8jouhw4d0pEjR3T//ffL3d1d7u7u+uijj/T111/L3d1dhw4dsqr0AufIz0zFihVVs2ZNubm52bbVqVNHSUlJunz5coHWaxVHxuXll19W//79NXjwYDVo0EAPPvigXn31VU2dOlVZWVlWlF0oBQUF5TqOPj4+heobZGdZsmSJBg8erKVLl95WZ6g64vz589q2bZuGDh1q++ydOHGiduzYIXd3d61bt87ZJaKIupX5UVEydOhQLV++XOvXr1elSpVs24OCgnT58mWdO3fOrv3V/b/eZ3X2vhu1KYyf53FxcTp16pTuuusu2+fJ999/r7feekvu7u4KDAwsdmNSsWJF1a1b125bnTp1dOzYMUn/16cb/T0JCgrSqVOn7PZfuXJFZ86cydO4FRajRo3SCy+8oN69e6tBgwbq37+/RowYoalTp0oqnmNyLSvH4HptCusYZQdSR48eVUxMjO0sKan4jckPP/ygU6dOqUqVKrbP3KNHj+q5555T1apVJRWuMSGUKkAeHh5q2rSp1q5da9uWlZWltWvXKiws7Lqvmz59uiZNmqRVq1bZXeN5u8jruNSuXVu7du1SfHy87fHAAw+offv2io+PV+XKla0sv0A58jPTqlUrHTx40C5o+fXXX1WxYkW763+LMkfG5X//+59cXe0/4rKDO3PVrYWLm7CwMLtxlKSYmJgbfiYVF5988okGDRqkTz75RBEREc4ux+l8fHxyfPY++eSTqlWrluLj49WiRQtnl4giytH5UVFhjNHQoUP1xRdfaN26dTkufWjatKlKlChh1/+EhAQdO3bM1v+wsDDt2rXL7h8M2f/Iyg4yitLneYcOHXJ8njRr1kz9+vWz/X9xG5NWrVop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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "panda_df = df.select(\"locusSize\", \"locusLength\").toPandas()\n", + "\n", + "# plt.figure(figsize=(12, 6))\n", + "\n", + "# # Histogram for locusLength\n", + "# plt.subplot(1, 2, 1) # 1 row, 2 columns, 1st subplot\n", + "# plt.hist(panda_df[\"locusLength\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Length\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Length\")\n", + "\n", + "# # Histogram for locusSize\n", + "# plt.subplot(1, 2, 2) # 1 row, 2 columns, 2nd subplot\n", + "# plt.hist(panda_df[\"locusSize\"], bins=30, alpha=0.7)\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Frequency\")\n", + "# plt.title(\"Histogram of Locus Size\")\n", + "\n", + "# plt.tight_layout()\n", + "# plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2MAAAIjCAYAAACOHsPRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9d5xdd3Xvjb93P33O9KI2GhU3yXJvsrGNsY1xyDUdm+JCCpeWhOcm9+dLHrBxCJd2Q0ISSB6eYAMPxEAw3bZsbAzYYNxtWb1L0+vpu39/f+xzjmY0M9KojmV/36+XXpL2OXvv765nre9a67MUIYRAIpFIJBKJRCKRSCQnFHW+ByCRSCQSiUQikUgkr0WkMyaRSCQSiUQikUgk84B0xiQSiUQikUgkEolkHpDOmEQikUgkEolEIpHMA9IZk0gkEolEIpFIJJJ5QDpjEolEIpFIJBKJRDIPSGdMIpFIJBKJRCKRSOYB6YxJJBKJRCKRSCQSyTwgnTGJRCKRSCQSiUQimQekMyaRSCQnmF27dqEoCnffffd8D2UKDzzwAGeddRaxWAxFUZiYmJjvIb3ieKVeO8mrB0VR+MhHPjLfw5BIJCcI6YxJJJJjxksvvcTb3/52lixZQiwWY8GCBVx99dV85StfOW77/M53vsOXv/zlacv7+vq44447eP7554/bvg/kV7/6FYqi1P8YhkFPTw/vf//72bFjxzHZxxNPPMEdd9xxzB2l0dFR3vnOdxKPx/mXf/kXvvWtb5FMJmf87t13342iKDz99NPHdAzzzU9/+lMuv/xy2traSCQS9PT08M53vpMHHnhgvod2XHk1Xs9bbrmFVCo138OYleP1HEskkpMP6YxJJJJjwhNPPMF5553HCy+8wJ/+6Z/yz//8z/zJn/wJqqryj//4j8dtvwdzxu68884T6ozV+NjHPsa3vvUt/v3f/53rr7+ee++9l/PPP5++vr6j3vYTTzzBnXfeecyNuKeeeopCocBdd93FBz7wAd773vdiGMYx3ccrmS9+8Yv88R//MYqicPvtt/MP//APvO1tb2Pr1q3853/+Z/17S5YsoVKp8L73vW8eRys52Tlez7FEIjn50Od7ABKJ5NXBZz7zGRoaGnjqqafIZrNTPhsaGpqfQR0HSqXSrBGjGpdddhlvf/vbAbj11ltZuXIlH/vYx7jnnnu4/fbbT8QwD5vaNTrw2r0W8H2fu+66i6uvvpp169ZN+3zy/asoCrFY7EQOTyKRSCSvYmRkTCKRHBO2b9/OGWecMaMx39bWNm3Zt7/9bS644AISiQSNjY287nWvm2II//jHP+b666+nq6sLy7JYtmwZd911F0EQ1L9zxRVX8POf/5zdu3fXUwO7u7v51a9+xfnnnw9EzlDts8l1Pk8++SRvfOMbaWhoIJFIcPnll/P4449PGeMdd9yBoihs2LCBm266icbGRi699NLDPjevf/3rAdi5c+dBv/fII49w2WWXkUwmyWaz/Lf/9t/YuHHjlPH89V//NQBLly6tH9euXbsOut3vf//7nHvuucTjcVpaWnjve99Lb29v/fMrrriCm2++GYDzzz8fRVG45ZZbDvs4D+S5557juuuuI5PJkEqluOqqq/j9738/7XsTExP81V/9Fd3d3ViWxcKFC3n/+9/PyMgIsD+N7sDjrKWF/upXv6ov27p1K29729vo6OggFouxcOFC3v3ud5PL5WYd58jICPl8nrVr1874+eT798CasQNTUyf/6e7unrKd+++/v3590+k0119/PS+//PJBziA8/fTTKIrCPffcM+2zBx98EEVR+NnPfgZAoVDgL//yL+vnsa2tjauvvppnn332oPuYKyfL9TwcDuc9sG3bNm655Ray2SwNDQ3ceuutlMvlKd+tVCp87GMfo6WlhXQ6zR//8R/T29uLoijccccd9e3N5Tn+0Y9+xKpVq7AsizPOOONVny4rkbxWkZExiURyTFiyZAm/+93vWL9+PatWrTrod++8807uuOMOLrnkEj796U9jmiZPPvkkjzzyCNdccw0QGWypVIqPf/zjpFIpHnnkET75yU+Sz+f5whe+AMAnPvEJcrkc+/bt4x/+4R8ASKVSnHbaaXz605/mk5/8JH/2Z3/GZZddBsAll1wCRE7Pddddx7nnnsunPvUpVFXlG9/4Bq9//ev5zW9+wwUXXDBlvO94xztYsWIFf//3f48Q4rDPzfbt2wFobm6e9TsPP/ww1113HT09Pdxxxx1UKhW+8pWvsHbtWp599lm6u7t561vfypYtW/jud7/LP/zDP9DS0gJAa2vrrNu9++67ufXWWzn//PP57Gc/y+DgIP/4j//I448/znPPPUc2m+UTn/gEp5xyCv/+7//Opz/9aZYuXcqyZcsO+zgn8/LLL3PZZZeRyWT4m7/5GwzD4N/+7d+44ooreOyxx7jwwgsBKBaLXHbZZWzcuJHbbruNc845h5GREX7yk5+wb9+++jHOBdd1ufbaa3Ech49+9KN0dHTQ29vLz372MyYmJmhoaJhxvba2NuLxOD/96U/56Ec/SlNT05z3edppp/Gtb31ryrKJiQk+/vGPT3HivvWtb3HzzTdz7bXX8rnPfY5yucxXv/pVLr30Up577rlpjluN8847j56eHr73ve/VHeYa9957L42NjVx77bUAfPCDH+QHP/gBH/nIRzj99NMZHR3lt7/9LRs3buScc86Z8zHNxMl0PefK4b4H3vnOd7J06VI++9nP8uyzz/L1r3+dtrY2Pve5z9W/c8stt/C9732P973vfVx00UU89thjXH/99VO2M5fn+Le//S0//OEP+dCHPkQ6neaf/umfeNvb3saePXsO+h6RSCQnIUIikUiOAevWrROapglN08TFF18s/uZv/kY8+OCDwnXdKd/bunWrUFVVvOUtbxFBEEz5LAzD+r/L5fK0ffz5n/+5SCQSwrbt+rLrr79eLFmyZNp3n3rqKQGIb3zjG9P2sWLFCnHttddO29/SpUvF1VdfXV/2qU99SgDixhtvnNM5ePTRRwUg/uM//kMMDw+Lvr4+8fOf/1x0d3cLRVHEU089JYQQYufOndPGdtZZZ4m2tjYxOjpaX/bCCy8IVVXF+9///vqyL3zhCwIQO3fuPOR4XNcVbW1tYtWqVaJSqdSX/+xnPxOA+OQnP1lf9o1vfEMA9TEejLl894YbbhCmaYrt27fXl/X19Yl0Oi1e97rX1Zd98pOfFID44Q9/OG0btetT29+Bx1w7348++qgQQojnnntOAOL73//+IY/hQGrjSCaT4rrrrhOf+cxnxDPPPDPtezNduwPH/Ed/9EcilUqJl19+WQghRKFQENlsVvzpn/7plO8ODAyIhoaGacsP5PbbbxeGYYixsbH6MsdxRDabFbfddlt9WUNDg/jwhz8810Ou82q8njfffLNIJpOzfn4k74HJ51oIId7ylreI5ubm+v+feeYZAYi//Mu/nPK9W265RQDiU5/6VH3ZwZ5jQJimKbZt21Zf9sILLwhAfOUrXznksUskkpMLmaYokUiOCVdffTW/+93v+OM//mNeeOEFPv/5z3PttdeyYMECfvKTn9S/96Mf/YgwDPnkJz+Jqk59BSmKUv93PB6v/7tQKDAyMsJll11GuVxm06ZNRzzO559/nq1bt3LTTTcxOjrKyMgIIyMjlEolrrrqKn79618ThuGUdT74wQ8e1j5uu+02Wltb6erq4vrrr6dUKnHPPfdw3nnnzfj9/v5+nn/+eW655ZYpUZkzzzyTq6++ml/84heHf6BEKW5DQ0N86EMfmlLndP3113Pqqafy85///Ii2eyiCIGDdunXccMMN9PT01Jd3dnZy00038dvf/pZ8Pg/Af/3Xf7FmzRre8pa3TNvO5PthLtQiJQ8++OC09LFDceedd/Kd73yHs88+mwcffJBPfOITnHvuuZxzzjlTUkUPxV133cXPfvYz7r77bk4//XQAHnroISYmJrjxxhvr99vIyAiapnHhhRfy6KOPHnSb73rXu/A8jx/+8If1ZevWrWNiYoJ3vetd9WXZbJYnn3zymAjFTOZkvJ6H4li8By677DJGR0frx15LI/zQhz405Xsf/ehHD3t8b3jDG6ZEp88880wymcwxU2WVSCSvHF7Tztivf/1r3vzmN9PV1YWiKPzoRz867G0IIfjiF7/IypUrsSyLBQsW8JnPfObYD1YiOQk4//zz+eEPf8j4+Dh/+MMfuP322ykUCrz97W9nw4YNQJSyp6pq3VCdjZdffpm3vOUtNDQ0kMlkaG1t5b3vfS/AUdWLbN26FYCbb76Z1tbWKX++/vWv4zjOtO0vXbr0sPbxyU9+koceeohHHnmEF198kb6+voOq7+3evRuAU045Zdpnp512Wt1IPFwOtt1TTz21/vmxZnh4mHK5POvxhGHI3r17geh+OFRa61xZunQpH//4x/n6179OS0sL1157Lf/yL/8y5/vlxhtv5De/+Q3j4+OsW7eOm266ieeee443v/nN2LZ9yPUfeOAB7rzzTm6//Xbe9ra31ZfX7rnXv/710+65devWHVLgZs2aNZx66qnce++99WX33nsvLS0t9XpEgM9//vOsX7+eRYsWccEFF3DHHXccE+P9ZL2eB+NI3gOLFy+e8v/GxkYAxsfHgeh5U1V12vti+fLlhz2+A/dV219tXxKJ5NXDa7pmrFQqsWbNGm677Tbe+ta3HtE2/uIv/oJ169bxxS9+kdWrVzM2NsbY2NgxHqlEcnJhmibnn38+559/PitXruTWW2/l+9//Pp/61KfmtP7ExASXX345mUyGT3/60yxbtoxYLMazzz7L//yf/3PajPXhUFv3C1/4AmedddaM3zmwP9HkKN1cWL16NW94wxuOaHyS6cwWUZks5lLjS1/6Erfccgs//vGPWbduHR/72Mf47Gc/y+9//3sWLlw4p/1lMhmuvvpqrr76agzD4J577uHJJ5/k8ssvn3WdnTt38p73vIerr76av/u7v5vyWe2e+9a3vkVHR8e0dXX90D/F73rXu/jMZz7DyMgI6XSan/zkJ9x4441T1n3nO9/JZZddxn333ce6dev4whe+wOc+9zl++MMfct11183p2E8EJ/p6zsSRvAc0TZvxe+II6kgPxYncl0QimV9e087Yddddd9AfKMdx+MQnPsF3v/tdJiYmWLVqFZ/73Oe44oorANi4cSNf/epXWb9+fX3G8HBn0CWSVzu11Lz+/n4Ali1bRhiGbNiwYVYj6Fe/+hWjo6P88Ic/5HWve119+UxqhLMZdrMtr6X+ZDKZV4zDtGTJEgA2b9487bNNmzbR0tJSl9M/nFSvydudHEGpLat9fqxpbW0lkUjMejyqqrJo0SIguh7r168/6PZqEYgDezLNFtlbvXo1q1ev5m//9m954oknWLt2LV/72temOUlz4bzzzuOee+6p378zUalUeOtb30o2m+W73/3utPTb2j3X1tZ2xPfcu971Lu68807+67/+i/b2dvL5PO9+97unfa+zs5MPfehDfOhDH2JoaIhzzjmHz3zmM0fljL2armeN4/EeWLJkCWEYsnPnTlasWFFfvm3btmnfPdyUTYlE8urlNZ2meCg+8pGP8Lvf/Y7//M//5MUXX+Qd73gHb3zjG+vpDT/96U/p6enhZz/7GUuXLqW7u5s/+ZM/kZExyWuSRx99dMZZ21q9U23C4oYbbkBVVT796U9Pi3DV1q/NCk/enuu6/Ou//uu07SeTyRnTlmrOy4EG37nnnsuyZcv44he/SLFYnLbe8PDwrMd4vOjs7OSss87innvumTLe9evXs27dOt70pjfVl812XDNx3nnn0dbWxte+9jUcx6kvv//++9m4ceM0lbdjhaZpXHPNNfz4xz+eItc9ODjId77zHS699FIymQwAb3vb23jhhRe47777pm2ndv1rhvOvf/3r+mdBEPDv//7vU76fz+fxfX/KstWrV6Oq6pTjP5Byuczvfve7GT+7//77gZlTPWt88IMfZMuWLdx33311R2My1157LZlMhr//+7/H87xpn8/lnjvttNNYvXo19957L/feey+dnZ1TJiqCIJj2HLS1tdHV1XXQY58LJ9v1nAvH4z1QU7U88D31la98Zdp3D+c5lkgkr25e05Gxg7Fnzx6+8Y1vsGfPHrq6ugD4H//jf/DAAw/wjW98g7//+79nx44d7N69m+9///t885vfJAgC/uqv/oq3v/3tPPLII/N8BBLJieWjH/0o5XKZt7zlLZx66qm4rssTTzzBvffeS3d3N7feeisQ1U984hOf4K677uKyyy7jrW99K5Zl8dRTT9HV1cVnP/tZLrnkEhobG7n55pv52Mc+hqIofOtb35rR2Tv33HO59957+fjHP875559PKpXizW9+M8uWLSObzfK1r32NdDpNMpnkwgsvZOnSpXz961/nuuuu44wzzuDWW29lwYIF9Pb28uijj5LJZPjpT396ok8fX/jCF7juuuu4+OKL+cAHPlCXtm9oaKj3J6odL0Sy/u9+97sxDIM3v/nNMzaiNgyDz33uc9x6661cfvnl3HjjjXVp++7ubv7qr/7qqMb8H//xHzP2PvqLv/gL/u7v/o6HHnqISy+9lA996EPous6//du/4TgOn//85+vf/eu//mt+8IMf8I53vIPbbruNc889l7GxMX7yk5/wta99jTVr1nDGGWdw0UUXcfvttzM2NkZTUxP/+Z//Oc1Qf+SRR/jIRz7CO97xDlauXInv+3zrW99C07QpNVwHUi6XueSSS7jooot44xvfyKJFi5iYmOBHP/oRv/nNb7jhhhs4++yzZ1z35z//Od/85jd529vexosvvsiLL75Y/yyVSnHDDTeQyWT46le/yvve9z7OOecc3v3ud9Pa2sqePXv4+c9/ztq1a/nnf/7nQ57vd73rXXzyk58kFovxgQ98YEoErlAosHDhQt7+9rezZs0aUqkUDz/8ME899RRf+tKXDrltePVczxqe580YPWtqauJDH/rQMX8PnHvuubztbW/jy1/+MqOjo3Vp+y1btgBTo2GH8xxLJJJXOfOm4/gKAxD33Xdf/f816edkMjnlj67r4p3vfKcQQog//dM/FYDYvHlzfb2atO2mTZtO9CFIJPPK/fffL2677TZx6qmnilQqJUzTFMuXLxcf/ehHxeDg4LTv/8d//Ic4++yzhWVZorGxUVx++eXioYceqn/++OOPi4suukjE43HR1dVVl8pnkvS1EEIUi0Vx0003iWw2K4ApMvc//vGPxemnny50XZ8mR/7cc8+Jt771raK5uVlYliWWLFki3vnOd4pf/vKX9e/UJK2Hh4fndA5q0tyHkuKeTR794YcfFmvXrhXxeFxkMhnx5je/WWzYsGHa+nfddZdYsGCBUFV1TjL39957b/1cNzU1ife85z1i3759U75zJNL2s/3Zu3evEEKIZ599Vlx77bUilUqJRCIhrrzySvHEE09M297o6Kj4yEc+IhYsWCBM0xQLFy4UN998sxgZGal/Z/v27eINb3iDsCxLtLe3i//1v/6XeOihh6bcDzt27BC33XabWLZsmYjFYqKpqUlceeWV4uGHHz7o8XieJ/6f/+f/ETfccINYsmSJsCxLJBIJcfbZZ4svfOELwnGc+ncPvHYHOxcHtlx49NFHxbXXXisaGhpELBYTy5YtE7fccot4+umnD3nOhYjaQtS2/dvf/nbKZ47jiL/+678Wa9asEel0WiSTSbFmzRrxr//6r4fc7qvtegoRSdvPdjzLli2rf+9o3gMzSfSXSiXx4Q9/WDQ1NYlUKiVuuOEGsXnzZgGI//2///eU9Wd7joEZWxQsWbJE3HzzzYc8dolEcnKhCCGrQSGasbrvvvu44YYbgEip6j3veQ8vv/zytELaVCpFR0cHn/rUp6alnVQqFRKJBOvWrePqq68+kYcgkUgkEonkFcbzzz/P2Wefzbe//W3e8573zPdwJBLJKwyZpjgLZ599NkEQMDQ0xGWXXTbjd9auXYvv+2zfvr2eA19LRzhehfESiUQikUhemVQqlWnqq1/+8pdRVXVKjZ9EIpHUeE07Y8VicYrK0c6dO3n++edpampi5cqVvOc97+H9738/X/rSlzj77LMZHh7ml7/8JWeeeSbXX389b3jDGzjnnHO47bbb+PKXv0wYhnz4wx/m6quvZuXKlfN4ZBKJRCKRSE40n//853nmmWe48sor0XWd+++/n/vvv58/+7M/qytOSiQSyWRe02mKv/rVr7jyyiunLb/55pu5++6768W/3/zmN+nt7aWlpYWLLrqIO++8k9WrVwPQ19fHRz/6UdatW0cymeS6667jS1/6Ek1NTSf6cCQSiUQikcwjDz30EHfeeScbNmygWCyyePFi3ve+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plt.figure(figsize=(10, 6))\n", + "# plt.scatter(panda_df[\"locusSize\"], panda_df[\"locusLength\"], alpha=0.5)\n", + "# plt.title(\"Scatter Plot of Locus Size vs Locus Length\")\n", + "# plt.xlabel(\"Locus Size\")\n", + "# plt.ylabel(\"Locus Length\")\n", + "# plt.grid(True)\n", + "# plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gentropy-iQynFIia-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/poetry.lock b/poetry.lock index d70afbb00..edba6ef99 100644 --- a/poetry.lock +++ b/poetry.lock @@ -15,111 +15,127 @@ files = [ pycares = ">=3.0.0" [[package]] -name = "aiofiles" -version = "23.2.1" -description = "File support for asyncio." +name = "aiohappyeyeballs" +version = "2.4.3" +description = "Happy Eyeballs for asyncio" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, - {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.9.1" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, - {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, - {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, - {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, - {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, - {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, - {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, - {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, - {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, - {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, - {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, - {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, -] - -[package.dependencies] + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiosignal" @@ -135,36 +151,6 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "alembic" -version = "1.12.1" -description = "A database migration tool for SQLAlchemy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, - {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, -] - -[package.dependencies] -Mako = "*" -SQLAlchemy = ">=1.3.0" -typing-extensions = ">=4" - -[package.extras] -tz = ["python-dateutil"] - -[[package]] -name = "annotated-types" -version = "0.6.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, -] - [[package]] name = "antlr4-python3-runtime" version = "4.9.3" @@ -175,494 +161,17 @@ files = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] -[[package]] -name = "anyio" -version = "4.0.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] - -[[package]] -name = "apache-airflow" -version = "2.8.0" -description = "Programmatically author, schedule and monitor data pipelines" -optional = false -python-versions = "<3.12,~=3.8" -files = [ - {file = "apache-airflow-2.8.0.tar.gz", hash = "sha256:5917ee148125892764f4306ec76a62c66a5801218a99edfd3fe46e968cb1a344"}, - {file = "apache_airflow-2.8.0-py3-none-any.whl", hash = "sha256:4ee532b97ef6520ad8e1ffda325aabe265f007a14166570d5f710d4999c9ad1c"}, -] - -[package.dependencies] -alembic = ">=1.6.3,<2.0" -apache-airflow-providers-common-sql = "*" -apache-airflow-providers-ftp = "*" -apache-airflow-providers-http = "*" -apache-airflow-providers-imap = "*" -apache-airflow-providers-sqlite = "*" -argcomplete = ">=1.10" -asgiref = "*" -attrs = ">=22.1.0" -blinker = "*" -colorlog = ">=4.0.2,<5.0" -configupdater = ">=3.1.1" -connexion = {version = ">=2.10.0,<3.0", extras = ["flask"]} -cron-descriptor = ">=1.2.24" -croniter = ">=0.3.17" -cryptography = ">=0.9.3" -deprecated = ">=1.2.13" -dill = ">=0.2.2" -flask = ">=2.2,<2.3" -flask-appbuilder = "4.3.10" -flask-caching = ">=1.5.0" -flask-login = ">=0.6.2" -flask-session = ">=0.4.0" -flask-wtf = ">=0.15" -fsspec = ">=2023.10.0" -google-re2 = ">=1.0" -graphviz = ">=0.12" -gunicorn = ">=20.1.0" -httpx = "*" -itsdangerous = ">=2.0" -jinja2 = ">=3.0.0" -jsonschema = ">=4.18.0" -lazy-object-proxy = "*" -linkify-it-py = ">=2.0.0" -lockfile = ">=0.12.2" -markdown = ">=3.0" -markdown-it-py = ">=2.1.0" -markupsafe = ">=1.1.1" -marshmallow-oneofschema = ">=2.0.1" -mdit-py-plugins = ">=0.3.0" -opentelemetry-api = ">=1.15.0" -opentelemetry-exporter-otlp = "*" -packaging = ">=14.0" -pathspec = ">=0.9.0" -pendulum = ">=2.0,<3.0" -pluggy = ">=1.0" -psutil = ">=4.2.0" -pydantic = ">=2.3.0" -pygments = ">=2.0.1" -pyjwt = ">=2.0.0" -python-daemon = ">=3.0.0" -python-dateutil = ">=2.3" -python-nvd3 = ">=0.15.0" -python-slugify = ">=5.0" -rfc3339-validator = ">=0.1.4" -rich = ">=12.4.4" -rich-argparse = ">=1.0.0" -setproctitle = ">=1.1.8" -sqlalchemy = ">=1.4.28,<2.0" -sqlalchemy-jsonfield = ">=1.0" -tabulate = ">=0.7.5" -tenacity = ">=6.2.0,<8.2.0 || >8.2.0" -termcolor = ">=1.1.0" -typing-extensions = ">=4.0.0" -unicodecsv = ">=0.14.1" -universal-pathlib = ">=0.1.4" -werkzeug = ">=2.0,<3" - -[package.extras] -aiobotocore = ["aiobotocore (>=2.1.1)"] -airbyte = ["apache-airflow-providers-airbyte"] -alibaba = ["apache-airflow-providers-alibaba"] -all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "elasticsearch (>=8.10,<9)", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "plyvel", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-toolbelt", "s3fs (>=2023.10.0)", "scrapbook[all]", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] -all-dbs = ["aiohttp (>=3.6.3,<4)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-arangodb", "apache-airflow-providers-cloudant", "apache-airflow-providers-common-sql (>=1.3.1)", "apache-airflow-providers-common-sql (>=1.8.1)", "apache-airflow-providers-databricks", "apache-airflow-providers-exasol", "apache-airflow-providers-influxdb", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "cassandra-driver (>=3.13.0)", "cloudant (>=2.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "dnspython (>=1.13.0)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "pandas (>=0.17.1)", "pinotdb (>0.4.7)", "presto-python-client (>=0.8.4)", "psycopg2-binary (>=2.8.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "python-arango (>=7.3.2)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "sqlalchemy-drill (>=1.1.0)", "thrift (>=0.9.2)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)"] -amazon = ["apache-airflow-providers-amazon"] -apache-atlas = ["atlasclient (>=0.1.2)"] -apache-beam = ["apache-airflow-providers-apache-beam"] -apache-cassandra = ["apache-airflow-providers-apache-cassandra"] -apache-drill = ["apache-airflow-providers-apache-drill"] -apache-druid = ["apache-airflow-providers-apache-druid"] -apache-flink = ["apache-airflow-providers-apache-flink"] -apache-hdfs = ["apache-airflow-providers-apache-hdfs"] -apache-hive = ["apache-airflow-providers-apache-hive (>=5.1.0)"] -apache-impala = ["apache-airflow-providers-apache-impala"] -apache-kafka = ["apache-airflow-providers-apache-kafka"] -apache-kylin = ["apache-airflow-providers-apache-kylin"] -apache-livy = ["apache-airflow-providers-apache-livy"] -apache-pig = ["apache-airflow-providers-apache-pig"] -apache-pinot = ["apache-airflow-providers-apache-pinot"] -apache-spark = ["apache-airflow-providers-apache-spark"] -apache-webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] -apprise = ["apache-airflow-providers-apprise"] -arangodb = ["apache-airflow-providers-arangodb"] -asana = ["apache-airflow-providers-asana"] -async = ["eventlet (>=0.33.3)", "gevent (>=0.13)", "greenlet (>=0.4.9)"] -atlas = ["apache-airflow-providers-apache-atlas"] -atlassian-jira = ["apache-airflow-providers-atlassian-jira"] -aws = ["apache-airflow-providers-amazon"] -azure = ["apache-airflow-providers-microsoft-azure"] -cassandra = ["apache-airflow-providers-apache-cassandra"] -celery = ["apache-airflow (>=2.6.0)", "apache-airflow-providers-celery", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "flower (>=1.0.0)", "google-re2 (>=1.0)"] -cgroups = ["cgroupspy (>=0.2.2)"] -cloudant = ["apache-airflow-providers-cloudant"] -cncf-kubernetes = ["aiofiles (>=23.2.0)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "google-re2 (>=1.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] -cohere = ["apache-airflow-providers-cohere"] -common-io = ["apache-airflow-providers-common-io"] -common-sql = ["apache-airflow-providers-common-sql"] -databricks = ["apache-airflow-providers-databricks"] -datadog = ["apache-airflow-providers-datadog"] -dbt-cloud = ["apache-airflow-providers-dbt-cloud"] -deprecated-api = ["requests (>=2.26.0)"] -devel = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.6.0)", "apache-airflow-providers-common-sql", "astroid (>=2.12.3,<3.0)", "aws-xray-sdk", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "deltalake (>=0.12.0)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "ipdb", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pygithub", "pyiceberg (>=0.5.0)", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python3-saml (>=1.16.0)", "pywinrm", "requests-mock", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] -devel-all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "deltalake (>=0.12.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "elasticsearch (>=8.10,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "gitpython", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipdb", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "wheel", "yamllint", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] -devel-ci = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "adlfs (>=2023.10.0)", "aiobotocore (>=2.1.1)", "aiofiles (>=23.2.0)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.6.0)", "apache-airflow (>=2.7.0)", "apache-airflow (>=2.8.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-cohere", "apache-airflow-providers-common-io", "apache-airflow-providers-common-sql", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openai", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opensearch", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-pgvector", "apache-airflow-providers-pinecone", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-weaviate", "apache-airflow-providers-yandex", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=4.1.0)", "azure-mgmt-containerinstance (>=9.0.0)", "azure-mgmt-containerregistry (>=8.0.0)", "azure-mgmt-cosmosdb", "azure-mgmt-datafactory (>=2.0.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-mgmt-storage (>=16.0.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-storage-file-share", "azure-synapse-artifacts (>=0.17.0)", "azure-synapse-spark", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cohere (>=4.27)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "databricks-sql-connector (>=2.0.0,!=2.9.0,<3.0.0)", "datadog (>=0.14.0)", "deltalake (>=0.12.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "elasticsearch (>=8.10,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.10)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gcsfs (>=2023.10.0)", "gevent (>=0.13)", "gitpython", "google-ads (>=22.1.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.12.0)", "google-cloud-batch (>=0.13.0)", "google-cloud-bigquery-datatransfer (>=3.13.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.22.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.6)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.10.0)", "google-cloud-dataproc (>=5.8.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.18.0)", "google-cloud-orchestration-airflow (>=1.10.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.19.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-run (>=0.9.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "google-re2 (>=1.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "grpcio-status", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "inflection (>=0.5.1)", "influxdb-client (>=1.19.0)", "ipdb", "ipykernel", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openai[datalib] (>=1.0)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opensearch-py (>=2.2.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "paramiko (>=2.8.0)", "pdpyras (>=4.1.2)", "pgvector (>=0.2.3)", "pinecone-client (>=2.2.4)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.4)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.8)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "python3-saml (>=1.16.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=1.32.0,!=1.33.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.7.8)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<4)", "weaviate-client (>=3.24.2)", "wheel", "yamllint", "yandexcloud (>=0.228.0)", "zenpy (>=2.0.24)"] -devel-hadoop = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.6.0)", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-common-sql", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "astroid (>=2.12.3,<3.0)", "aws-xray-sdk", "backports.zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "deltalake (>=0.12.0)", "docutils (<0.17.0)", "duckdb (>=0.9.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "ipdb", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[cloudformation,glue] (>=4.2.9)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysql-connector-python (>=8.0.11)", "mysqlclient (>=1.3.6)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "presto-python-client (>=0.8.4)", "pyarrow (>=9.0.0)", "pyarrow-hotfix", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pyiceberg (>=0.5.0)", "pykerberos (>=1.1.13)", "pytest (>=7.1)", "pytest-asyncio (!=0.23.0,!=0.23.1)", "pytest-cov", "pytest-httpx", "pytest-icdiff", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python3-saml (>=1.16.0)", "pywinrm", "requests-kerberos (>=0.10.0)", "requests-mock", "restructuredtext-lint", "rich-click (>=1.7.0)", "ruff (>=0.0.219)", "s3fs (>=2023.10.0)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-aiofiles", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] -dingding = ["apache-airflow-providers-dingding"] -discord = ["apache-airflow-providers-discord"] -doc = ["astroid (>=2.12.3,<3.0)", "checksumdir", "click (>=8.0,!=8.1.4,!=8.1.5)", "docutils (<0.17.0)", "eralchemy2", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)"] -doc-gen = ["eralchemy2"] -docker = ["apache-airflow-providers-docker"] -druid = ["apache-airflow-providers-apache-druid"] -elasticsearch = ["apache-airflow-providers-elasticsearch"] -exasol = ["apache-airflow-providers-exasol"] -facebook = ["apache-airflow-providers-facebook"] -ftp = ["apache-airflow-providers-ftp"] -gcp = ["apache-airflow-providers-google"] -gcp-api = ["apache-airflow-providers-google"] -github = ["apache-airflow-providers-github"] -github-enterprise = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.10)"] -google = ["apache-airflow-providers-google"] -google-auth = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.10)"] -grpc = ["apache-airflow-providers-grpc"] -hashicorp = ["apache-airflow-providers-hashicorp"] -hdfs = ["apache-airflow-providers-apache-hdfs"] -hive = ["apache-airflow-providers-apache-hive"] -http = ["apache-airflow-providers-http"] -imap = ["apache-airflow-providers-imap"] -influxdb = ["apache-airflow-providers-influxdb"] -jdbc = ["apache-airflow-providers-jdbc"] -jenkins = ["apache-airflow-providers-jenkins"] -kerberos = ["pykerberos (>=1.1.13)", "requests-kerberos (>=0.10.0)", "thrift-sasl (>=0.2.0)"] -kubernetes = ["aiofiles (>=23.2.0)", "apache-airflow (>=2.6.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "google-re2 (>=1.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] -ldap = ["ldap3 (>=2.5.1)", "python-ldap"] -leveldb = ["plyvel"] -microsoft-azure = ["apache-airflow-providers-microsoft-azure"] -microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] -microsoft-psrp = ["apache-airflow-providers-microsoft-psrp"] -microsoft-winrm = ["apache-airflow-providers-microsoft-winrm"] -mongo = ["apache-airflow-providers-mongo"] -mssql = ["apache-airflow-providers-microsoft-mssql"] -mysql = ["apache-airflow-providers-mysql"] -neo4j = ["apache-airflow-providers-neo4j"] -odbc = ["apache-airflow-providers-odbc"] -openai = ["apache-airflow-providers-openai"] -openfaas = ["apache-airflow-providers-openfaas"] -openlineage = ["apache-airflow-providers-openlineage"] -opensearch = ["apache-airflow-providers-opensearch"] -opsgenie = ["apache-airflow-providers-opsgenie"] -oracle = ["apache-airflow-providers-oracle"] -otel = ["opentelemetry-exporter-prometheus"] -pagerduty = ["apache-airflow-providers-pagerduty"] -pandas = ["pandas (>=0.17.1)", "pyarrow (>=9.0.0)", "pyarrow-hotfix"] -papermill = ["apache-airflow-providers-papermill"] -password = ["bcrypt (>=2.0.0)", "flask-bcrypt (>=0.7.1)"] -pgvector = ["apache-airflow-providers-pgvector"] -pinecone = ["apache-airflow-providers-pinecone"] -pinot = ["apache-airflow-providers-apache-pinot"] -postgres = ["apache-airflow-providers-postgres"] -presto = ["apache-airflow-providers-presto"] -rabbitmq = ["amqp"] -redis = ["apache-airflow-providers-redis"] -s3 = ["apache-airflow-providers-amazon"] -s3fs = ["s3fs (>=2023.10.0)"] -salesforce = ["apache-airflow-providers-salesforce"] -samba = ["apache-airflow-providers-samba"] -saml = ["python3-saml (>=1.16.0)"] -segment = ["apache-airflow-providers-segment"] -sendgrid = ["apache-airflow-providers-sendgrid"] -sentry = ["blinker (>=1.1)", "sentry-sdk (>=1.32.0,!=1.33.0)"] -sftp = ["apache-airflow-providers-sftp"] -singularity = ["apache-airflow-providers-singularity"] -slack = ["apache-airflow-providers-slack"] -smtp = ["apache-airflow-providers-smtp"] -snowflake = ["apache-airflow-providers-snowflake"] -spark = ["apache-airflow-providers-apache-spark"] -sqlite = ["apache-airflow-providers-sqlite"] -ssh = ["apache-airflow-providers-ssh"] -statsd = ["statsd (>=3.3.0)"] -tableau = ["apache-airflow-providers-tableau"] -tabular = ["apache-airflow-providers-tabular"] -telegram = ["apache-airflow-providers-telegram"] -trino = ["apache-airflow-providers-trino"] -vertica = ["apache-airflow-providers-vertica"] -virtualenv = ["virtualenv"] -weaviate = ["apache-airflow-providers-weaviate"] -webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] -winrm = ["apache-airflow-providers-microsoft-winrm"] -yandex = ["apache-airflow-providers-yandex"] -zendesk = ["apache-airflow-providers-zendesk"] - -[[package]] -name = "apache-airflow-providers-common-sql" -version = "1.8.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-common-sql package" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache-airflow-providers-common-sql-1.8.0.tar.gz", hash = "sha256:4d8d99f33f7b5a3e313ef12c5a2f10d1612477ed2e784d0ffb721447e076e3f7"}, - {file = "apache_airflow_providers_common_sql-1.8.0-py3-none-any.whl", hash = "sha256:45117fa38f5a2e83cdb9a8d3bdfdbd602bfdc7a894d087b26e6ebb94df79ec32"}, -] - -[package.dependencies] -apache-airflow = ">=2.5.0" -sqlparse = ">=0.4.2" - -[package.extras] -openlineage = ["apache-airflow-providers-openlineage"] -pandas = ["pandas (>=0.17.1)"] - -[[package]] -name = "apache-airflow-providers-ftp" -version = "3.6.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-ftp package" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache-airflow-providers-ftp-3.6.0.tar.gz", hash = "sha256:160f12e9f78ffbcdca4bdffbac93c1f04641fd3f1f7d236c7bfe79cd0a68d14b"}, - {file = "apache_airflow_providers_ftp-3.6.0-py3-none-any.whl", hash = "sha256:03264207293710c3821f5ccd548c5e89a3c5ca7562bc4ff629e6f73d112a71a4"}, -] - -[package.dependencies] -apache-airflow = ">=2.5.0" - -[package.extras] -openlineage = ["apache-airflow-providers-openlineage"] - -[[package]] -name = "apache-airflow-providers-google" -version = "10.15.0" -description = "Provider package apache-airflow-providers-google for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_google-10.15.0-py3-none-any.whl", hash = "sha256:70d2d4feb66f06cd750ea673344f3be20d2d575c9645f7e2b030c73551a297fc"}, - {file = "apache_airflow_providers_google-10.15.0.tar.gz", hash = "sha256:ff48fa0a29abec2645a8008c47d0a84a759b7203412707a5e2fc01558c4052a3"}, -] - -[package.dependencies] -apache-airflow = ">=2.6.0" -apache-airflow-providers-common-sql = ">=1.7.2" -asgiref = ">=3.5.2" -gcloud-aio-auth = ">=4.0.0,<5.0.0" -gcloud-aio-bigquery = ">=6.1.2" -gcloud-aio-storage = ">=9.0.0" -gcsfs = ">=2023.10.0" -google-ads = ">=22.1.0" -google-analytics-admin = "*" -google-api-core = ">=2.11.0,<2.16.0 || >2.16.0" -google-api-python-client = ">=1.6.0" -google-auth = ">=1.0.0" -google-auth-httplib2 = ">=0.0.1" -google-cloud-aiplatform = ">=1.22.1" -google-cloud-automl = ">=2.12.0" -google-cloud-batch = ">=0.13.0" -google-cloud-bigquery-datatransfer = ">=3.13.0" -google-cloud-bigtable = ">=2.17.0" -google-cloud-build = ">=3.22.0" -google-cloud-compute = ">=1.10.0" -google-cloud-container = ">=2.17.4" -google-cloud-datacatalog = ">=3.11.1" -google-cloud-dataflow-client = ">=0.8.6" -google-cloud-dataform = ">=0.5.0" -google-cloud-dataplex = ">=1.10.0" -google-cloud-dataproc = ">=5.8.0" -google-cloud-dataproc-metastore = ">=1.12.0" -google-cloud-dlp = ">=3.12.0" -google-cloud-kms = ">=2.15.0" -google-cloud-language = ">=2.9.0" -google-cloud-logging = ">=3.5.0" -google-cloud-memcache = ">=1.7.0" -google-cloud-monitoring = ">=2.18.0" -google-cloud-orchestration-airflow = ">=1.10.0" -google-cloud-os-login = ">=2.9.1" -google-cloud-pubsub = ">=2.19.0" -google-cloud-redis = ">=2.12.0" -google-cloud-run = ">=0.9.0" -google-cloud-secret-manager = ">=2.16.0" -google-cloud-spanner = ">=3.11.1" -google-cloud-speech = ">=2.18.0" -google-cloud-storage = ">=2.7.0" -google-cloud-storage-transfer = ">=1.4.1" -google-cloud-tasks = ">=2.13.0" -google-cloud-texttospeech = ">=2.14.1" -google-cloud-translate = ">=3.11.0" -google-cloud-videointelligence = ">=2.11.0" -google-cloud-vision = ">=3.4.0" -google-cloud-workflows = ">=1.10.0" -grpcio-gcp = ">=0.2.2" -httpx = "*" -json-merge-patch = ">=0.2" -looker-sdk = ">=22.2.0" -pandas = ">=1.2.5" -pandas-gbq = "*" -proto-plus = ">=1.19.6" -PyOpenSSL = "*" -sqlalchemy-bigquery = ">=1.2.1" -sqlalchemy-spanner = ">=1.6.2" - -[package.extras] -amazon = ["apache-airflow-providers-amazon (>=2.6.0)"] -apache-beam = ["apache-airflow-providers-apache-beam", "apache-beam[gcp]"] -apache-cassandra = ["apache-airflow-providers-apache-cassandra"] -cncf-kubernetes = ["apache-airflow-providers-cncf-kubernetes (>=7.2.0)"] -common-sql = ["apache-airflow-providers-common-sql"] -facebook = ["apache-airflow-providers-facebook (>=2.2.0)"] -leveldb = ["plyvel"] -microsoft-azure = ["apache-airflow-providers-microsoft-azure"] -microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] -mysql = ["apache-airflow-providers-mysql"] -openlineage = ["apache-airflow-providers-openlineage"] -oracle = ["apache-airflow-providers-oracle (>=3.1.0)"] -postgres = ["apache-airflow-providers-postgres"] -presto = ["apache-airflow-providers-presto"] -salesforce = ["apache-airflow-providers-salesforce"] -sftp = ["apache-airflow-providers-sftp"] -ssh = ["apache-airflow-providers-ssh"] -trino = ["apache-airflow-providers-trino"] - -[[package]] -name = "apache-airflow-providers-http" -version = "4.6.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-http package" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache-airflow-providers-http-4.6.0.tar.gz", hash = "sha256:c9b08782031daa8c18ba62c2c8ae687659968d636fbf6b9fbed488d1fe4f0162"}, - {file = "apache_airflow_providers_http-4.6.0-py3-none-any.whl", hash = "sha256:ca3cf6c209cb27144fd4d676ee5feef96a1ed67002f13bf4a8b74d859ef8b56c"}, -] - -[package.dependencies] -aiohttp = "*" -apache-airflow = ">=2.5.0" -asgiref = "*" -requests = ">=2.26.0" -requests-toolbelt = "*" - -[[package]] -name = "apache-airflow-providers-imap" -version = "3.4.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-imap package" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache-airflow-providers-imap-3.4.0.tar.gz", hash = "sha256:347f78efa0e1353f90be78244fad0136d7c0cb1af25b9a3ba296d4e31fb53f6c"}, - {file = "apache_airflow_providers_imap-3.4.0-py3-none-any.whl", hash = "sha256:4972793b0dbb25d5372fe1bf174329958075985c0beca013459ec89fcbbca620"}, -] - -[package.dependencies] -apache-airflow = ">=2.5.0" - -[[package]] -name = "apache-airflow-providers-sqlite" -version = "3.5.0" -description = "Provider for Apache Airflow. Implements apache-airflow-providers-sqlite package" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache-airflow-providers-sqlite-3.5.0.tar.gz", hash = "sha256:6f47c25d7fb026fa8b8b4dc8edfee1491998255048255625716fceaae2c67024"}, - {file = "apache_airflow_providers_sqlite-3.5.0-py3-none-any.whl", hash = "sha256:7baba67c9ddf75b31d8197e22ca491c2e1cf9e4c6306c1788c150b5457c3a182"}, -] - -[package.dependencies] -apache-airflow = ">=2.5.0" -apache-airflow-providers-common-sql = ">=1.3.1" - -[package.extras] -common-sql = ["apache-airflow-providers-common-sql"] - -[[package]] -name = "apispec" -version = "6.3.0" -description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "apispec-6.3.0-py3-none-any.whl", hash = "sha256:95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339"}, - {file = "apispec-6.3.0.tar.gz", hash = "sha256:6cb08d92ce73ff0b3bf46cb2ea5c00d57289b0f279fb0256a3df468182ba5344"}, -] - -[package.dependencies] -packaging = ">=21.3" -PyYAML = {version = ">=3.10", optional = true, markers = "extra == \"yaml\""} - -[package.extras] -dev = ["PyYAML (>=3.10)", "flake8 (==5.0.4)", "flake8-bugbear (==22.9.23)", "marshmallow (>=3.13.0)", "mypy (==0.982)", "openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)", "pre-commit (>=2.4,<3.0)", "pytest", "tox", "types-PyYAML"] -docs = ["marshmallow (>=3.13.0)", "pyyaml (==6.0)", "sphinx (==5.2.3)", "sphinx-issues (==3.0.1)", "sphinx-rtd-theme (==1.0.0)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.9.23)", "mypy (==0.982)", "pre-commit (>=2.4,<3.0)", "types-PyYAML"] -marshmallow = ["marshmallow (>=3.18.0)"] -tests = ["PyYAML (>=3.10)", "marshmallow (>=3.13.0)", "openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)", "pytest"] -validation = ["openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)"] -yaml = ["PyYAML (>=3.10)"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - -[[package]] -name = "argcomplete" -version = "3.1.2" -description = "Bash tab completion for argparse" -optional = false python-versions = ">=3.6" files = [ - {file = "argcomplete-3.1.2-py3-none-any.whl", hash = "sha256:d97c036d12a752d1079f190bc1521c545b941fda89ad85d15afa909b4d1b9a99"}, - {file = "argcomplete-3.1.2.tar.gz", hash = "sha256:d5d1e5efd41435260b8f85673b74ea2e883affcbec9f4230c582689e8e78251b"}, -] - -[package.extras] -test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] - -[[package]] -name = "asgiref" -version = "3.7.2" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.7" -files = [ - {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, - {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - [[package]] name = "asttokens" version = "2.4.1" @@ -694,21 +203,22 @@ files = [ [[package]] name = "attrs" -version = "23.1.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "avro" @@ -737,17 +247,17 @@ files = [ [[package]] name = "azure-core" -version = "1.29.5" +version = "1.31.0" description = "Microsoft Azure Core Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-core-1.29.5.tar.gz", hash = "sha256:52983c89d394c6f881a121e5101c5fa67278ca3b1f339c8fb2ef39230c70e9ac"}, - {file = "azure_core-1.29.5-py3-none-any.whl", hash = "sha256:0fa04b7b1f7d44a4fb8468c4093deb2ea01fdf4faddbf802ed9205615f99d68c"}, + {file = "azure_core-1.31.0-py3-none-any.whl", hash = "sha256:22954de3777e0250029360ef31d80448ef1be13b80a459bff80ba7073379e2cd"}, + {file = "azure_core-1.31.0.tar.gz", hash = "sha256:656a0dd61e1869b1506b7c6a3b31d62f15984b1a573d6326f6aa2f3e4123284b"}, ] [package.dependencies] -requests = ">=2.18.4" +requests = ">=2.21.0" six = ">=1.11.0" typing-extensions = ">=4.6.0" @@ -756,20 +266,21 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.15.0" +version = "1.19.0" description = "Microsoft Azure Identity Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, - {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, + {file = "azure_identity-1.19.0-py3-none-any.whl", hash = "sha256:e3f6558c181692d7509f09de10cca527c7dce426776454fb97df512a46527e81"}, + {file = "azure_identity-1.19.0.tar.gz", hash = "sha256:500144dc18197d7019b81501165d4fa92225f03778f17d7ca8a2a180129a9c83"}, ] [package.dependencies] -azure-core = ">=1.23.0,<2.0.0" +azure-core = ">=1.31.0" cryptography = ">=2.5" -msal = ">=1.24.0,<2.0.0" -msal-extensions = ">=0.3.0,<2.0.0" +msal = ">=1.30.0" +msal-extensions = ">=1.2.0" +typing-extensions = ">=4.0.0" [[package]] name = "azure-mgmt-core" @@ -803,266 +314,226 @@ msrest = ">=0.6.21" [[package]] name = "azure-storage-blob" -version = "12.18.3" +version = "12.23.1" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-storage-blob-12.18.3.tar.gz", hash = "sha256:d8ced0deee3367fa3d4f3d1a03cd9edadf4440c0a371f503d623fa6c807554ee"}, - {file = "azure_storage_blob-12.18.3-py3-none-any.whl", hash = "sha256:c278dde2ac41857a68d615c9f2b36d894ba877a7e84d62795603c7e79d0bb5e9"}, + {file = "azure_storage_blob-12.23.1-py3-none-any.whl", hash = "sha256:1c2238aa841d1545f42714a5017c010366137a44a0605da2d45f770174bfc6b4"}, + {file = "azure_storage_blob-12.23.1.tar.gz", hash = "sha256:a587e54d4e39d2a27bd75109db164ffa2058fe194061e5446c5a89bca918272f"}, ] [package.dependencies] -azure-core = ">=1.28.0,<2.0.0" +azure-core = ">=1.30.0" cryptography = ">=2.1.4" isodate = ">=0.6.1" -typing-extensions = ">=4.3.0" +typing-extensions = ">=4.6.0" [package.extras] -aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] +aio = ["azure-core[aio] (>=1.30.0)"] [[package]] name = "babel" -version = "2.13.1" +version = "2.16.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "blinker" -version = "1.6.3" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = ">=3.7" -files = [ - {file = "blinker-1.6.3-py3-none-any.whl", hash = "sha256:296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"}, - {file = "blinker-1.6.3.tar.gz", hash = "sha256:152090d27c1c5c722ee7e48504b02d76502811ce02e1523553b4cf8c8b3d3a8d"}, -] - [[package]] name = "bokeh" -version = "3.3.0" +version = "3.6.0" description = "Interactive plots and applications in the browser from Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "bokeh-3.3.0-py3-none-any.whl", hash = "sha256:65e36824c99fd46530c559263c6d14eabed6945370cd3beffc2eeedb62d6db6d"}, - {file = "bokeh-3.3.0.tar.gz", hash = "sha256:cdbe268f842c139ba8fa0fb43c0c55c172c8215ec5a69a2629482c63c9d4039c"}, + {file = "bokeh-3.6.0-py3-none-any.whl", hash = "sha256:699e0df76cdfe54b5f574738647bd0ce230fa44fa0fcda5923e1f0f550f83d74"}, + {file = "bokeh-3.6.0.tar.gz", hash = "sha256:0032dc1e76ad097b07626e51584685ff48c65481fbaaad105663b1046165867a"}, ] [package.dependencies] -contourpy = ">=1" +contourpy = ">=1.2" Jinja2 = ">=2.9" numpy = ">=1.16" packaging = ">=16.8" pandas = ">=1.2" pillow = ">=7.1.0" PyYAML = ">=3.10" -tornado = ">=5.1" +tornado = ">=6.2" xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.28.75" +version = "1.35.51" description = "The AWS SDK for Python" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "boto3-1.28.75-py3-none-any.whl", hash = "sha256:b959decd588982bc919bfcbebc7916926b05003a0093e7f2845362da4f5dd9fc"}, - {file = "boto3-1.28.75.tar.gz", hash = "sha256:63d772a784e8e35ee51974eb1c20dff5faa51b007d22c5647783f18966bf4042"}, + {file = "boto3-1.35.51-py3-none-any.whl", hash = "sha256:c922f6a18958af9d8af0489d6d8503b517029d8159b26aa4859a8294561c72e9"}, + {file = "boto3-1.35.51.tar.gz", hash = "sha256:a57c6c7012ecb40c43e565a6f7a891f39efa990ff933eab63cd456f7501c2731"}, ] [package.dependencies] -botocore = ">=1.31.75,<1.32.0" +botocore = ">=1.35.51,<1.36.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.7.0,<0.8.0" +s3transfer = ">=0.10.0,<0.11.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.31.75" +version = "1.35.51" description = "Low-level, data-driven core of boto 3." optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "botocore-1.31.75-py3-none-any.whl", hash = "sha256:fa078c4aa9a5777b3ede756540e62fec551e13d39cf7abf9a37bb81981496d68"}, - {file = "botocore-1.31.75.tar.gz", hash = "sha256:d704ea9867b2227de0350bc2a5ca2543349e164ecb5d15edbfacbb05f2056482"}, + {file = "botocore-1.35.51-py3-none-any.whl", hash = "sha256:4d65b00111bd12b98e9f920ecab602cf619cc6a6d0be6e5dd53f517e4b92901c"}, + {file = "botocore-1.35.51.tar.gz", hash = "sha256:a9b3d1da76b3e896ad74605c01d88f596324a3337393d4bfbfa0d6c35822ca9c"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.16.26)"] +crt = ["awscrt (==0.22.0)"] [[package]] name = "bracex" -version = "2.4" +version = "2.5.post1" description = "Bash style brace expander." optional = false python-versions = ">=3.8" files = [ - {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, - {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, -] - -[[package]] -name = "cachelib" -version = "0.9.0" -description = "A collection of cache libraries in the same API interface." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, - {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, + {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, + {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, ] [[package]] name = "cachetools" -version = "5.3.2" +version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, - {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, -] - -[[package]] -name = "cattrs" -version = "23.1.2" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"}, - {file = "cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] -[package.dependencies] -attrs = ">=20" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -typing_extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} - -[package.extras] -bson = ["pymongo (>=4.2.0,<5.0.0)"] -cbor2 = ["cbor2 (>=5.4.6,<6.0.0)"] -msgpack = ["msgpack (>=1.0.2,<2.0.0)"] -orjson = ["orjson (>=3.5.2,<4.0.0)"] -pyyaml = ["PyYAML (>=6.0,<7.0)"] -tomlkit = ["tomlkit (>=0.11.4,<0.12.0)"] -ujson = ["ujson (>=5.4.0,<6.0.0)"] - [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -1079,114 +550,118 @@ files = [ {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] -[[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] - [[package]] name = "charset-normalizer" -version = "3.3.1" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, - {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -1204,20 +679,16 @@ files = [ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] -name = "clickclick" -version = "20.10.2" -description = "Click utility functions" +name = "cloudpickle" +version = "3.1.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "clickclick-20.10.2-py2.py3-none-any.whl", hash = "sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5"}, - {file = "clickclick-20.10.2.tar.gz", hash = "sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c"}, + {file = "cloudpickle-3.1.0-py3-none-any.whl", hash = "sha256:fe11acda67f61aaaec473e3afe030feb131d78a43461b718185363384f1ba12e"}, + {file = "cloudpickle-3.1.0.tar.gz", hash = "sha256:81a929b6e3c7335c863c771d673d105f02efdb89dfaba0c90495d1c64796601b"}, ] -[package.dependencies] -click = ">=4.0" -PyYAML = ">=3.11" - [[package]] name = "colorama" version = "0.4.6" @@ -1229,38 +700,22 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "colorlog" -version = "4.8.0" -description = "Log formatting with colors!" -optional = false -python-versions = "*" -files = [ - {file = "colorlog-4.8.0-py2.py3-none-any.whl", hash = "sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd"}, - {file = "colorlog-4.8.0.tar.gz", hash = "sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - [[package]] name = "comm" -version = "0.1.4" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, - {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] [[package]] name = "commonmark" @@ -1276,179 +731,159 @@ files = [ [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] -[[package]] -name = "configupdater" -version = "3.1.1" -description = "Parser like ConfigParser but for updating configuration files" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ConfigUpdater-3.1.1-py2.py3-none-any.whl", hash = "sha256:805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286"}, - {file = "ConfigUpdater-3.1.1.tar.gz", hash = "sha256:46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b"}, -] - -[package.extras] -testing = ["flake8", "pytest", "pytest-cov", "pytest-virtualenv", "pytest-xdist", "sphinx"] - -[[package]] -name = "connexion" -version = "2.14.1" -description = "Connexion - API first applications with OpenAPI/Swagger and Flask" -optional = false -python-versions = ">=3.6" -files = [ - {file = "connexion-2.14.1-py2.py3-none-any.whl", hash = "sha256:f343717241b4c4802a694c38fee66fb1693c897fe4ea5a957fa9b3b07caf6394"}, - {file = "connexion-2.14.1.tar.gz", hash = "sha256:99aa5781e70a7b94f8ffae8cf89f309d49cdb811bbd65a8e2f2546f3b19a01e6"}, -] - -[package.dependencies] -clickclick = ">=1.2,<21" -flask = ">=1.0.4,<3" -inflection = ">=0.3.1,<0.6" -itsdangerous = ">=0.24" -jsonschema = ">=2.5.1,<5" -packaging = ">=20" -PyYAML = ">=5.1,<7" -requests = ">=2.9.1,<3" -werkzeug = ">=1.0,<3" - -[package.extras] -aiohttp = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)"] -docs = ["sphinx-autoapi (==1.8.1)"] -flask = ["flask (>=1.0.4,<3)", "itsdangerous (>=0.24)"] -swagger-ui = ["swagger-ui-bundle (>=0.0.2,<0.1)"] -tests = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)", "aiohttp-remotes", "decorator (>=5,<6)", "flask (>=1.0.4,<3)", "itsdangerous (>=0.24)", "pytest (>=6,<7)", "pytest-aiohttp", "pytest-cov (>=2,<3)", "swagger-ui-bundle (>=0.0.2,<0.1)", "testfixtures (>=6,<7)"] - [[package]] name = "contourpy" -version = "1.1.1" +version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, - {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, - {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, - {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, - {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, - {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, - {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, - {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, - {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, - {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, - {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, - {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, - {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, - {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, - {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, - {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, - {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, - {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, -] - -[package.dependencies] -numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.6.4" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.dependencies] @@ -1458,78 +893,68 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 toml = ["tomli"] [[package]] -name = "cron-descriptor" -version = "1.4.0" -description = "A Python library that converts cron expressions into human readable strings." -optional = false -python-versions = "*" -files = [ - {file = "cron_descriptor-1.4.0.tar.gz", hash = "sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd"}, -] - -[package.extras] -dev = ["polib"] - -[[package]] -name = "croniter" -version = "2.0.1" -description = "croniter provides iteration for datetime object with cron like format" +name = "cryptography" +version = "43.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" files = [ - {file = "croniter-2.0.1-py2.py3-none-any.whl", hash = "sha256:4cb064ce2d8f695b3b078be36ff50115cf8ac306c10a7e8653ee2a5b534673d7"}, - {file = "croniter-2.0.1.tar.gz", hash = "sha256:d199b2ec3ea5e82988d1f72022433c5f9302b3b3ea9e6bfd6a1518f6ea5e700a"}, -] - -[package.dependencies] -python-dateutil = "*" -pytz = ">2021.1" + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] -name = "cryptography" -version = "38.0.4" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"}, - {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c"}, - {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00"}, - {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0"}, - {file = "cryptography-38.0.4-cp36-abi3-win32.whl", hash = "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744"}, - {file = "cryptography-38.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9"}, - {file = "cryptography-38.0.4.tar.gz", hash = "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] -[package.dependencies] -cffi = ">=1.12" - [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "darglint" @@ -1544,13 +969,13 @@ files = [ [[package]] name = "db-dtypes" -version = "1.1.1" +version = "1.3.0" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" optional = false python-versions = ">=3.7" files = [ - {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, - {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, + {file = "db_dtypes-1.3.0-py2.py3-none-any.whl", hash = "sha256:7e65c59f849ccbe6f7bc4d0253edcc212a7907662906921caba3e4aadd0bc277"}, + {file = "db_dtypes-1.3.0.tar.gz", hash = "sha256:7bcbc8858b07474dc85b77bb2f3ae488978d1336f5ea73b58c39d9118bc3e91b"}, ] [package.dependencies] @@ -1561,40 +986,48 @@ pyarrow = ">=3.0.0" [[package]] name = "dbldatagen" -version = "0.3.5" +version = "0.4.0.post1" description = "Databricks Labs - PySpark Synthetic Data Generator" optional = false python-versions = ">=3.8.10" files = [ - {file = "dbldatagen-0.3.5-py3-none-any.whl", hash = "sha256:75db379c68adda518fbe5d09184ca0756255f2086d8466fbdeaba29863b98349"}, - {file = "dbldatagen-0.3.5.tar.gz", hash = "sha256:d50dd7f2180d6f3e21a107b8759d62f9a9dd093b64833f73940d99f58723c4b4"}, + {file = "dbldatagen-0.4.0.post1-py3-none-any.whl", hash = "sha256:b94b5fcf2bf5113fe789f5cdf92b50eb62b5e6c25fc867b634d6543cc1e79d40"}, + {file = "dbldatagen-0.4.0.post1.tar.gz", hash = "sha256:a254fba2a6384c75e2dfb38b1e8cdc1c52b417c59fd6ec977e11175ad7567f34"}, ] [[package]] name = "debugpy" -version = "1.8.0" +version = "1.8.7" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, - {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, - {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, - {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, - {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, - {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, - {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, - {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, - {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, - {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, - {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, - {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, - {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, - {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, - {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, - {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, - {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, - {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, ] [[package]] @@ -1627,75 +1060,65 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "deptry" -version = "0.12.0" +version = "0.20.0" description = "A command line utility to check for unused, missing and transitive dependencies in a Python project." optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.8" files = [ - {file = "deptry-0.12.0-py3-none-any.whl", hash = "sha256:69c801a6ae1b39c7b8e0daf40dbe8b75f1f161277d206dd8f921f32cd22dad91"}, - {file = "deptry-0.12.0.tar.gz", hash = "sha256:ac3cd32d149c92a9af12f63cd9486ddd1760f0277ed0cf306c6ef0388f57ff0a"}, + {file = "deptry-0.20.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:41434d95124851b83cb05524d1a09ad6fea62006beafed2ef90a6b501c1b237f"}, + {file = "deptry-0.20.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:b3b4b22d1406147de5d606a24042126cd74d52fdfdb0232b9c5fd0270d601610"}, + {file = "deptry-0.20.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012fb106dbea6ca95196cdcd75ac90c516c8f01292f7934f2e802a7cf025a660"}, + {file = "deptry-0.20.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ce3920e2bd6d2b4427ab31ab8efb94bbef897001c2d395782bc30002966d12d"}, + {file = "deptry-0.20.0-cp38-abi3-win_amd64.whl", hash = "sha256:0c90ce64e637d0e902bc97c5a020adecfee9e9f09ee0bf4c61554994139bebdb"}, + {file = "deptry-0.20.0-cp38-abi3-win_arm64.whl", hash = "sha256:6886ff44aaf26fd83093f14f844ebc84589d90df9bbad9a1625e8a080e6f1be2"}, + {file = "deptry-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ace3b39b1d0763f357c79bab003d1b135bea2eb61102be539992621a42d1ac7b"}, + {file = "deptry-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d1a00f8c9e6c0829a4a523edd5e526e3df06d2b50e0a99446f09f9723df2efad"}, + {file = "deptry-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e233859f150df70ffff76e95f9b7326fc25494b9beb26e776edae20f0f515e7d"}, + {file = "deptry-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f92e7e97ef42477717747b190bc6796ab94b35655af126d8c577f7eae0eb3a9"}, + {file = "deptry-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f6cee6005997791bb77155667be055333fb63ae9a24f0f103f25faf1e7affe34"}, + {file = "deptry-0.20.0.tar.gz", hash = "sha256:62e9aaf3aea9e2ca66c85da98a0ba0290b4d3daea4e1d0ad937d447bd3c36402"}, ] [package.dependencies] -chardet = ">=4.0.0" -click = ">=8.0.0,<9.0.0" +click = ">=8.0.0,<9" colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} -pathspec = ">=0.9.0" -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [[package]] name = "dill" -version = "0.3.7" +version = "0.3.9" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] -name = "dnspython" -version = "2.4.2" -description = "DNS toolkit" +name = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" optional = false -python-versions = ">=3.8,<4.0" +python-versions = "*" files = [ - {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, - {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, -] - -[package.extras] -dnssec = ["cryptography (>=2.6,<42.0)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] - -[[package]] -name = "docker-pycreds" -version = "0.4.0" -description = "Python bindings for the docker credentials store API" -optional = false -python-versions = "*" -files = [ - {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, - {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, ] [package.dependencies] @@ -1703,61 +1126,24 @@ six = ">=1.4.0" [[package]] name = "docstring-parser-fork" -version = "0.0.5" +version = "0.0.9" description = "Parse Python docstrings in reST, Google and Numpydoc format" optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "docstring_parser_fork-0.0.5-py3-none-any.whl", hash = "sha256:d521dea9b9cc6c60ab5569fa0c1115e3b84a83e6413266fb111a7c81cb935997"}, - {file = "docstring_parser_fork-0.0.5.tar.gz", hash = "sha256:395ae8ee6a359e268670ebc4fe9a40dab917a94f6decd7cda8e86f9bea5c9456"}, -] - -[[package]] -name = "docutils" -version = "0.20.1" -description = "Docutils -- Python Documentation Utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, -] - -[[package]] -name = "dotty-dict" -version = "1.3.1" -description = "Dictionary wrapper for quick access to deeply nested keys." -optional = false -python-versions = ">=3.5,<4.0" -files = [ - {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, - {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, -] - -[[package]] -name = "email-validator" -version = "1.3.1" -description = "A robust email address syntax and deliverability validation library." -optional = false -python-versions = ">=3.5" +python-versions = "<4.0,>=3.7" files = [ - {file = "email_validator-1.3.1-py2.py3-none-any.whl", hash = "sha256:49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda"}, - {file = "email_validator-1.3.1.tar.gz", hash = "sha256:d178c5c6fa6c6824e9b04f199cf23e79ac15756786573c190d2ad13089411ad2"}, + {file = "docstring_parser_fork-0.0.9-py3-none-any.whl", hash = "sha256:0be85ad00cb25bf5beeb673e46e777facf0f47552fa3a7570d120ef7e3374401"}, + {file = "docstring_parser_fork-0.0.9.tar.gz", hash = "sha256:95b23cc5092af85080c716a6da68360f5ae4fcffa75f4a3aca5e539783cbcc3d"}, ] -[package.dependencies] -dnspython = ">=1.15.0" -idna = ">=2.0.0" - [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1765,13 +1151,13 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] @@ -1779,13 +1165,13 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -1793,317 +1179,217 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.13.1" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flake8" -version = "6.1.0" +version = "7.1.1" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, - {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.1.0,<3.2.0" - -[[package]] -name = "flask" -version = "2.2.5" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, - {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, -] - -[package.dependencies] -click = ">=8.0" -itsdangerous = ">=2.0" -Jinja2 = ">=3.0" -Werkzeug = ">=2.2.2" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - -[[package]] -name = "flask-appbuilder" -version = "4.3.10" -description = "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more." -optional = false -python-versions = "~=3.7" -files = [ - {file = "Flask-AppBuilder-4.3.10.tar.gz", hash = "sha256:4173c878e56b81c6acac5e3c80c133f4183f43442fd944552bd9f4023f5baceb"}, - {file = "Flask_AppBuilder-4.3.10-py3-none-any.whl", hash = "sha256:c0af506e1a68e7ee14f26a16fda829f1a14f8343654c30bdbb1351d23c545df9"}, -] - -[package.dependencies] -apispec = {version = ">=6.0.0,<7", extras = ["yaml"]} -click = ">=8,<9" -colorama = ">=0.3.9,<1" -email-validator = ">=1.0.5,<2" -Flask = ">=2,<2.3.0" -Flask-Babel = ">=1,<3" -Flask-JWT-Extended = ">=4.0.0,<5.0.0" -Flask-Limiter = ">3,<4" -Flask-Login = ">=0.3,<0.7" -Flask-SQLAlchemy = ">=2.4,<3" -Flask-WTF = ">=0.14.2,<2" -jsonschema = ">=3,<5" -marshmallow = ">=3.18.0,<4" -marshmallow-sqlalchemy = ">=0.22.0,<0.27.0" -prison = ">=0.2.1,<1.0.0" -PyJWT = ">=2.0.0,<3.0.0" -python-dateutil = ">=2.3,<3" -SQLAlchemy = "<1.5" -sqlalchemy-utils = ">=0.32.21,<1" -werkzeug = "<3" -WTForms = "<4" - -[package.extras] -jmespath = ["jmespath (>=0.9.5)"] -oauth = ["Authlib (>=0.14,<2.0.0)"] -openid = ["Flask-OpenID (>=1.2.5,<2)"] -talisman = ["flask-talisman (>=1.0.0,<2.0)"] - -[[package]] -name = "flask-babel" -version = "2.0.0" -description = "Adds i18n/l10n support to Flask applications" -optional = false -python-versions = "*" -files = [ - {file = "Flask-Babel-2.0.0.tar.gz", hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d"}, - {file = "Flask_Babel-2.0.0-py3-none-any.whl", hash = "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"}, -] - -[package.dependencies] -Babel = ">=2.3" -Flask = "*" -Jinja2 = ">=2.5" -pytz = "*" - -[package.extras] -dev = ["Pallets-Sphinx-Themes", "bumpversion", "ghp-import", "pytest", "pytest-mock", "sphinx"] - -[[package]] -name = "flask-caching" -version = "2.1.0" -description = "Adds caching support to Flask applications." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Caching-2.1.0.tar.gz", hash = "sha256:b7500c145135836a952e3de3a80881d9654e327a29c852c9265607f5c449235c"}, - {file = "Flask_Caching-2.1.0-py3-none-any.whl", hash = "sha256:f02645a629a8c89800d96dc8f690a574a0d49dcd66c7536badc6d362ba46b716"}, -] - -[package.dependencies] -cachelib = ">=0.9.0,<0.10.0" -Flask = "*" - -[[package]] -name = "flask-jwt-extended" -version = "4.5.3" -description = "Extended JWT integration with Flask" -optional = false -python-versions = ">=3.7,<4" -files = [ - {file = "Flask-JWT-Extended-4.5.3.tar.gz", hash = "sha256:061ef3d25ed5743babe4964ab38f36d870e6d2fd8a126bab5d77ddef8a01932b"}, - {file = "Flask_JWT_Extended-4.5.3-py2.py3-none-any.whl", hash = "sha256:eaec42af107dcb919785a4b3766c09ffba9f286b92a8d58603933f28fd4db6a3"}, -] - -[package.dependencies] -Flask = ">=2.0,<4.0" -PyJWT = ">=2.0,<3.0" -Werkzeug = ">=0.14" - -[package.extras] -asymmetric-crypto = ["cryptography (>=3.3.1)"] - -[[package]] -name = "flask-limiter" -version = "3.5.0" -description = "Rate limiting for flask applications" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Limiter-3.5.0.tar.gz", hash = "sha256:13a3491b994c49f7cb4706587a38ca47e8162b576530472df38be68104f299c0"}, - {file = "Flask_Limiter-3.5.0-py3-none-any.whl", hash = "sha256:dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee"}, -] - -[package.dependencies] -Flask = ">=2" -limits = ">=2.8" -ordered-set = ">4,<5" -rich = ">=12,<14" -typing-extensions = ">=4" - -[package.extras] -memcached = ["limits[memcached]"] -mongodb = ["limits[mongodb]"] -redis = ["limits[redis]"] - -[[package]] -name = "flask-login" -version = "0.6.3" -description = "User authentication and session management for Flask." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, - {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, -] - -[package.dependencies] -Flask = ">=1.0.4" -Werkzeug = ">=1.0.1" - -[[package]] -name = "flask-session" -version = "0.5.0" -description = "Server-side session support for Flask" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Session-0.5.0.tar.gz", hash = "sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86"}, - {file = "flask_session-0.5.0-py3-none-any.whl", hash = "sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631"}, -] - -[package.dependencies] -cachelib = "*" -flask = ">=2.2" - -[[package]] -name = "flask-sqlalchemy" -version = "2.5.1" -description = "Adds SQLAlchemy support to your Flask application." -optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" -files = [ - {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, - {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, -] - -[package.dependencies] -Flask = ">=0.10" -SQLAlchemy = ">=0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" [[package]] -name = "flask-wtf" -version = "1.2.1" -description = "Form rendering, validation, and CSRF protection for Flask with WTForms." +name = "fonttools" +version = "4.54.1" +description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "flask_wtf-1.2.1-py3-none-any.whl", hash = "sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"}, - {file = "flask_wtf-1.2.1.tar.gz", hash = "sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"}, -] - -[package.dependencies] -flask = "*" -itsdangerous = "*" -wtforms = "*" - -[package.extras] -email = ["email-validator"] + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.5.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] [[package]] name = "fsspec" -version = "2023.10.0" +version = "2024.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, - {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, ] [package.extras] @@ -2111,7 +1397,8 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -2121,91 +1408,33 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] -[[package]] -name = "future" -version = "0.18.3" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, -] - -[[package]] -name = "gcloud-aio-auth" -version = "4.1.5" -description = "Python Client for Google Cloud Auth" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "gcloud_aio_auth-4.1.5-py3-none-any.whl", hash = "sha256:606431bd670effc4b67456877747d400c4dd0d8d20bbca98c72f09041359985f"}, - {file = "gcloud_aio_auth-4.1.5.tar.gz", hash = "sha256:12b8308f32a83b76ae04129800df8eb09e8803219c2ebabccad2364f39744f79"}, -] - -[package.dependencies] -aiohttp = ">=3.3.0,<4.0.0" -backoff = ">=1.0.0,<3.0.0" -chardet = {version = ">=2.0,<4.1", markers = "python_version >= \"3.7\""} -cryptography = ">=2.0.0,<39.0.0" -future = ">=0.17.0,<0.19.0" -pyjwt = ">=1.5.3,<3.0.0" -six = ">=1.11.0,<2.0.0" - -[[package]] -name = "gcloud-aio-bigquery" -version = "7.0.0" -description = "Python Client for Google Cloud BigQuery" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "gcloud_aio_bigquery-7.0.0-py3-none-any.whl", hash = "sha256:188b96b16b0fdbef2a0bc15ffce3f5a930ecc36de537fcfa5794fc397506fdd8"}, - {file = "gcloud_aio_bigquery-7.0.0.tar.gz", hash = "sha256:2cd1c7c9dcb68122ff6187f2b533941c86d954e5312d942c8107aac4d20ea2ec"}, -] - -[package.dependencies] -gcloud-aio-auth = ">=3.1.0,<6.0.0" - -[[package]] -name = "gcloud-aio-storage" -version = "9.0.0" -description = "Python Client for Google Cloud Storage" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "gcloud_aio_storage-9.0.0-py3-none-any.whl", hash = "sha256:223583018b0ad68f22201593970c638e00fb86f40d9bb9187b17910a02ab118c"}, - {file = "gcloud_aio_storage-9.0.0.tar.gz", hash = "sha256:99e6d30c65809ceafe059d496dbf10a4186edb1850fe9634988e096966503046"}, -] - -[package.dependencies] -aiofiles = ">=0.6.0,<24.0.0" -gcloud-aio-auth = ">=3.6.0,<6.0.0" -pyasn1-modules = ">=0.2.1,<0.4.0" -rsa = ">=3.1.4,<5.0.0" - [[package]] name = "gcsfs" -version = "2023.10.0" +version = "2024.10.0" description = "Convenient Filesystem interface over GCS" optional = false python-versions = ">=3.8" files = [ - {file = "gcsfs-2023.10.0-py2.py3-none-any.whl", hash = "sha256:f3ad41652a596ca56e44778e041f428d022add3eff62b97a47302014affd270f"}, - {file = "gcsfs-2023.10.0.tar.gz", hash = "sha256:1915e6d766faad9a295e815b13c59966b925a274108b8a56f673623bf4aef83f"}, + {file = "gcsfs-2024.10.0-py2.py3-none-any.whl", hash = "sha256:bb2d23547e61203ea2dda5fa6c4b91a0c34b74ebe8bb6ab1926f6c33381bceb2"}, + {file = "gcsfs-2024.10.0.tar.gz", hash = "sha256:5df54cfe568e8fdeea5aafa7fed695cdc69a9a674e991ca8c1ce634f5df1d314"}, ] [package.dependencies] aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" decorator = ">4.1.2" -fsspec = "2023.10.0" +fsspec = "2024.10.0" google-auth = ">=1.2" google-auth-oauthlib = "*" google-cloud-storage = "*" @@ -2216,1277 +1445,291 @@ crc = ["crcmod"] gcsfuse = ["fusepy"] [[package]] -name = "ghp-import" -version = "2.1.0" -description = "Copy your docs directly to the gh-pages branch." -optional = false -python-versions = "*" -files = [ - {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, - {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, -] - -[package.dependencies] -python-dateutil = ">=2.8.1" - -[package.extras] -dev = ["flake8", "markdown", "twine", "wheel"] - -[[package]] -name = "gitdb" -version = "4.0.11" -description = "Git Object Database" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, - {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.40" -description = "GitPython is a Python library used to interact with Git repositories" -optional = false -python-versions = ">=3.7" -files = [ - {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, - {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] - -[[package]] -name = "google" -version = "3.0.0" -description = "Python bindings to the Google search engine." -optional = false -python-versions = "*" -files = [ - {file = "google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935"}, - {file = "google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe"}, -] - -[package.dependencies] -beautifulsoup4 = "*" - -[[package]] -name = "google-ads" -version = "22.1.0" -description = "Client library for the Google Ads API" -optional = false -python-versions = ">=3.7, <3.12" -files = [ - {file = "google-ads-22.1.0.tar.gz", hash = "sha256:cfab38b40eb8424a4a514823bd8b911a57ef55dd64e2112cfa46a70d8090de98"}, - {file = "google_ads-22.1.0-py3-none-any.whl", hash = "sha256:6fdd3fb635678fbb3c8f87271afc81f0e139882b83b48505160fc4daacf33ad0"}, -] - -[package.dependencies] -google-api-core = ">=2.8.0,<=3.0.0" -google-auth-oauthlib = ">=0.3.0,<2.0.0" -googleapis-common-protos = ">=1.56.0,<2.0.0" -grpcio = ">=1.38.1,<2.0.0" -grpcio-status = ">=1.38.1,<2.0.0" -proto-plus = ">=1.19.6,<2.0.0" -protobuf = ">=3.12.0,<3.18.dev0 || >=3.20.dev0,<5.0.0" -PyYAML = ">=5.1,<7.0" -setuptools = ">=40.3.0" - -[package.extras] -tests = ["nox (>=2020.12.31,<2022.6)"] - -[[package]] -name = "google-analytics-admin" -version = "0.22.5" -description = "Google Analytics Admin API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-analytics-admin-0.22.5.tar.gz", hash = "sha256:2de1671ea945c23b3587323ed1dc6e6c78d02a7507b562d425de1dc7fb27b08f"}, - {file = "google_analytics_admin-0.22.5-py2.py3-none-any.whl", hash = "sha256:54c6e00baeb9be61492b4efcd4859ca1b94b181ce454ba70ff5d73a630dd5661"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-api-core" -version = "2.12.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, - {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-api-python-client" -version = "2.106.0" -description = "Google API Client Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-python-client-2.106.0.tar.gz", hash = "sha256:f6a3862be2f6e5e0536d7bd47b5af3f24ac0b9147c76c830cafb3329d71d5724"}, - {file = "google_api_python_client-2.106.0-py2.py3-none-any.whl", hash = "sha256:c47c0dae5dd20aa43e4ea184566fe59d0c8fd0b86dd223b29040d8ea4f7ed6ea"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" -google-auth = ">=1.19.0,<3.0.0.dev0" -google-auth-httplib2 = ">=0.1.0" -httplib2 = ">=0.15.0,<1.dev0" -uritemplate = ">=3.0.1,<5" - -[[package]] -name = "google-auth" -version = "2.23.4" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-auth-httplib2" -version = "0.1.1" -description = "Google Authentication Library: httplib2 transport" -optional = false -python-versions = "*" -files = [ - {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, - {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, -] - -[package.dependencies] -google-auth = "*" -httplib2 = ">=0.19.0" - -[[package]] -name = "google-auth-oauthlib" -version = "0.8.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, - {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, -] - -[package.dependencies] -google-auth = ">=2.15.0" -requests-oauthlib = ">=0.7.0" - -[package.extras] -tool = ["click (>=6.0.0)"] - -[[package]] -name = "google-cloud-aiplatform" -version = "1.36.0" -description = "Vertex AI API client library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "google-cloud-aiplatform-1.36.0.tar.gz", hash = "sha256:c35eb179fa3107c262024a63bb4a3dc1887678424a0b9f49f0da3f5179896186"}, - {file = "google_cloud_aiplatform-1.36.0-py2.py3-none-any.whl", hash = "sha256:06adb1605208a9bdbadd8c4deeaeb6511a7f59220ef606e2d95ccc1da705ebda"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.32.0,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-bigquery = ">=1.15.0,<4.0.0dev" -google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" -google-cloud-storage = ">=1.32.0,<3.0.0dev" -packaging = ">=14.3" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -shapely = "<3.0.0dev" - -[package.extras] -autologging = ["mlflow (>=1.27.0,<=2.1.1)"] -cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)"] -endpoint = ["requests (>=2.28.1)"] -full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] -lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] -metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] -pipelines = ["pyyaml (==5.3.1)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.103.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] -preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)"] -private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] -ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)"] -tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] -testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<=2.12.0)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost", "xgboost-ray"] -vizier = ["google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.0.14)", "google-vizier (>=0.1.6)"] -xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-appengine-logging" -version = "1.3.2" -description = "Google Cloud Appengine Logging API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-appengine-logging-1.3.2.tar.gz", hash = "sha256:a2989fca0e88463b56432aa821e64b81c3d171ee37b84771189b48e8b97cd496"}, - {file = "google_cloud_appengine_logging-1.3.2-py2.py3-none-any.whl", hash = "sha256:6ac6261567b56611f6891fa650f76db8a48d528762e5c2a09230b41d82ee2be0"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-audit-log" -version = "0.2.5" -description = "Google Cloud Audit Protos" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-audit-log-0.2.5.tar.gz", hash = "sha256:86e2faba3383adc8fd04a5bd7fd4f960b3e4aedaa7ed950f2f891ce16902eb6b"}, - {file = "google_cloud_audit_log-0.2.5-py2.py3-none-any.whl", hash = "sha256:18b94d4579002a450b7902cd2e8b8fdcb1ea2dd4df3b41f8f82be6d9f7fcd746"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.56.2,<2.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-automl" -version = "2.12.0" -description = "Google Cloud Automl API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-automl-2.12.0.tar.gz", hash = "sha256:22f7a61e04b4a9b03d504ef2db6683df462a032da53fe3fbb2c36f525074abb5"}, - {file = "google_cloud_automl-2.12.0-py2.py3-none-any.whl", hash = "sha256:e20e9aec2f368bda29b039d8109384379a6cd9410ac5ee81acdab3afbf89ad8e"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] -pandas = ["pandas (>=1.0.5)"] -storage = ["google-cloud-storage (>=1.18.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-batch" -version = "0.17.2" -description = "Google Cloud Batch API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-batch-0.17.2.tar.gz", hash = "sha256:381ac83d18b46354cb5c51d33dbfcede62b039f3f13960ac9691cb4178f3c5b7"}, - {file = "google_cloud_batch-0.17.2-py2.py3-none-any.whl", hash = "sha256:c614f17d47095fd0b41e3f7de2e66f6ec5f1168d682b8338dfa3c18803234be0"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-bigquery" -version = "3.13.0" -description = "Google BigQuery API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-3.13.0.tar.gz", hash = "sha256:794ccfc93ccb0e0ad689442f896f9c82de56da0fe18a195531bb37096c2657d6"}, - {file = "google_cloud_bigquery-3.13.0-py2.py3-none-any.whl", hash = "sha256:eda3dbcff676e17962c54e5224e415b55e4f6833a5c896c6c8902b69e7dba4b4"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.6.0,<3.0.0dev" -google-resumable-media = ">=0.6.0,<3.0dev" -grpcio = ">=1.47.0,<2.0dev" -packaging = ">=20.0.0" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -python-dateutil = ">=2.7.2,<3.0dev" -requests = ">=2.21.0,<3.0.0dev" - -[package.extras] -all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] -ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] -opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] -tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] - -[[package]] -name = "google-cloud-bigquery-datatransfer" -version = "3.13.0" -description = "Google Cloud Bigquery Datatransfer API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-datatransfer-3.13.0.tar.gz", hash = "sha256:27a845cb22605a512c05ce28c2890d2ef97ad4edfc9817af555a73d8024ec3ba"}, - {file = "google_cloud_bigquery_datatransfer-3.13.0-py2.py3-none-any.whl", hash = "sha256:f8a73ba135fc6f6df4516187b5d88c7d1fcd68ecb1b0ed259ff55b89c5a0974a"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-bigquery-storage" -version = "2.22.0" -description = "Google Cloud Bigquery Storage API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-storage-2.22.0.tar.gz", hash = "sha256:f6d8c7b3ab9b574c66977fcee9d336e334ad1a3843a722be19123640e7808ea3"}, - {file = "google_cloud_bigquery_storage-2.22.0-py2.py3-none-any.whl", hash = "sha256:7f11b2ae590a5b3874fb6ddf705a66a070340db238f971cf7b53349eee9ca317"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -fastavro = ["fastavro (>=0.21.2)"] -pandas = ["pandas (>=0.21.1)"] -pyarrow = ["pyarrow (>=0.15.0)"] - -[[package]] -name = "google-cloud-bigtable" -version = "2.21.0" -description = "Google Cloud Bigtable API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigtable-2.21.0.tar.gz", hash = "sha256:d9f0efbf940ca392f07d13787fc2da76d1e168dedafae0f8f1b4208e0c1132dc"}, - {file = "google_cloud_bigtable-2.21.0-py2.py3-none-any.whl", hash = "sha256:219d39f2787b76394b045603bbd0b13dfc37645ca855022e646b8ecbfbe9ad1f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.1,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] - -[[package]] -name = "google-cloud-build" -version = "3.22.0" -description = "Google Cloud Build API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-build-3.22.0.tar.gz", hash = "sha256:72a8330c31108cc47ce510956196a98c158eeecd796004928bf239a2e1ea300e"}, - {file = "google_cloud_build-3.22.0-py2.py3-none-any.whl", hash = "sha256:b2906d59d02066f859a5e3a0ef9437dffc08f11a1f0f9381c92c986c73ab7ae0"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-compute" -version = "1.14.1" -description = "Google Cloud Compute API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-compute-1.14.1.tar.gz", hash = "sha256:acd987647d7c826aa97b4418141c740ead5e8811d3349315f2f89a30c01c7f4b"}, - {file = "google_cloud_compute-1.14.1-py2.py3-none-any.whl", hash = "sha256:b40d6aeeb2c5ce373675c869f1404a1bc19b9763b746ad8f2d91ed1148893d6f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-container" -version = "2.32.0" -description = "Google Cloud Container API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-container-2.32.0.tar.gz", hash = "sha256:694fb8da77963653e1c70fa60928b4a11faf8e1f1580a39025053a3e1bcce6de"}, - {file = "google_cloud_container-2.32.0-py2.py3-none-any.whl", hash = "sha256:a5555c6c19679332086859838fbaee468cb206e5e76365bb5027d5305a2c5bf4"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-core" -version = "2.3.3" -description = "Google Cloud API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, - {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, -] - -[package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)"] - -[[package]] -name = "google-cloud-datacatalog" -version = "3.16.0" -description = "Google Cloud Datacatalog API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-datacatalog-3.16.0.tar.gz", hash = "sha256:703e414396248fa98474bbab9ea962f4c96a3caf1184c903bfc9453d274b0ea2"}, - {file = "google_cloud_datacatalog-3.16.0-py2.py3-none-any.whl", hash = "sha256:06f43501ce57742f394508bca6b0eb14e6dd5aa7e0d51cc0fd9d259295d46c9f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataflow-client" -version = "0.8.6" -description = "Google Cloud Dataflow Client API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataflow-client-0.8.6.tar.gz", hash = "sha256:8753fff57edf640a984015dbd6b3a0f427a779244f9b0ad8981f77d82272798a"}, - {file = "google_cloud_dataflow_client-0.8.6-py2.py3-none-any.whl", hash = "sha256:2d7a6e0586f50421567252283c330dd81cecafa139a12c6021e9da0ca2bf619c"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataform" -version = "0.5.3" -description = "Google Cloud Dataform API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataform-0.5.3.tar.gz", hash = "sha256:89ed0dce20ce34f74cb038d614dd71191451fb70ea60888b6dbfc4265cea7a48"}, - {file = "google_cloud_dataform-0.5.3-py2.py3-none-any.whl", hash = "sha256:aa265043272b0b925fe5e40ea928a4793e1e30f37fff4169a38dfde9d7e32dc9"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataplex" -version = "1.11.0" -description = "Google Cloud Dataplex API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataplex-1.11.0.tar.gz", hash = "sha256:c71b16166e03a04386d2379754912d2ea081ad8fb9dd7547a65d91ee2f2cd4b4"}, - {file = "google_cloud_dataplex-1.11.0-py2.py3-none-any.whl", hash = "sha256:92f616319fbd1fe03b1e9a401930c927edc22795002dd600d42cbe8a3c7cc1dd"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataproc" -version = "5.9.0" -description = "Google Cloud Dataproc API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataproc-5.9.0.tar.gz", hash = "sha256:7e51f9c9005bc5f1bcb23627171de9cd6246a44775118a48cc632861280a76df"}, - {file = "google_cloud_dataproc-5.9.0-py2.py3-none-any.whl", hash = "sha256:be7bdf2efe9af2a54632dd476dc3c13a1bb848bcebc337c1e83d2f961bffc106"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataproc-metastore" -version = "1.13.0" -description = "Google Cloud Dataproc Metastore API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataproc-metastore-1.13.0.tar.gz", hash = "sha256:58066b89d782bcf6985afb29822fb2a1d9a67c20210c87e3a990f69e6354e52c"}, - {file = "google_cloud_dataproc_metastore-1.13.0-py2.py3-none-any.whl", hash = "sha256:76e462a42537077ba4f9b1c4c8ec5d91d4fc4bac6d3f31a81446f50d39ef850f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dlp" -version = "3.12.3" -description = "Google Cloud Dlp API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dlp-3.12.3.tar.gz", hash = "sha256:73880f2a8bfa60049576fb94d85698aa2367d32ac901b76278fe50b75663440b"}, - {file = "google_cloud_dlp-3.12.3-py2.py3-none-any.whl", hash = "sha256:db263305466d0fb22b756043c8a7e1cc2842e3ed6b59fb800b9e9af63a8b0ec8"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-kms" -version = "2.19.2" -description = "Google Cloud Kms API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-kms-2.19.2.tar.gz", hash = "sha256:17a5034592e85ef0031d25bbe5894bdb2d719460855980bfeb68aa4e8ffc12bd"}, - {file = "google_cloud_kms-2.19.2-py2.py3-none-any.whl", hash = "sha256:0cc0b9d16338a46b7fc5beba7e96a88df0f836586eb8650e9acd36eb249b52d9"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-language" -version = "2.11.1" -description = "Google Cloud Language API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-language-2.11.1.tar.gz", hash = "sha256:5f184409f040c0c73057c2616e6bd2e86e45aeb646180d19c189df4aa3d02dba"}, - {file = "google_cloud_language-2.11.1-py2.py3-none-any.whl", hash = "sha256:beb5dd1344a6ed00dd04b1eb05a967e7f83fc1b51471f9bd51f238f63f46f9d4"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-logging" -version = "3.8.0" -description = "Stackdriver Logging API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-logging-3.8.0.tar.gz", hash = "sha256:fdd916e59a84aa8c02e8148d7fdd3b3b623c57b0c1ff71f43297ce8e50fc1eab"}, - {file = "google_cloud_logging-3.8.0-py2.py3-none-any.whl", hash = "sha256:c868b276b021cf5f32b6e8356b6cb3666357d149ad0fd798076043a5ec7ed988"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.33.2,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-appengine-logging = ">=0.1.0,<2.0.0dev" -google-cloud-audit-log = ">=0.1.0,<1.0.0dev" -google-cloud-core = ">=2.0.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-memcache" -version = "1.7.3" -description = "Google Cloud Memcache API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-memcache-1.7.3.tar.gz", hash = "sha256:a73f44ec5bfc398b4c9d94d5e77621c54795bcade19960242dec2cd91b854bcb"}, - {file = "google_cloud_memcache-1.7.3-py2.py3-none-any.whl", hash = "sha256:054e2adde4e99fca6a2e3f9ef733a2159083923c0a41af51b7d5e9d38ca9de12"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-monitoring" -version = "2.18.0" -description = "Google Cloud Monitoring API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-monitoring-2.18.0.tar.gz", hash = "sha256:06cc1d7fb75c5e50b54bcc004941ea4b20a7a9f09ed7e6e753514fd8c436096a"}, - {file = "google_cloud_monitoring-2.18.0-py2.py3-none-any.whl", hash = "sha256:548a1ac0b88c38694e14e1359e89c7eb19b27423906f456bb590f3f0962bb562"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -pandas = ["pandas (>=0.23.2)"] - -[[package]] -name = "google-cloud-orchestration-airflow" -version = "1.10.0" -description = "Google Cloud Orchestration Airflow API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-orchestration-airflow-1.10.0.tar.gz", hash = "sha256:2aa88b4882d3c5dd0f7ecc572d37972d51f2cf69530783c524344d018de0b1bf"}, - {file = "google_cloud_orchestration_airflow-1.10.0-py2.py3-none-any.whl", hash = "sha256:363e22e3b52316eb556899ffb3b1d2122bb4fce3937e4f7cef42202ec1a15e20"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-os-login" -version = "2.11.0" -description = "Google Cloud Os Login API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-os-login-2.11.0.tar.gz", hash = "sha256:e3219d00b75ea44182871681985e9db3f1e38641bb84519dd85d3dbb62b97656"}, - {file = "google_cloud_os_login-2.11.0-py2.py3-none-any.whl", hash = "sha256:1b0679d772fbef486230208a65b3a96d513b599000beca1dc8ff5bde4838607f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-pubsub" -version = "2.19.0" -description = "Google Cloud Pub/Sub API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-pubsub-2.19.0.tar.gz", hash = "sha256:6a98c33f7eb5f7de2ae52efa059b2b5f75b2ccd9f0f11f2edcefdda8d14e425c"}, - {file = "google_cloud_pubsub-2.19.0-py2.py3-none-any.whl", hash = "sha256:0cc444e5b2220a703106668829315a724cfb4304d6772725035993bb2fc81388"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -grpcio = ">=1.51.3,<2.0dev" -grpcio-status = ">=1.33.2" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.3.10)"] - -[[package]] -name = "google-cloud-redis" -version = "2.13.2" -description = "Google Cloud Redis API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-redis-2.13.2.tar.gz", hash = "sha256:5c485730355d96723d64ae637f1b2264f35b57c301ec0ef2c6d30b2f06dca14e"}, - {file = "google_cloud_redis-2.13.2-py2.py3-none-any.whl", hash = "sha256:86378e8ed1c5a1c621eb2731d734436f443dffdbbafc6cd5d24511c94d6c38bc"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-resource-manager" -version = "1.10.4" -description = "Google Cloud Resource Manager API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-resource-manager-1.10.4.tar.gz", hash = "sha256:456b25ddda3d4cd27488a72736bbc3af04d713ae2fe3655c01b66a339d28d679"}, - {file = "google_cloud_resource_manager-1.10.4-py2.py3-none-any.whl", hash = "sha256:2ba56ba8e5280cd425bd63620da48b78da2cd299ece58a71f0f2ce3a32d56f99"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-run" -version = "0.10.0" -description = "Google Cloud Run API client library" +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "google-cloud-run-0.10.0.tar.gz", hash = "sha256:e597dff8da3d6e0f43bdaaa38c80933d8e81e8eac8c1b5e119812af99539d734"}, - {file = "google_cloud_run-0.10.0-py2.py3-none-any.whl", hash = "sha256:3f3d317200e890c20e744e692d69b241ca4a25ec161f02babbc77c1df68c7a4d"}, + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] [[package]] -name = "google-cloud-secret-manager" -version = "2.16.4" -description = "Google Cloud Secret Manager API client library" +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-secret-manager-2.16.4.tar.gz", hash = "sha256:371dc72f9145af323e8a813c8e50380e6ac4bd6a5dbcd42dcf3162d8f37e5080"}, - {file = "google_cloud_secret_manager-2.16.4-py2.py3-none-any.whl", hash = "sha256:5031c45dd84dc584d91ee0baae2bbd5df6710efe0c42719ee370a3ab62aaf618"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +smmap = ">=3.0.1,<6" [[package]] -name = "google-cloud-spanner" -version = "3.40.1" -description = "Google Cloud Spanner API client library" +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-spanner-3.40.1.tar.gz", hash = "sha256:616b07c86cdae6c78bad27b8ab39d8ce7a273511f2b91fe260f170d926653c2e"}, - {file = "google_cloud_spanner-3.40.1-py2.py3-none-any.whl", hash = "sha256:0c5825bb5956df83ee1d732e1851467be97bbc4502ccd91ed0c5e7fb4b3f4ccb"}, + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.1,<3.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -sqlparse = ">=0.4.4" +gitdb = ">=4.0.1,<5" [package.extras] -libcst = ["libcst (>=0.2.5)"] -tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0,<0.23dev)", "opentelemetry-sdk (>=1.1.0)"] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] -name = "google-cloud-speech" -version = "2.21.1" -description = "Google Cloud Speech API client library" +name = "google" +version = "3.0.0" +description = "Python bindings to the Google search engine." optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "google-cloud-speech-2.21.1.tar.gz", hash = "sha256:4935375eaaf18656e53e2631770b9d579e80cb4ec1b3d46dd23346f789aa016a"}, - {file = "google_cloud_speech-2.21.1-py2.py3-none-any.whl", hash = "sha256:36089039640c5ab79cefd32af7a482043a67144d393ec752c6b57c1fdc02a95d"}, + {file = "google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935"}, + {file = "google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +beautifulsoup4 = "*" [[package]] -name = "google-cloud-storage" -version = "2.13.0" -description = "Google Cloud Storage API client library" +name = "google-api-core" +version = "2.22.0" +description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.13.0.tar.gz", hash = "sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7"}, - {file = "google_cloud_storage-2.13.0-py2.py3-none-any.whl", hash = "sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d"}, + {file = "google_api_core-2.22.0-py3-none-any.whl", hash = "sha256:a6652b6bd51303902494998626653671703c420f6f4c88cfd3f50ed723e9d021"}, + {file = "google_api_core-2.22.0.tar.gz", hash = "sha256:26f8d76b96477db42b55fd02a33aae4a42ec8b86b98b94969b7333a2c828bf35"}, ] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=2.23.3,<3.0dev" -google-cloud-core = ">=2.3.0,<3.0dev" -google-crc32c = ">=1.0,<2.0dev" -google-resumable-media = ">=2.6.0" -requests = ">=2.18.0,<3.0.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -protobuf = ["protobuf (<5.0.0dev)"] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] -name = "google-cloud-storage-transfer" -version = "1.9.2" -description = "Google Cloud Storage Transfer API client library" +name = "google-auth" +version = "2.35.0" +description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-transfer-1.9.2.tar.gz", hash = "sha256:c36800cf425e23cca5bed51320dce6eec313b68db8dd4677be6e3b49c891207d"}, - {file = "google_cloud_storage_transfer-1.9.2-py2.py3-none-any.whl", hash = "sha256:d30b519b57eee0d337da6d9051442337625128e950e6b487b4fd63f4942f7cb7"}, + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography", "pyopenssl"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] -name = "google-cloud-tasks" -version = "2.14.2" -description = "Google Cloud Tasks API client library" +name = "google-auth-oauthlib" +version = "0.8.0" +description = "Google Authentication Library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "google-cloud-tasks-2.14.2.tar.gz", hash = "sha256:3efb280e7a635f57860a06a346131c117042e820ad483afd256800fae1b4d701"}, - {file = "google_cloud_tasks-2.14.2-py2.py3-none-any.whl", hash = "sha256:801a671c6dbd2269179037e93490f87e2df59ddfcb59551128bab27e7dd09f94"}, + {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, + {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] [[package]] -name = "google-cloud-texttospeech" -version = "2.14.2" -description = "Google Cloud Texttospeech API client library" +name = "google-cloud-bigquery" +version = "3.26.0" +description = "Google BigQuery API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.14.2.tar.gz", hash = "sha256:a23738366988faf4d265200f57c5de4312efa3d14bb434b92a6e541713f5d906"}, - {file = "google_cloud_texttospeech-2.14.2-py2.py3-none-any.whl", hash = "sha256:3a4e7ca71a1d3f90de77170a013b37f18775858dac01c80793752b8c160d6555"}, + {file = "google_cloud_bigquery-3.26.0-py2.py3-none-any.whl", hash = "sha256:e0e9ad28afa67a18696e624cbccab284bf2c0a3f6eeb9eeb0426c69b943793a8"}, + {file = "google_cloud_bigquery-3.26.0.tar.gz", hash = "sha256:edbdc788beea659e04c0af7fe4dcd6d9155344b98951a0d5055bd2f15da4ba23"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = {version = ">=2.11.1,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-core = ">=2.4.1,<3.0.0dev" +google-resumable-media = ">=2.0.0,<3.0dev" +packaging = ">=20.0.0" +python-dateutil = ">=2.7.3,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" + +[package.extras] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "bigquery-magics (>=0.1.0)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "importlib-metadata (>=1.0.0)", "ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "proto-plus (>=1.22.3,<2.0.0dev)", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bigquery-v2 = ["proto-plus (>=1.22.3,<2.0.0dev)", "protobuf (>=3.20.2,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["bigquery-magics (>=0.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] -name = "google-cloud-translate" -version = "3.12.1" -description = "Google Cloud Translate API client library" +name = "google-cloud-core" +version = "2.4.1" +description = "Google Cloud API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-translate-3.12.1.tar.gz", hash = "sha256:661cb8879aa3c63a2f725a3ea68f90199bd354c95ca169cc2e83a5105987d29e"}, - {file = "google_cloud_translate-3.12.1-py2.py3-none-any.whl", hash = "sha256:2a0f6aa398a64d7836d0f2880dfd023be0de05f8b688ac537825391014fc114a"}, + {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, + {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.4,<3.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] [[package]] -name = "google-cloud-videointelligence" -version = "2.11.4" -description = "Google Cloud Videointelligence API client library" +name = "google-cloud-dataproc" +version = "5.15.0" +description = "Google Cloud Dataproc API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-videointelligence-2.11.4.tar.gz", hash = "sha256:07ace299a63f5b3d4441375634853b55ce8f90c62c6a24f8a47eb054149f6f99"}, - {file = "google_cloud_videointelligence-2.11.4-py2.py3-none-any.whl", hash = "sha256:4d62f7b074f6f1eae4efd8697b5a93fb59b3b22f9934e383b4f6fbed69f49eb6"}, + {file = "google_cloud_dataproc-5.15.0-py2.py3-none-any.whl", hash = "sha256:14dfcf327fa1c2ede3601fbbc1d559ace43682481aef42a182fb158af876c083"}, + {file = "google_cloud_dataproc-5.15.0.tar.gz", hash = "sha256:010e335368d0f47963643e323be03916d3e8556b772acbe50215fd54f156f91f"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] -name = "google-cloud-vision" -version = "3.4.5" -description = "Google Cloud Vision API client library" +name = "google-cloud-secret-manager" +version = "2.21.0" +description = "Google Cloud Secret Manager API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-vision-3.4.5.tar.gz", hash = "sha256:0df8241ab277199b919ca3837a7de85059363fea0e3d660060870be7ceffc047"}, - {file = "google_cloud_vision-3.4.5-py2.py3-none-any.whl", hash = "sha256:4e67f5985ecbb8f7252fe47b8e26f1ac083af4c45626bae23869cf097ba9292e"}, + {file = "google_cloud_secret_manager-2.21.0-py2.py3-none-any.whl", hash = "sha256:b7fed5c2f3be5e10d94053ea3a7c6a7c5813d38da39c678ef6c1137d6e25a310"}, + {file = "google_cloud_secret_manager-2.21.0.tar.gz", hash = "sha256:d1ae84ecf98cfc319c9a3f1012355cebd19317b662cc9dff1a2c36234580807b"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] -name = "google-cloud-workflows" -version = "1.12.1" -description = "Google Cloud Workflows API client library" +name = "google-cloud-storage" +version = "2.18.2" +description = "Google Cloud Storage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-workflows-1.12.1.tar.gz", hash = "sha256:fad66cece6279f7be4fd919c1cc50f2a4a7ebf8bba97feaba75b9addece0b64b"}, - {file = "google_cloud_workflows-1.12.1-py2.py3-none-any.whl", hash = "sha256:1c24dc2b7eb4d953677407a0826e2680fc03fe6dc81b75a15d38d5a452aa467f"}, + {file = "google_cloud_storage-2.18.2-py2.py3-none-any.whl", hash = "sha256:97a4d45c368b7d401ed48c4fdfe86e1e1cb96401c9e199e419d289e2c0370166"}, + {file = "google_cloud_storage-2.18.2.tar.gz", hash = "sha256:aaf7acd70cdad9f274d29332673fcab98708d0e1f4dceb5a5356aaef06af4d99"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.7.2" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<6.0.0dev)"] +tracing = ["opentelemetry-api (>=1.1.0)"] [[package]] name = "google-crc32c" -version = "1.5.0" +version = "1.6.0" description = "A python wrapper of the C library 'Google CRC32C'" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, + {file = "google_crc32c-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5bcc90b34df28a4b38653c36bb5ada35671ad105c99cfe915fb5bed7ad6924aa"}, + {file = "google_crc32c-1.6.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d9e9913f7bd69e093b81da4535ce27af842e7bf371cde42d1ae9e9bd382dc0e9"}, + {file = "google_crc32c-1.6.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a184243544811e4a50d345838a883733461e67578959ac59964e43cca2c791e7"}, + {file = "google_crc32c-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236c87a46cdf06384f614e9092b82c05f81bd34b80248021f729396a78e55d7e"}, + {file = "google_crc32c-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebab974b1687509e5c973b5c4b8b146683e101e102e17a86bd196ecaa4d099fc"}, + {file = "google_crc32c-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:50cf2a96da226dcbff8671233ecf37bf6e95de98b2a2ebadbfdf455e6d05df42"}, + {file = "google_crc32c-1.6.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f7a1fc29803712f80879b0806cb83ab24ce62fc8daf0569f2204a0cfd7f68ed4"}, + {file = "google_crc32c-1.6.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:40b05ab32a5067525670880eb5d169529089a26fe35dce8891127aeddc1950e8"}, + {file = "google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d"}, + {file = "google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f"}, + {file = "google_crc32c-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:bb8b3c75bd157010459b15222c3fd30577042a7060e29d42dabce449c087f2b3"}, + {file = "google_crc32c-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ed767bf4ba90104c1216b68111613f0d5926fb3780660ea1198fc469af410e9d"}, + {file = "google_crc32c-1.6.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:62f6d4a29fea082ac4a3c9be5e415218255cf11684ac6ef5488eea0c9132689b"}, + {file = "google_crc32c-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c87d98c7c4a69066fd31701c4e10d178a648c2cac3452e62c6b24dc51f9fcc00"}, + {file = "google_crc32c-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd5e7d2445d1a958c266bfa5d04c39932dc54093fa391736dbfdb0f1929c1fb3"}, + {file = "google_crc32c-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:7aec8e88a3583515f9e0957fe4f5f6d8d4997e36d0f61624e70469771584c760"}, + {file = "google_crc32c-1.6.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e2806553238cd076f0a55bddab37a532b53580e699ed8e5606d0de1f856b5205"}, + {file = "google_crc32c-1.6.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bb0966e1c50d0ef5bc743312cc730b533491d60585a9a08f897274e57c3f70e0"}, + {file = "google_crc32c-1.6.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:386122eeaaa76951a8196310432c5b0ef3b53590ef4c317ec7588ec554fec5d2"}, + {file = "google_crc32c-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2952396dc604544ea7476b33fe87faedc24d666fb0c2d5ac971a2b9576ab871"}, + {file = "google_crc32c-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35834855408429cecf495cac67ccbab802de269e948e27478b1e47dfb6465e57"}, + {file = "google_crc32c-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:d8797406499f28b5ef791f339594b0b5fdedf54e203b5066675c406ba69d705c"}, + {file = "google_crc32c-1.6.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48abd62ca76a2cbe034542ed1b6aee851b6f28aaca4e6551b5599b6f3ef175cc"}, + {file = "google_crc32c-1.6.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e311c64008f1f1379158158bb3f0c8d72635b9eb4f9545f8cf990c5668e59d"}, + {file = "google_crc32c-1.6.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05e2d8c9a2f853ff116db9706b4a27350587f341eda835f46db3c0a8c8ce2f24"}, + {file = "google_crc32c-1.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ca8145b060679ec9176e6de4f89b07363d6805bd4760631ef254905503598d"}, + {file = "google_crc32c-1.6.0.tar.gz", hash = "sha256:6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc"}, ] [package.extras] testing = ["pytest"] -[[package]] -name = "google-re2" -version = "1.1" -description = "RE2 Python bindings" -optional = false -python-versions = "~=3.8" -files = [ - {file = "google-re2-1.1.tar.gz", hash = "sha256:d3a9467ee52b46ac77ca928f6d0cbeaccfd92f03ca0f0f65b9df6a95184f3a1c"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:874d2e36dfa506b03d4f9c4aef1701a65304f4004c96c7edac7d8aea08fe193e"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b66eb84850afdce09aabca40bcd6f2a0e96178a1b4990d555678edb1f59bf255"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c461640a07db26dc2b51f43de607b7520e7debaf4f6a000f796a3c0196ca52af"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7f9ba69eaee6e7a9f5ddfb919bf1a866af14a18b26a179e3fb1a6fe3d0cbf349"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f95cf16739cc3ea63728366881221b119f2322b4b739b7da6522d45a68792cea"}, - {file = "google_re2-1.1-1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:9fb56a41250191298e6a2859b0fdea1e83330c9870fe8d84e5836c506ae46e96"}, - {file = "google_re2-1.1-1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb22ea995564d87baf4a4bfbb3ca024be913683a710f4f0dc9c94dc663afab20"}, - {file = "google_re2-1.1-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19b3f0bfbb2a2ca58ed0aaa9356d07a5c0921383a6dbeca086b2b74472f5ee08"}, - {file = "google_re2-1.1-1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34fd7f97b84af7453cf05b25adfe2491ba3cef1ca548ac2907efa63d3510954d"}, - {file = "google_re2-1.1-1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e029664192d8d30f7c977706183ef483e82ca239302272df74e01d2e22897ca"}, - {file = "google_re2-1.1-1-cp310-cp310-win32.whl", hash = "sha256:41a8f222f9839d059d37efd28e4deec203502d7e39c3759d83d6a33deadf1d2e"}, - {file = "google_re2-1.1-1-cp310-cp310-win_amd64.whl", hash = "sha256:6141d569fdf72aa693f040ba05c469036587395af07ff419b9a3c009d6ffefd3"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2d03f6aaf22788ba13a770f0d183b8eebe55545bcbb6e4c41dcccac7ded014d"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:a98f15fd9c31bf80d368698447191a2e9703880b305dbf34d9a63ce634b8a557"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:42128916cc2966623832aabbd224c88e862d1c531d6bc49ab141f565e6321a90"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:6e27986a166903ad7000635f6faed8ab5072d687f822ac9f692c40b2470aebcf"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:5e9edcd743a830d0c0b2729201e42ab86fceef8f4086df65563f482e4544359e"}, - {file = "google_re2-1.1-1-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:d33145bbfd32e916f1c911cd9225be5364a36c3959742a0cc4dfc0692d6a2a5e"}, - {file = "google_re2-1.1-1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b27cc2544b69a357ab2a749dc0c13a1b9055198c56f4c2c3b0f61d693f8e203"}, - {file = "google_re2-1.1-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cdf8982b6def987e95b37984d0c1c878de32635dd78acde3273f730b69708c9"}, - {file = "google_re2-1.1-1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71ac661a7365e134741fe5542f13d7ce1e6187446b96ddee4c8b7d153fc8f05a"}, - {file = "google_re2-1.1-1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35a902ba31a71a3e9e114e44473624d9aa9f9b85ec981bfa91671aefe0ef1a6c"}, - {file = "google_re2-1.1-1-cp311-cp311-win32.whl", hash = "sha256:9469f26b485da2784c658e687a766c72e1a17b1e63b3ed24b5f64c3d19fbae3d"}, - {file = "google_re2-1.1-1-cp311-cp311-win_amd64.whl", hash = "sha256:07dd0780240ee431781119b46c3bbf76f5cef24a2cbb542f6a08c643e0a68d98"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9857dc4d69b8025057c8129e98406a24d51bdaf1b96e481dbba7e69e0ec85104"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:a6eaaa5f200022eb0bdded5949c91454fc96e1edd6f9e9a96dd1dc32c821c00e"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a32bb2afe128d90b8edc20d4f7d297f7e2753206eba92937a57e5280736eac74"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4f2754616c61b76ab4e5a4f39892a52a00897203b859c5abd7e3c630dd883cda"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:b110f3d657e8f67a43a699d327ce47095b80180ea1118e2de44cb5c7002503d9"}, - {file = "google_re2-1.1-1-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:fd62ba2853eef65e249a9c4437a9ecac568222062bc956f0c61a3d1151a6271b"}, - {file = "google_re2-1.1-1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23b50eb74dc3e1d480b04b987c61242df5dade50d08bc16e25eb3582b83fca80"}, - {file = "google_re2-1.1-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1bde89855dd5ab0811187d21eec149975510c80e865c771c883524a452445e7"}, - {file = "google_re2-1.1-1-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10c6cddc720151a509beb98ab310fa0cc8bcb265f83518ebf831de2c9ff73af0"}, - {file = "google_re2-1.1-1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bea09c5e8401ec50b8f211bc820ec2f0ca5e744ac67431a1b39bdacbd266553"}, - {file = "google_re2-1.1-1-cp38-cp38-win32.whl", hash = "sha256:ffa51b118037518bcdf63c7649d0b4be7071982b83f48ee3bbabf24a9cb48f8a"}, - {file = "google_re2-1.1-1-cp38-cp38-win_amd64.whl", hash = "sha256:3b47715b6d43c9351957eb5092ad0fa625d04106d81f34cb8a726c53395ad474"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:998f31bf7efbc9bb603d0c356c1c77e5331f689c71783df8e21e67bb025fc66a"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0b5f0eaab859d3ba5f462c82bf37ab56e9d37e19b40b5898c731dbe4213a85f7"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f6d591d9c4cbc7142b729ddcc3f654d059d8ebc3bc95891198808a4785a6b4d8"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:3c325c2eae197b423330a04ab62e2e1cf942676cd5560907db4d63e23ce0648a"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:1e019e8f57955806ee843254ce454249b58800a6e872b2c8e9df2ef3459de0d5"}, - {file = "google_re2-1.1-1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:58ebbcc7ad2b639768a6bca586357291660ea40dfac83039208e5055c357513b"}, - {file = "google_re2-1.1-1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:723f8553e7fc022294071f14fb7dfc7958c365dc7d4a71d4938ccd2df8c6eca4"}, - {file = "google_re2-1.1-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d81512b08e6787fc8ef29fea365d3fdbf957553a625550e1d96c36877ae30355"}, - {file = "google_re2-1.1-1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c58601b155651cc572a23ee2860788c77581aad85d3567a55b89b0674702f34d"}, - {file = "google_re2-1.1-1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c6c9f64b9724ec38da8e514f404ac64e9a6a5e8b1d7031c2dadd05c1f4c16fd"}, - {file = "google_re2-1.1-1-cp39-cp39-win32.whl", hash = "sha256:d1b751b9ab9f8e2ab2a36d72b909281ce65f328c9115a1685acae1a2d1afd7a4"}, - {file = "google_re2-1.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:ac775c75cec7069351d201da4e0fb0cae4c1c5ebecd08fa34e1be89740c1d80b"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5eaefe4705b75ca5f78178a50104b689e9282f868e12f119b26b4cffc0c7ee6e"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e35f2c8aabfaaa4ce6420b3cae86c0c29042b1b4f9937254347e9b985694a171"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:35fd189cbaaaa39c9a6a8a00164c8d9c709bacd0c231c694936879609beff516"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:60475d222cebd066c80414831c8a42aa2449aab252084102ee05440896586e6a"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:871cb85b9b0e1784c983b5c148156b3c5314cb29ca70432dff0d163c5c08d7e5"}, - {file = "google_re2-1.1-2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:94f4e66e34bdb8de91ec6cdf20ba4fa9fea1dfdcfb77ff1f59700d01a0243664"}, - {file = "google_re2-1.1-2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1563577e2b720d267c4cffacc0f6a2b5c8480ea966ebdb1844fbea6602c7496f"}, - {file = "google_re2-1.1-2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49b7964532a801b96062d78c0222d155873968f823a546a3dbe63d73f25bb56f"}, - {file = "google_re2-1.1-2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2362fd70eb639a75fd0187d28b4ba7b20b3088833d8ad7ffd8693d0ba159e1c2"}, - {file = "google_re2-1.1-2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86b80719636a4e21391e20a9adf18173ee6ae2ec956726fe2ff587417b5e8ba6"}, - {file = "google_re2-1.1-2-cp310-cp310-win32.whl", hash = "sha256:5456fba09df951fe8d1714474ed1ecda102a68ddffab0113e6c117d2e64e6f2b"}, - {file = "google_re2-1.1-2-cp310-cp310-win_amd64.whl", hash = "sha256:2ac6936a3a60d8d9de9563e90227b3aea27068f597274ca192c999a12d8baa8f"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5a87b436028ec9b0f02fe19d4cbc19ef30441085cdfcdf1cce8fbe5c4bd5e9a"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:fc0d4163de9ed2155a77e7a2d59d94c348a6bbab3cff88922fab9e0d3d24faec"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:48b12d953bc796736e7831d67b36892fb6419a4cc44cb16521fe291e594bfe23"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:62c780c927cff98c1538439f0ff616f48a9b2e8837c676f53170d8ae5b9e83cb"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:04b2aefd768aa4edeef8b273327806c9cb0b82e90ff52eacf5d11003ac7a0db2"}, - {file = "google_re2-1.1-2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:9c90175992346519ee7546d9af9a64541c05b6b70346b0ddc54a48aa0d3b6554"}, - {file = "google_re2-1.1-2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22ad9ad9d125249d6386a2e80efb9de7af8260b703b6be7fa0ab069c1cf56ced"}, - {file = "google_re2-1.1-2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70971f6ffe5254e476e71d449089917f50ebf9cf60f9cec80975ab1693777e2"}, - {file = "google_re2-1.1-2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f267499529e64a4abed24c588f355ebe4700189d434d84a7367725f5a186e48d"}, - {file = "google_re2-1.1-2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1"}, - {file = "google_re2-1.1-2-cp311-cp311-win32.whl", hash = "sha256:a42c733036e8f242ee4e5f0e27153ad4ca44ced9e4ce82f3972938ddee528db0"}, - {file = "google_re2-1.1-2-cp311-cp311-win_amd64.whl", hash = "sha256:64f8eed4ca96905d99b5286b3d14b5ca4f6a025ff3c1351626a7df2f93ad1ddd"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5541efcca5b5faf7e0d882334a04fa479bad4e7433f94870f46272eec0672c4a"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92309af35b6eb2d3b3dc57045cdd83a76370958ab3e0edd2cc4638f6d23f5b32"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:197cd9bcaba96d18c5bf84d0c32fca7a26c234ea83b1d3083366f4392cb99f78"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:1b896f171d29b541256cf26e10dccc9103ac1894683914ed88828ca6facf8dca"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:e022d3239b945014e916ca7120fee659b246ec26c301f9e0542f1a19b38a8744"}, - {file = "google_re2-1.1-2-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:2c73f8a9440873b68bee1198094377501065e85aaf6fcc0d2512c7589ffa06ca"}, - {file = "google_re2-1.1-2-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:901d86555bd7725506d651afaba7d71cd4abd13260aed6cfd7c641a45f76d4f6"}, - {file = "google_re2-1.1-2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce4710ff636701cfb56eb91c19b775d53b03749a23b7d2a5071bbbf4342a9067"}, - {file = "google_re2-1.1-2-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76a20e5ebdf5bc5d430530197e42a2eeb562f729d3a3fb51f39168283d676e66"}, - {file = "google_re2-1.1-2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77c9f4d4bb1c8de9d2642d3c4b8b615858ba764df025b3b4f1310266f8def269"}, - {file = "google_re2-1.1-2-cp38-cp38-win32.whl", hash = "sha256:94bd60785bf37ef130a1613738e3c39465a67eae3f3be44bb918540d39b68da3"}, - {file = "google_re2-1.1-2-cp38-cp38-win_amd64.whl", hash = "sha256:59efeb77c0dcdbe37794c61f29c5b1f34bc06e8ec309a111ccdd29d380644d70"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:221e38c27e1dd9ccb8e911e9c7aed6439f68ce81e7bb74001076830b0d6e931d"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:d9145879e6c2e1b814445300b31f88a675e1f06c57564670d95a1442e8370c27"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c8a12f0740e2a52826bdbf95569a4b0abdf413b4012fa71e94ad25dd4715c6e5"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:9c9998f71466f4db7bda752aa7c348b2881ff688e361108fe500caad1d8b9cb2"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:0c39f69b702005963a3d3bf78743e1733ad73efd7e6e8465d76e3009e4694ceb"}, - {file = "google_re2-1.1-2-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:6d0ce762dee8d6617d0b1788a9653e805e83a23046c441d0ea65f1e27bf84114"}, - {file = "google_re2-1.1-2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ecf3619d98c9b4a7844ab52552ad32597cdbc9a5bdbc7e3435391c653600d1e2"}, - {file = "google_re2-1.1-2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a1426a8cbd1fa004974574708d496005bd379310c4b1c7012be4bc75efde7a8"}, - {file = "google_re2-1.1-2-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1a30626ba48b4070f3eab272d860ef1952e710b088792c4d68dddb155be6bfc"}, - {file = "google_re2-1.1-2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde"}, - {file = "google_re2-1.1-2-cp39-cp39-win32.whl", hash = "sha256:32ecf995a252c0548404c1065ba4b36f1e524f1f4a86b6367a1a6c3da3801e30"}, - {file = "google_re2-1.1-2-cp39-cp39-win_amd64.whl", hash = "sha256:e7865410f3b112a3609739283ec3f4f6f25aae827ff59c6bfdf806fd394d753e"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3b21f83f0a201009c56f06fcc7294a33555ede97130e8a91b3f4cae01aed1d73"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b38194b91354a38db1f86f25d09cdc6ac85d63aee4c67b43da3048ce637adf45"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e7da3da8d6b5a18d6c3b61b11cc5b66b8564eaedce99d2312b15b6487730fc76"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:aeca656fb10d8638f245331aabab59c9e7e051ca974b366dd79e6a9efb12e401"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:2069d6dc94f5fa14a159bf99cad2f11e9c0f8ec3b7f44a4dde9e59afe5d1c786"}, - {file = "google_re2-1.1-3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:2319a39305a4931cb5251451f2582713418a19bef2af7adf9e2a7a0edd939b99"}, - {file = "google_re2-1.1-3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb98fc131699756c6d86246f670a5e1c1cc1ba85413c425ad344cb30479b246c"}, - {file = "google_re2-1.1-3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6e038986d8ffe4e269f8532f03009f229d1f6018d4ac0dabc8aff876338f6e0"}, - {file = "google_re2-1.1-3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8618343ee658310e0f53bf586fab7409de43ce82bf8d9f7eb119536adc9783fd"}, - {file = "google_re2-1.1-3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8140ca861cfe00602319cefe2c7b8737b379eb07fb328b51dc44584f47a2718"}, - {file = "google_re2-1.1-3-cp310-cp310-win32.whl", hash = "sha256:41f439c5c54e8a3a0a1fa2dbd1e809d3f643f862df7b16dd790f36a1238a272e"}, - {file = "google_re2-1.1-3-cp310-cp310-win_amd64.whl", hash = "sha256:fe20e97a33176d96d3e4b5b401de35182b9505823abea51425ec011f53ef5e56"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c39ff52b1765db039f690ee5b7b23919d8535aae94db7996079fbde0098c4d7"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5420be674fd164041639ba4c825450f3d4bd635572acdde16b3dcd697f8aa3ef"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ff53881cf1ce040f102a42d39db93c3f835f522337ae9c79839a842f26d97733"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:8d04600b0b53523118df2e413a71417c408f20dee640bf07dfab601c96a18a77"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:c4835d4849faa34a7fa1074098d81c420ed6c0707a3772482b02ce14f2a7c007"}, - {file = "google_re2-1.1-3-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:3309a9b81251d35fee15974d0ae0581a9a375266deeafdc3a3ac0d172a742357"}, - {file = "google_re2-1.1-3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2b51cafee7e0bc72d0a4a454547bd8f257cde412ac9f1a2dc46a203b5e42cf4"}, - {file = "google_re2-1.1-3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:83f5f1cb52f832c2297d271ee8c56cf5e9053448162e5d2223d513f729bad908"}, - {file = "google_re2-1.1-3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55865a1ace92be3f7953b2e2b38b901d8074a367aa491daee43260a53a7fc6f0"}, - {file = "google_re2-1.1-3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cec2167dd142e583e98c783bd0d28b8cf5a9cdbe1f7407ba4163fe3ccb613cb9"}, - {file = "google_re2-1.1-3-cp311-cp311-win32.whl", hash = "sha256:a0bc1fe96849e4eb8b726d0bba493f5b989372243b32fe20729cace02e5a214d"}, - {file = "google_re2-1.1-3-cp311-cp311-win_amd64.whl", hash = "sha256:e6310a156db96fc5957cb007dd2feb18476898654530683897469447df73a7cd"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e63cd10ea006088b320e8c5d308da1f6c87aa95138a71c60dd7ca1c8e91927e"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:12b566830a334178733a85e416b1e0507dbc0ceb322827616fe51ef56c5154f1"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:442e18c9d46b225c1496919c16eafe8f8d9bb4091b00b4d3440da03c55bbf4ed"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c54c00263a9c39b2dacd93e9636319af51e3cf885c080b9680a9631708326460"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:15a3caeeb327bc22e0c9f95eb76890fec8874cacccd2b01ff5c080ab4819bbec"}, - {file = "google_re2-1.1-3-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:59ec0d2cced77f715d41f6eafd901f6b15c11e28ba25fe0effdc1de554d78e75"}, - {file = "google_re2-1.1-3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:185bf0e3441aed3840590f8e42f916e2920d235eb14df2cbc2049526803d3e71"}, - {file = "google_re2-1.1-3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:586d3f2014eea5be14d8de53374d9b79fa99689160e00efa64b5fe93af326087"}, - {file = "google_re2-1.1-3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc2575082de4ffd234d9607f3ae67ca22b15a1a88793240e2045f3b3a36a5795"}, - {file = "google_re2-1.1-3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59c5ad438eddb3630def394456091284d7bbc5b89351987f94f3792d296d1f96"}, - {file = "google_re2-1.1-3-cp312-cp312-win32.whl", hash = "sha256:5b9878c53f2bf16f75bf71d4ddd57f6611351408d5821040e91c53ebdf82c373"}, - {file = "google_re2-1.1-3-cp312-cp312-win_amd64.whl", hash = "sha256:4fdecfeb213110d0a85bad335a8e7cdb59fea7de81a4fe659233f487171980f9"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2dd87bacab32b709c28d0145fe75a956b6a39e28f0726d867375dba5721c76c1"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:55d24c61fe35dddc1bb484593a57c9f60f9e66d7f31f091ef9608ed0b6dde79f"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a0cf1180d908622df648c26b0cd09281f92129805ccc56a39227fdbfeab95cb4"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:09586f07f3f88d432265c75976da1c619ab7192cd7ebdf53f4ae0776c19e4b56"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:539f1b053402203576e919a06749198da4ae415931ee28948a1898131ae932ce"}, - {file = "google_re2-1.1-3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:abf0bcb5365b0e27a5a23f3da403dffdbbac2c0e3a3f1535a8b10cc121b5d5fb"}, - {file = "google_re2-1.1-3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19c83e5bbed7958213eeac3aa71c506525ce54faf03e07d0b96cd0a764890511"}, - {file = "google_re2-1.1-3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3348e77330ff672dc44ec01894fa5d93c409a532b6d688feac55e714e9059920"}, - {file = "google_re2-1.1-3-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06b63edb57c5ce5a13eabfd71155e346b9477dc8906dec7c580d4f70c16a7e0d"}, - {file = "google_re2-1.1-3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12fe57ba2914092b83338d61d8def9ebd5a2bd0fd8679eceb5d4c2748105d5c0"}, - {file = "google_re2-1.1-3-cp38-cp38-win32.whl", hash = "sha256:80796e08d24e606e675019fe8de4eb5c94bb765be13c384f2695247d54a6df75"}, - {file = "google_re2-1.1-3-cp38-cp38-win_amd64.whl", hash = "sha256:3c2257dedfe7cc5deb6791e563af9e071a9d414dad89e37ac7ad22f91be171a9"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43a0cd77c87c894f28969ac622f94b2e6d1571261dfdd785026848a25cfdc9b9"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1038990b77fd66f279bd66a0832b67435ea925e15bb59eafc7b60fdec812b616"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fb5dda6875d18dd45f0f24ebced6d1f7388867c8fb04a235d1deab7ea479ce38"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bb1d164965c6d57a351b421d2f77c051403766a8b75aaa602324ee2451fff77f"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:a072ebfa495051d07ffecbf6ce21eb84793568d5c3c678c00ed8ff6b8066ab31"}, - {file = "google_re2-1.1-3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:4eb66c8398c8a510adc97978d944b3b29c91181237218841ea1a91dc39ec0e54"}, - {file = "google_re2-1.1-3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f7c8b57b1f559553248d1757b7fa5b2e0cc845666738d155dff1987c2618264e"}, - {file = "google_re2-1.1-3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9162f6aa4f25453c682eb176f21b8e2f40205be9f667e98a54b3e1ff10d6ee75"}, - {file = "google_re2-1.1-3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d65ddf67fd7bf94705626871d463057d3d9a3538d41022f95b9d8f01df36e1"}, - {file = "google_re2-1.1-3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d140c7b9395b4d1e654127aa1c99bcc603ed01000b7bc7e28c52562f1894ec12"}, - {file = "google_re2-1.1-3-cp39-cp39-win32.whl", hash = "sha256:80c5fc200f64b2d903eeb07b8d6cefc620a872a0240c7caaa9aca05b20f5568f"}, - {file = "google_re2-1.1-3-cp39-cp39-win_amd64.whl", hash = "sha256:9eb6dbcee9b5dc4069bbc0634f2eb039ca524a14bed5868fdf6560aaafcbca06"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0db114d7e1aa96dbcea452a40136d7d747d60cbb61394965774688ef59cccd4e"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:82133958e003a1344e5b7a791b9a9dd7560b5c8f96936dbe16f294604524a633"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:9e74fd441d1f3d917d3303e319f61b82cdbd96b9a5ba919377a6eef1504a1e2b"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:734a2e7a4541c57253b5ebee24f3f3366ba3658bcad01da25fb623c78723471a"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:d88d5eecbc908abe16132456fae13690d0508f3ac5777f320ef95cb6cab9a961"}, - {file = "google_re2-1.1-4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:b91db80b171ecec435a07977a227757dd487356701a32f556fa6fca5d0a40522"}, - {file = "google_re2-1.1-4-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b23129887a64bb9948af14c84705273ed1a40054e99433b4acccab4dcf6a226"}, - {file = "google_re2-1.1-4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5dc1a0cc7cd19261dcaf76763e2499305dbb7e51dc69555167cdb8af98782698"}, - {file = "google_re2-1.1-4-cp310-cp310-win32.whl", hash = "sha256:3b2ab1e2420b5dd9743a2d6bc61b64e5f708563702a75b6db86637837eaeaf2f"}, - {file = "google_re2-1.1-4-cp310-cp310-win_amd64.whl", hash = "sha256:92efca1a7ef83b6df012d432a1cbc71d10ff42200640c0f9a5ff5b343a48e633"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:854818fd4ce79787aca5ba459d6e5abe4ca9be2c684a5b06a7f1757452ca3708"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:4ceef51174b6f653b6659a8fdaa9c38960c5228b44b25be2a3bcd8566827554f"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:ee49087c3db7e6f5238105ab5299c09e9b77516fe8cfb0a37e5f1e813d76ecb8"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:dc2312854bdc01410acc5d935f1906a49cb1f28980341c20a68797ad89d8e178"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0dc0d2e42296fa84a3cb3e1bd667c6969389cd5cdf0786e6b1f911ae2d75375b"}, - {file = "google_re2-1.1-4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6bf04ced98453b035f84320f348f67578024f44d2997498def149054eb860ae8"}, - {file = "google_re2-1.1-4-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d6b6ef11dc4ab322fa66c2f3561925f2b5372a879c3ed764d20e939e2fd3e5f"}, - {file = "google_re2-1.1-4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0dcde6646fa9a97fd3692b3f6ae7daf7f3277d7500b6c253badeefa11db8956a"}, - {file = "google_re2-1.1-4-cp311-cp311-win32.whl", hash = "sha256:5f4f0229deb057348893574d5b0a96d055abebac6debf29d95b0c0e26524c9f6"}, - {file = "google_re2-1.1-4-cp311-cp311-win_amd64.whl", hash = "sha256:4713ddbe48a18875270b36a462b0eada5e84d6826f8df7edd328d8706b6f9d07"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:40a698300b8faddbb325662973f839489c89b960087060bd389c376828978a04"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:103d2d7ac92ba23911a151fd1fc7035cbf6dc92a7f6aea92270ebceb5cd5acd3"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:51fb7182bccab05e8258a2b6a63dda1a6b4a9e8dfb9b03ec50e50c49c2827dd4"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:65383022abd63d7b620221eba7935132b53244b8b463d8fdce498c93cf58b7b7"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396281fc68a9337157b3ffcd9392c6b7fcb8aab43e5bdab496262a81d56a4ecc"}, - {file = "google_re2-1.1-4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8198adcfcff1c680e052044124621730fc48d08005f90a75487f5651f1ebfce2"}, - {file = "google_re2-1.1-4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81f7bff07c448aec4db9ca453d2126ece8710dbd9278b8bb09642045d3402a96"}, - {file = "google_re2-1.1-4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7dacf730fd7d6ec71b11d6404b0b26e230814bfc8e9bb0d3f13bec9b5531f8d"}, - {file = "google_re2-1.1-4-cp312-cp312-win32.whl", hash = "sha256:8c764f62f4b1d89d1ef264853b6dd9fee14a89e9b86a81bc2157fe3531425eb4"}, - {file = "google_re2-1.1-4-cp312-cp312-win_amd64.whl", hash = "sha256:0be2666df4bc5381a5d693585f9bbfefb0bfd3c07530d7e403f181f5de47254a"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:5cb1b63a0bfd8dd65d39d2f3b2e5ae0a06ce4b2ce5818a1d1fc78a786a252673"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:e41751ce6b67a95230edd0772226dc94c2952a2909674cd69df9804ed0125307"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:b998cfa2d50bf4c063e777c999a7e8645ec7e5d7baf43ad71b1e2e10bb0300c3"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:226ca3b0c2e970f3fc82001ac89e845ecc7a4bb7c68583e7a76cda70b61251a7"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:9adec1f734ebad7c72e56c85f205a281d8fe9bf6583bc21020157d3f2812ce89"}, - {file = "google_re2-1.1-4-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:9c34f3c64ba566af967d29e11299560e6fdfacd8ca695120a7062b6ed993b179"}, - {file = "google_re2-1.1-4-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b85385fe293838e0d0b6e19e6c48ba8c6f739ea92ce2e23b718afe7b343363"}, - {file = "google_re2-1.1-4-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4694daa8a8987cfb568847aa872f9990e930c91a68c892ead876411d4b9012c3"}, - {file = "google_re2-1.1-4-cp38-cp38-win32.whl", hash = "sha256:5e671e9be1668187e2995aac378de574fa40df70bb6f04657af4d30a79274ce0"}, - {file = "google_re2-1.1-4-cp38-cp38-win_amd64.whl", hash = "sha256:f66c164d6049a8299f6dfcfa52d1580576b4b9724d6fcdad2f36f8f5da9304b6"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:25cb17ae0993a48c70596f3a3ef5d659638106401cc8193f51c0d7961b3b3eb7"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:5f101f86d14ca94ca4dcf63cceaa73d351f2be2481fcaa29d9e68eeab0dc2a88"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:4e82591e85bf262a6d74cff152867e05fc97867c68ba81d6836ff8b0e7e62365"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:1f61c09b93ffd34b1e2557e5a9565039f935407a5786dbad46f64f1a484166e6"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:12b390ad8c7e74bab068732f774e75e0680dade6469b249a721f3432f90edfc3"}, - {file = "google_re2-1.1-4-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:1284343eb31c2e82ed2d8159f33ba6842238a56782c881b07845a6d85613b055"}, - {file = "google_re2-1.1-4-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c7b38e0daf2c06e4d3163f4c732ab3ad2521aecfed6605b69e4482c612da303"}, - {file = "google_re2-1.1-4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f4d4f0823e8b2f6952a145295b1ff25245ce9bb136aff6fe86452e507d4c1dd"}, - {file = "google_re2-1.1-4-cp39-cp39-win32.whl", hash = "sha256:1afae56b2a07bb48cfcfefaa15ed85bae26a68f5dc7f9e128e6e6ea36914e847"}, - {file = "google_re2-1.1-4-cp39-cp39-win_amd64.whl", hash = "sha256:aa7d6d05911ab9c8adbf3c225a7a120ab50fd2784ac48f2f0d140c0b7afc2b55"}, -] - [[package]] name = "google-resumable-media" -version = "2.6.0" +version = "2.7.2" description = "Utilities for Google Media Downloads and Resumable Uploads" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.7" files = [ - {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, - {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, + {file = "google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa"}, + {file = "google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0"}, ] [package.dependencies] @@ -3498,117 +1741,31 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.61.0" +version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, - {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, + {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, + {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, ] [package.dependencies] grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] -[[package]] -name = "graphviz" -version = "0.20.1" -description = "Simple Python interface for Graphviz" -optional = false -python-versions = ">=3.7" -files = [ - {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, - {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, -] - -[package.extras] -dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] -docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] - -[[package]] -name = "greenlet" -version = "3.0.1" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, - {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, - {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, - {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, - {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, - {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, - {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, - {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, - {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, - {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, - {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, - {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, - {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, - {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, - {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, -] - -[package.extras] -docs = ["Sphinx"] -test = ["objgraph", "psutil"] - [[package]] name = "griffe" -version = "0.38.0" +version = "1.5.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "griffe-0.38.0-py3-none-any.whl", hash = "sha256:6a5bc457320e8e199006aa5fbb03e162f5e21abe31aa6221f7a5c37ea0724c71"}, - {file = "griffe-0.38.0.tar.gz", hash = "sha256:9b97487b583042b543d1e28196caee638ecd766c8c4c98135071806cb5333ac2"}, + {file = "griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860"}, + {file = "griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b"}, ] [package.dependencies] @@ -3616,99 +1773,86 @@ colorama = ">=0.4" [[package]] name = "grpc-google-iam-v1" -version = "0.12.6" +version = "0.13.1" description = "IAM API client library" optional = false python-versions = ">=3.7" files = [ - {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, - {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, + {file = "grpc-google-iam-v1-0.13.1.tar.gz", hash = "sha256:3ff4b2fd9d990965e410965253c0da6f66205d5a8291c4c31c6ebecca18a9001"}, + {file = "grpc_google_iam_v1-0.13.1-py2.py3-none-any.whl", hash = "sha256:c3e86151a981811f30d5e7330f271cee53e73bb87755e88cc3b6f0c7b5fe374e"}, ] [package.dependencies] googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} grpcio = ">=1.44.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] name = "grpcio" -version = "1.59.2" +version = "1.67.1" description = "HTTP/2-based RPC framework" optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, - {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, - {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, - {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, - {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, - {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, - {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, - {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, - {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, - {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, - {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, - {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, - {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, - {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, - {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, - {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, - {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, - {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, - {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, - {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, - {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, - {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, - {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, - {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.59.2)"] - -[[package]] -name = "grpcio-gcp" -version = "0.2.2" -description = "gRPC extensions for Google Cloud Platform" -optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "grpcio-gcp-0.2.2.tar.gz", hash = "sha256:e292605effc7da39b7a8734c719afb12ec4b5362add3528d8afad3aa3aa9057c"}, - {file = "grpcio_gcp-0.2.2-py2.py3-none-any.whl", hash = "sha256:1ef8e8531eab11356a3eb4c5b84e79e0d923d6782d19e1b1a45e1cabe4e783d7"}, -] - -[package.dependencies] -grpcio = ">=1.12.0" + {file = "grpcio-1.67.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:8b0341d66a57f8a3119b77ab32207072be60c9bf79760fa609c5609f2deb1f3f"}, + {file = "grpcio-1.67.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:f5a27dddefe0e2357d3e617b9079b4bfdc91341a91565111a21ed6ebbc51b22d"}, + {file = "grpcio-1.67.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:43112046864317498a33bdc4797ae6a268c36345a910de9b9c17159d8346602f"}, + {file = "grpcio-1.67.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9b929f13677b10f63124c1a410994a401cdd85214ad83ab67cc077fc7e480f0"}, + {file = "grpcio-1.67.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d1797a8a3845437d327145959a2c0c47c05947c9eef5ff1a4c80e499dcc6fa"}, + {file = "grpcio-1.67.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0489063974d1452436139501bf6b180f63d4977223ee87488fe36858c5725292"}, + {file = "grpcio-1.67.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9fd042de4a82e3e7aca44008ee2fb5da01b3e5adb316348c21980f7f58adc311"}, + {file = "grpcio-1.67.1-cp310-cp310-win32.whl", hash = "sha256:638354e698fd0c6c76b04540a850bf1db27b4d2515a19fcd5cf645c48d3eb1ed"}, + {file = "grpcio-1.67.1-cp310-cp310-win_amd64.whl", hash = "sha256:608d87d1bdabf9e2868b12338cd38a79969eaf920c89d698ead08f48de9c0f9e"}, + {file = "grpcio-1.67.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:7818c0454027ae3384235a65210bbf5464bd715450e30a3d40385453a85a70cb"}, + {file = "grpcio-1.67.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ea33986b70f83844cd00814cee4451055cd8cab36f00ac64a31f5bb09b31919e"}, + {file = "grpcio-1.67.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c7a01337407dd89005527623a4a72c5c8e2894d22bead0895306b23c6695698f"}, + {file = "grpcio-1.67.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b866f73224b0634f4312a4674c1be21b2b4afa73cb20953cbbb73a6b36c3cc"}, + {file = "grpcio-1.67.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fff78ba10d4250bfc07a01bd6254a6d87dc67f9627adece85c0b2ed754fa96"}, + {file = "grpcio-1.67.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8a23cbcc5bb11ea7dc6163078be36c065db68d915c24f5faa4f872c573bb400f"}, + {file = "grpcio-1.67.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a65b503d008f066e994f34f456e0647e5ceb34cfcec5ad180b1b44020ad4970"}, + {file = "grpcio-1.67.1-cp311-cp311-win32.whl", hash = "sha256:e29ca27bec8e163dca0c98084040edec3bc49afd10f18b412f483cc68c712744"}, + {file = "grpcio-1.67.1-cp311-cp311-win_amd64.whl", hash = "sha256:786a5b18544622bfb1e25cc08402bd44ea83edfb04b93798d85dca4d1a0b5be5"}, + {file = "grpcio-1.67.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:267d1745894200e4c604958da5f856da6293f063327cb049a51fe67348e4f953"}, + {file = "grpcio-1.67.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:85f69fdc1d28ce7cff8de3f9c67db2b0ca9ba4449644488c1e0303c146135ddb"}, + {file = "grpcio-1.67.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f26b0b547eb8d00e195274cdfc63ce64c8fc2d3e2d00b12bf468ece41a0423a0"}, + {file = "grpcio-1.67.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4422581cdc628f77302270ff839a44f4c24fdc57887dc2a45b7e53d8fc2376af"}, + {file = "grpcio-1.67.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7616d2ded471231c701489190379e0c311ee0a6c756f3c03e6a62b95a7146e"}, + {file = "grpcio-1.67.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8a00efecde9d6fcc3ab00c13f816313c040a28450e5e25739c24f432fc6d3c75"}, + {file = "grpcio-1.67.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:699e964923b70f3101393710793289e42845791ea07565654ada0969522d0a38"}, + {file = "grpcio-1.67.1-cp312-cp312-win32.whl", hash = "sha256:4e7b904484a634a0fff132958dabdb10d63e0927398273917da3ee103e8d1f78"}, + {file = "grpcio-1.67.1-cp312-cp312-win_amd64.whl", hash = "sha256:5721e66a594a6c4204458004852719b38f3d5522082be9061d6510b455c90afc"}, + {file = "grpcio-1.67.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa0162e56fd10a5547fac8774c4899fc3e18c1aa4a4759d0ce2cd00d3696ea6b"}, + {file = "grpcio-1.67.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:beee96c8c0b1a75d556fe57b92b58b4347c77a65781ee2ac749d550f2a365dc1"}, + {file = "grpcio-1.67.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:a93deda571a1bf94ec1f6fcda2872dad3ae538700d94dc283c672a3b508ba3af"}, + {file = "grpcio-1.67.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6f255980afef598a9e64a24efce87b625e3e3c80a45162d111a461a9f92955"}, + {file = "grpcio-1.67.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e838cad2176ebd5d4a8bb03955138d6589ce9e2ce5d51c3ada34396dbd2dba8"}, + {file = "grpcio-1.67.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a6703916c43b1d468d0756c8077b12017a9fcb6a1ef13faf49e67d20d7ebda62"}, + {file = "grpcio-1.67.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:917e8d8994eed1d86b907ba2a61b9f0aef27a2155bca6cbb322430fc7135b7bb"}, + {file = "grpcio-1.67.1-cp313-cp313-win32.whl", hash = "sha256:e279330bef1744040db8fc432becc8a727b84f456ab62b744d3fdb83f327e121"}, + {file = "grpcio-1.67.1-cp313-cp313-win_amd64.whl", hash = "sha256:fa0c739ad8b1996bd24823950e3cb5152ae91fca1c09cc791190bf1627ffefba"}, + {file = "grpcio-1.67.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:178f5db771c4f9a9facb2ab37a434c46cb9be1a75e820f187ee3d1e7805c4f65"}, + {file = "grpcio-1.67.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f3e49c738396e93b7ba9016e153eb09e0778e776df6090c1b8c91877cc1c426"}, + {file = "grpcio-1.67.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:24e8a26dbfc5274d7474c27759b54486b8de23c709d76695237515bc8b5baeab"}, + {file = "grpcio-1.67.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b6c16489326d79ead41689c4b84bc40d522c9a7617219f4ad94bc7f448c5085"}, + {file = "grpcio-1.67.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e6a4dcf5af7bbc36fd9f81c9f372e8ae580870a9e4b6eafe948cd334b81cf3"}, + {file = "grpcio-1.67.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:95b5f2b857856ed78d72da93cd7d09b6db8ef30102e5e7fe0961fe4d9f7d48e8"}, + {file = "grpcio-1.67.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b49359977c6ec9f5d0573ea4e0071ad278ef905aa74e420acc73fd28ce39e9ce"}, + {file = "grpcio-1.67.1-cp38-cp38-win32.whl", hash = "sha256:f5b76ff64aaac53fede0cc93abf57894ab2a7362986ba22243d06218b93efe46"}, + {file = "grpcio-1.67.1-cp38-cp38-win_amd64.whl", hash = "sha256:804c6457c3cd3ec04fe6006c739579b8d35c86ae3298ffca8de57b493524b771"}, + {file = "grpcio-1.67.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:a25bdea92b13ff4d7790962190bf6bf5c4639876e01c0f3dda70fc2769616335"}, + {file = "grpcio-1.67.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cdc491ae35a13535fd9196acb5afe1af37c8237df2e54427be3eecda3653127e"}, + {file = "grpcio-1.67.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:85f862069b86a305497e74d0dc43c02de3d1d184fc2c180993aa8aa86fbd19b8"}, + {file = "grpcio-1.67.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec74ef02010186185de82cc594058a3ccd8d86821842bbac9873fd4a2cf8be8d"}, + {file = "grpcio-1.67.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01f616a964e540638af5130469451cf580ba8c7329f45ca998ab66e0c7dcdb04"}, + {file = "grpcio-1.67.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:299b3d8c4f790c6bcca485f9963b4846dd92cf6f1b65d3697145d005c80f9fe8"}, + {file = "grpcio-1.67.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:60336bff760fbb47d7e86165408126f1dded184448e9a4c892189eb7c9d3f90f"}, + {file = "grpcio-1.67.1-cp39-cp39-win32.whl", hash = "sha256:5ed601c4c6008429e3d247ddb367fe8c7259c355757448d7c1ef7bd4a6739e8e"}, + {file = "grpcio-1.67.1-cp39-cp39-win_amd64.whl", hash = "sha256:5db70d32d6703b89912af16d6d45d78406374a8b8ef0d28140351dd0ec610e98"}, + {file = "grpcio-1.67.1.tar.gz", hash = "sha256:3dc2ed4cabea4dc14d5e708c2b426205956077cc5de419b4d4079315017e9732"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.67.1)"] [[package]] name = "grpcio-status" @@ -3726,37 +1870,6 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.48.2" protobuf = ">=3.12.0" -[[package]] -name = "gunicorn" -version = "21.2.0" -description = "WSGI HTTP Server for UNIX" -optional = false -python-versions = ">=3.5" -files = [ - {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, - {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -eventlet = ["eventlet (>=0.24.1)"] -gevent = ["gevent (>=1.4.0)"] -setproctitle = ["setproctitle"] -tornado = ["tornado (>=0.2)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "hail" version = "0.2.127" @@ -3805,62 +1918,38 @@ typer = ">=0.9.0,<1" uvloop = {version = ">=0.19.0,<1", markers = "sys_platform != \"win32\""} [[package]] -name = "httpcore" -version = "0.18.0" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-0.18.0-py3-none-any.whl", hash = "sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced"}, - {file = "httpcore-0.18.0.tar.gz", hash = "sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = "==1.*" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "httplib2" -version = "0.22.0" -description = "A comprehensive HTTP client library." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] - -[package.dependencies] -pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} - -[[package]] -name = "httpx" -version = "0.25.0" -description = "The next generation HTTP client." +name = "huggingface-hub" +version = "0.26.2" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false -python-versions = ">=3.8" +python-versions = ">=3.8.0" files = [ - {file = "httpx-0.25.0-py3-none-any.whl", hash = "sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100"}, - {file = "httpx-0.25.0.tar.gz", hash = "sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875"}, + {file = "huggingface_hub-0.26.2-py3-none-any.whl", hash = "sha256:98c2a5a8e786c7b2cb6fdeb2740893cba4d53e312572ed3d8afafda65b128c46"}, + {file = "huggingface_hub-0.26.2.tar.gz", hash = "sha256:b100d853465d965733964d123939ba287da60a547087783ddff8a323f340332b"}, ] [package.dependencies] -certifi = "*" -httpcore = ">=0.18.0,<0.19.0" -idna = "*" -sniffio = "*" +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" [package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp"] +quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.5.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "humanize" @@ -3894,13 +1983,13 @@ packaging = "*" [[package]] name = "identify" -version = "2.5.31" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.31-py2.py3-none-any.whl", hash = "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d"}, - {file = "identify-2.5.31.tar.gz", hash = "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -3908,59 +1997,17 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.8.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] - -[[package]] -name = "importlib-resources" -version = "6.1.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, - {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] - -[[package]] -name = "inflection" -version = "0.5.1" -description = "A port of Ruby on Rails inflector to Python" -optional = false -python-versions = ">=3.5" -files = [ - {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, - {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, -] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "iniconfig" @@ -3975,13 +2022,13 @@ files = [ [[package]] name = "interrogate" -version = "1.5.0" +version = "1.7.0" description = "Interrogate a codebase for docstring coverage." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "interrogate-1.5.0-py3-none-any.whl", hash = "sha256:a4ccc5cbd727c74acc98dee6f5e79ef264c0bcfa66b68d4e123069b2af89091a"}, - {file = "interrogate-1.5.0.tar.gz", hash = "sha256:b6f325f0aa84ac3ac6779d8708264d366102226c5af7d69058cecffcff7a6d6c"}, + {file = "interrogate-1.7.0-py3-none-any.whl", hash = "sha256:b13ff4dd8403369670e2efe684066de9fcb868ad9d7f2b4095d8112142dc9d12"}, + {file = "interrogate-1.7.0.tar.gz", hash = "sha256:a320d6ec644dfd887cc58247a345054fc4d9f981100c45184470068f4b3719b0"}, ] [package.dependencies] @@ -3990,23 +2037,23 @@ click = ">=7.1" colorama = "*" py = "*" tabulate = "*" -toml = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["cairosvg", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "sphinx", "sphinx-autobuild", "wheel"] +dev = ["cairosvg", "coverage[toml]", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "sphinx", "sphinx-autobuild", "wheel"] docs = ["sphinx", "sphinx-autobuild"] png = ["cairosvg"] -tests = ["pytest", "pytest-cov", "pytest-mock"] +tests = ["coverage[toml]", "pytest", "pytest-cov", "pytest-mock"] [[package]] name = "ipykernel" -version = "6.29.0" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"}, - {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -4029,17 +2076,17 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.2)", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.21.0" +version = "8.29.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.21.0-py3-none-any.whl", hash = "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5"}, - {file = "ipython-8.21.0.tar.gz", hash = "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73"}, + {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, + {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, ] [package.dependencies] @@ -4048,39 +2095,38 @@ decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" -traitlets = ">=5" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.23)", "pandas", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "pickleshare", "pytest (<8)", "pytest-asyncio (<0.22)", "testpath", "trio"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] [[package]] name = "isodate" -version = "0.6.1" +version = "0.7.2" description = "An ISO 8601 date/time/duration parser and formatter" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, ] -[package.dependencies] -six = "*" - [[package]] name = "isort" version = "5.13.2" @@ -4095,17 +2141,6 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] - [[package]] name = "janus" version = "1.0.0" @@ -4141,13 +2176,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -4169,83 +2204,38 @@ files = [ [[package]] name = "joblib" -version = "1.3.2" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" -files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, -] - -[[package]] -name = "jproperties" -version = "2.1.1" -description = "Java Property file parser and writer for Python" -optional = false -python-versions = "*" -files = [ - {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, - {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, -] - -[package.dependencies] -six = ">=1.13,<2.0" - -[[package]] -name = "json-merge-patch" -version = "0.2" -description = "JSON Merge Patch library (https://tools.ietf.org/html/rfc7386)" -optional = false -python-versions = "*" -files = [ - {file = "json-merge-patch-0.2.tar.gz", hash = "sha256:09898b6d427c08754e2a97c709cf2dfd7e28bd10c5683a538914975eab778d39"}, -] - -[[package]] -name = "jsonschema" -version = "4.19.2" -description = "An implementation of JSON Schema validation for Python" -optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.19.2-py3-none-any.whl", hash = "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc"}, - {file = "jsonschema-4.19.2.tar.gz", hash = "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - [[package]] -name = "jsonschema-specifications" -version = "2023.7.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +name = "jproperties" +version = "2.1.2" +description = "Java Property file parser and writer for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=2.7" files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, + {file = "jproperties-2.1.2-py2.py3-none-any.whl", hash = "sha256:4108e868353a9f4a12bb86a92df5462d0e18d00119169533972ce473029be79a"}, + {file = "jproperties-2.1.2.tar.gz", hash = "sha256:036fcd52c10a8a1c21e6fa2a1c292c93892e759b76490acc4809213a36ddc329"}, ] [package.dependencies] -referencing = ">=0.28.0" +six = ">=1.13,<2.0" [[package]] name = "jupyter-client" -version = "8.5.0" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.5.0-py3-none-any.whl", hash = "sha256:c3877aac7257ec68d79b5c622ce986bd2a992ca42f6ddc9b4dd1da50e89f7028"}, - {file = "jupyter_client-8.5.0.tar.gz", hash = "sha256:e8754066510ce456358df363f97eae64b50860f30dc1fe8c6771440db3be9a63"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -4257,17 +2247,17 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.5.0" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -4277,419 +2267,477 @@ traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - -[[package]] -name = "limits" -version = "3.6.0" -description = "Rate limiting utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "limits-3.6.0-py3-none-any.whl", hash = "sha256:32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7"}, - {file = "limits-3.6.0.tar.gz", hash = "sha256:57a9c69fd37ad1e4fa3886dff8d035227e1f6af87f47e9118627e72cf1ced3bf"}, -] - -[package.dependencies] -deprecated = ">=1.2" -importlib-resources = ">=1.3" -packaging = ">=21,<24" -typing-extensions = "*" - -[package.extras] -all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] -async-etcd = ["aetcd"] -async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] -async-mongodb = ["motor (>=3,<4)"] -async-redis = ["coredis (>=3.4.0,<5)"] -etcd = ["etcd3"] -memcached = ["pymemcache (>3,<5.0.0)"] -mongodb = ["pymongo (>4.1,<5)"] -redis = ["redis (>3,!=4.5.2,!=4.5.3,<6.0.0)"] -rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] - -[[package]] -name = "linkify-it-py" -version = "2.0.2" -description = "Links recognition library with FULL unicode support." -optional = false -python-versions = ">=3.7" -files = [ - {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, - {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, -] - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] -doc = ["myst-parser", "sphinx", "sphinx-book-theme"] -test = ["coverage", "pytest", "pytest-cov"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] -name = "lockfile" -version = "0.12.2" -description = "Platform-independent file locking module" +name = "kiwisolver" +version = "1.4.7" +description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] - -[[package]] -name = "looker-sdk" -version = "23.16.0" -description = "Looker REST API" + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "llvmlite" +version = "0.43.0" +description = "lightweight wrapper around basic LLVM functionality" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "looker_sdk-23.16.0-py3-none-any.whl", hash = "sha256:c5a680d4641a7725be6920630aa7ece0430e2a92abe1f396e8c63ed74dcd43d5"}, - {file = "looker_sdk-23.16.0.tar.gz", hash = "sha256:4daa7a9812a92fdd1e0094cb0afb0db2e7bb54e10492b1345b67705dbe5089d5"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, + {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, + {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, + {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, + {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, + {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, ] -[package.dependencies] -attrs = {version = ">=20.1.0", markers = "python_version >= \"3.7\""} -cattrs = {version = ">=1.3", markers = "python_version >= \"3.7\""} -requests = ">=2.22" -typing-extensions = ">=4.1.1" - [[package]] name = "lxml" -version = "5.1.0" +version = "5.3.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, - {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, - {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, - {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, - {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, - {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, - {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, - {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, - {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, - {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, - {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, - {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, - {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, - {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, - {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, - {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, - {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, - {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.7)"] - -[[package]] -name = "mako" -version = "1.2.4" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, -] - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] +source = ["Cython (>=3.0.11)"] [[package]] name = "markdown" -version = "3.5.1" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, - {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.extras] docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "markupsafe" -version = "2.1.3" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] - -[[package]] -name = "marshmallow" -version = "3.20.1" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.3" +description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, - {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, -] - -[package.dependencies] -packaging = ">=17.0" - -[package.extras] -dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "marshmallow-oneofschema" -version = "3.0.1" -description = "marshmallow multiplexing schema" -optional = false -python-versions = ">=3.6" -files = [ - {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, - {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, -] - -[package.dependencies] -marshmallow = ">=3.0.0,<4.0.0" - -[package.extras] -dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] -lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] -tests = ["mock", "pytest"] - -[[package]] -name = "marshmallow-sqlalchemy" -version = "0.26.1" -description = "SQLAlchemy integration with the marshmallow (de)serialization library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "marshmallow-sqlalchemy-0.26.1.tar.gz", hash = "sha256:d8525f74de51554b5c8491effe036f60629a426229befa33ff614c8569a16a73"}, - {file = "marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl", hash = "sha256:ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276"}, -] - -[package.dependencies] -marshmallow = ">=3.0.0" -SQLAlchemy = ">=1.2.0" - -[package.extras] -dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.0,<3.0)", "pytest", "pytest-lazy-fixture", "tox"] -docs = ["alabaster (==0.7.12)", "sphinx (==4.0.2)", "sphinx-issues (==1.2.0)"] -lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.0,<3.0)"] -tests = ["pytest", "pytest-lazy-fixture"] + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, + {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, + {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, + {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, + {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, + {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, + {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, + {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, + {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, + {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, + {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.0.1" +numpy = ">=1.20,<2" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" +setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -4706,36 +2754,6 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdit-py-plugins" -version = "0.4.0" -description = "Collection of plugins for markdown-it-py" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, - {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<4.0.0" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["myst-parser", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - [[package]] name = "mergedeep" version = "1.3.4" @@ -4749,13 +2767,13 @@ files = [ [[package]] name = "mkdocs" -version = "1.5.3" +version = "1.6.1" description = "Project documentation with Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, - {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, ] [package.dependencies] @@ -4763,19 +2781,19 @@ click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" jinja2 = ">=2.11.1" -markdown = ">=3.2.1" +markdown = ">=3.3.6" markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" packaging = ">=20.5" pathspec = ">=0.11.1" -platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autolinks-plugin" @@ -4793,28 +2811,29 @@ mkdocs = ">=1.2.3" [[package]] name = "mkdocs-autorefs" -version = "0.5.0" +version = "1.2.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, - {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, + {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, + {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, ] [package.dependencies] Markdown = ">=3.3" +markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] name = "mkdocs-awesome-pages-plugin" -version = "2.9.2" +version = "2.9.3" description = "An MkDocs plugin that simplifies configuring page titles and their order" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8.1" files = [ - {file = "mkdocs_awesome_pages_plugin-2.9.2-py3-none-any.whl", hash = "sha256:9c795587695bd1ee85a8b7e43293005418df5a8b9ef296a3e628be427b693b4d"}, - {file = "mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af"}, + {file = "mkdocs_awesome_pages_plugin-2.9.3-py3-none-any.whl", hash = "sha256:1ba433d4e7edaf8661b15b93267f78f78e2e06ca590fc0e651ea36b191d64ae4"}, + {file = "mkdocs_awesome_pages_plugin-2.9.3.tar.gz", hash = "sha256:bdf6369871f41bb17f09c3cfb573367732dfcceb5673d7a2c5c76ac2567b242f"}, ] [package.dependencies] @@ -4835,15 +2854,31 @@ files = [ [package.dependencies] mkdocs = "*" +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + [[package]] name = "mkdocs-git-committers-plugin-2" -version = "2.2.3" +version = "2.4.1" description = "An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date" optional = false -python-versions = ">=3.8,<4" +python-versions = "<4,>=3.8" files = [ - {file = "mkdocs-git-committers-plugin-2-2.2.3.tar.gz", hash = "sha256:e0dddef4e3e321d97bcb83123fd963a839d9f9fa801c3125efeb6544bd8b247c"}, - {file = "mkdocs_git_committers_plugin_2-2.2.3-py3-none-any.whl", hash = "sha256:0f20d61a9315174f30d5a0266d4a457d3d88909ca5c5bd7d0e0dd2e1841f2af0"}, + {file = "mkdocs_git_committers_plugin_2-2.4.1-py3-none-any.whl", hash = "sha256:ec9c1d81445606c471337d1c4a1782c643b7377077b545279dc18b86b7362c6d"}, + {file = "mkdocs_git_committers_plugin_2-2.4.1.tar.gz", hash = "sha256:ea1f80a79cedc42289e0b8e973276df04fb94f56e0ae3efc5385fb28547cf5cb"}, ] [package.dependencies] @@ -4853,13 +2888,13 @@ requests = "*" [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.2.2" +version = "1.3.0" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "mkdocs-git-revision-date-localized-plugin-1.2.2.tar.gz", hash = "sha256:0c43a9aac1fa69df99a823f833cc223bac9967b60d5261a857761c7c6e3b30de"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.2.2-py3-none-any.whl", hash = "sha256:85c7fe9ab06e7a63c4e522c26fee8b51d357cb8cbe605064501ad80f4f31cb94"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.3.0.tar.gz", hash = "sha256:439e2f14582204050a664c258861c325064d97cdc848c541e48bb034a6c4d0cb"}, ] [package.dependencies] @@ -4868,15 +2903,20 @@ GitPython = "*" mkdocs = ">=1.0" pytz = "*" +[package.extras] +all = ["GitPython", "babel (>=2.7.0)", "click", "codecov", "mkdocs (>=1.0)", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov", "pytz"] +base = ["GitPython", "babel (>=2.7.0)", "mkdocs (>=1.0)", "pytz"] +dev = ["click", "codecov", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov"] + [[package]] name = "mkdocs-material" -version = "9.5.3" +version = "9.5.42" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.3-py3-none-any.whl", hash = "sha256:76c93a8525cceb0b395b9cedab3428bf518cf6439adef2b940f1c1574b775d89"}, - {file = "mkdocs_material-9.5.3.tar.gz", hash = "sha256:5899219f422f0a6de784232d9d40374416302ffae3c160cacc72969fcc1ee372"}, + {file = "mkdocs_material-9.5.42-py3-none-any.whl", hash = "sha256:452a7c5d21284b373f36b981a2cbebfff59263feebeede1bc28652e9c5bbe316"}, + {file = "mkdocs_material-9.5.42.tar.gz", hash = "sha256:92779b5e9b5934540c574c11647131d217dc540dce72b05feeda088c8eb1b8f2"}, ] [package.dependencies] @@ -4884,7 +2924,7 @@ babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" -mkdocs = ">=1.5.3,<1.6.0" +mkdocs = ">=1.6,<2.0" mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" @@ -4893,30 +2933,30 @@ regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] -git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] -imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] name = "mkdocs-material-extensions" -version = "1.3" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, - {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] name = "mkdocs-section-index" -version = "0.3.8" +version = "0.3.9" description = "MkDocs plugin to allow clickable sections that lead to an index page" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, - {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, + {file = "mkdocs_section_index-0.3.9-py3-none-any.whl", hash = "sha256:5e5eb288e8d7984d36c11ead5533f376fdf23498f44e903929d72845b24dfe34"}, + {file = "mkdocs_section_index-0.3.9.tar.gz", hash = "sha256:b66128d19108beceb08b226ee1ba0981840d14baf8a652b6c59e650f3f92e4f8"}, ] [package.dependencies] @@ -4924,21 +2964,23 @@ mkdocs = ">=1.2" [[package]] name = "mkdocstrings" -version = "0.23.0" +version = "0.26.2" description = "Automatic documentation from sources, for MkDocs." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, - {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, + {file = "mkdocstrings-0.26.2-py3-none-any.whl", hash = "sha256:1248f3228464f3b8d1a15bd91249ce1701fe3104ac517a5f167a0e01ca850ba5"}, + {file = "mkdocstrings-0.26.2.tar.gz", hash = "sha256:34a8b50f1e6cfd29546c6c09fbe02154adfb0b361bb758834bf56aa284ba876e"}, ] [package.dependencies] +click = ">=7.0" Jinja2 = ">=2.11.1" -Markdown = ">=3.3" +Markdown = ">=3.6" MarkupSafe = ">=1.1" -mkdocs = ">=1.2" -mkdocs-autorefs = ">=0.3.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=1.2" +platformdirs = ">=2.2" pymdown-extensions = ">=6.3" [package.extras] @@ -4948,55 +2990,53 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.8.0" +version = "1.12.2" description = "A Python handler for mkdocstrings." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, - {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, + {file = "mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a"}, + {file = "mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3"}, ] [package.dependencies] -griffe = ">=0.37" -mkdocstrings = ">=0.20" +griffe = ">=0.49" +mkdocs-autorefs = ">=1.2" +mkdocstrings = ">=0.26" [[package]] name = "msal" -version = "1.24.1" -description = "The Microsoft Authentication Library (MSAL) for Python library" +version = "1.31.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false -python-versions = ">=2.7" +python-versions = ">=3.7" files = [ - {file = "msal-1.24.1-py2.py3-none-any.whl", hash = "sha256:ce4320688f95c301ee74a4d0e9dbcfe029a63663a8cc61756f40d0d0d36574ad"}, - {file = "msal-1.24.1.tar.gz", hash = "sha256:aa0972884b3c6fdec53d9a0bd15c12e5bd7b71ac1b66d746f54d128709f3f8f8"}, + {file = "msal-1.31.0-py3-none-any.whl", hash = "sha256:96bc37cff82ebe4b160d5fc0f1196f6ca8b50e274ecd0ec5bf69c438514086e7"}, + {file = "msal-1.31.0.tar.gz", hash = "sha256:2c4f189cf9cc8f00c80045f66d39b7c0f3ed45873fd3d1f2af9f22db2e12ff4b"}, ] [package.dependencies] -cryptography = ">=0.6,<44" +cryptography = ">=2.5,<46" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.14)"] +broker = ["pymsalruntime (>=0.14,<0.18)", "pymsalruntime (>=0.17,<0.18)"] [[package]] name = "msal-extensions" -version = "1.0.0" +version = "1.2.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "msal-extensions-1.0.0.tar.gz", hash = "sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354"}, - {file = "msal_extensions-1.0.0-py2.py3-none-any.whl", hash = "sha256:91e3db9620b822d0ed2b4d1850056a0f133cba04455e62f11612e40f5502f2ee"}, + {file = "msal_extensions-1.2.0-py3-none-any.whl", hash = "sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d"}, + {file = "msal_extensions-1.2.0.tar.gz", hash = "sha256:6f41b320bfd2933d631a215c91ca0dd3e67d84bd1a2f50ce917d5874ec646bef"}, ] [package.dependencies] -msal = ">=0.4.1,<2.0.0" -portalocker = [ - {version = ">=1.0,<3", markers = "python_version >= \"3.5\" and platform_system != \"Windows\""}, - {version = ">=1.6,<3", markers = "python_version >= \"3.5\" and platform_system == \"Windows\""}, -] +msal = ">=1.29,<2" +portalocker = ">=1.4,<3" [[package]] name = "msrest" @@ -5021,130 +3061,157 @@ async = ["aiodns", "aiohttp (>=3.0)"] [[package]] name = "multidict" -version = "6.0.4" +version = "6.1.0" description = "multidict implementation" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy" -version = "1.8.0" +version = "1.13.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -5154,396 +3221,308 @@ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "natsort" -version = "8.4.0" -description = "Simple yet flexible natural sorting in Python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, - {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, -] - -[package.extras] -fast = ["fastnumbers (>=2.0.0)"] -icu = ["PyICU (>=1.0.0)"] - -[[package]] -name = "nest-asyncio" -version = "1.5.8" -description = "Patch asyncio to allow nested event loops" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, -] - -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "numpy" -version = "1.26.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "omegaconf" -version = "2.3.0" -description = "A flexible configuration library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, - {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, -] - -[package.dependencies] -antlr4-python3-runtime = "==4.9.*" -PyYAML = ">=5.1.0" - -[[package]] -name = "opentelemetry-api" -version = "1.20.0" -description = "OpenTelemetry Python API" -optional = false -python-versions = ">=3.7" -files = [ - {file = "opentelemetry_api-1.20.0-py3-none-any.whl", hash = "sha256:982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5"}, - {file = "opentelemetry_api-1.20.0.tar.gz", hash = "sha256:06abe351db7572f8afdd0fb889ce53f3c992dbf6f6262507b385cc1963e06983"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<7.0" - -[[package]] -name = "opentelemetry-exporter-otlp" -version = "1.20.0" -description = "OpenTelemetry Collector Exporters" -optional = false -python-versions = ">=3.7" -files = [ - {file = "opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl", hash = "sha256:3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6"}, - {file = "opentelemetry_exporter_otlp-1.20.0.tar.gz", hash = "sha256:f8cb69f80c333166e5cfaa030f9e28f7faaf343aff24caaa2cb4202ea4849b6b"}, -] - -[package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.20.0" -opentelemetry-exporter-otlp-proto-http = "1.20.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.20.0" -description = "OpenTelemetry Protobuf encoding" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl", hash = "sha256:dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.20.0.tar.gz", hash = "sha256:df60c681bd61812e50b3a39a7a1afeeb6d4066117583249fcc262269374e7a49"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[package.dependencies] -backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} -opentelemetry-proto = "1.20.0" - [[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.20.0" -description = "OpenTelemetry Collector Protobuf over gRPC Exporter" +name = "natsort" +version = "8.4.0" +description = "Simple yet flexible natural sorting in Python." optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl", hash = "sha256:7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0.tar.gz", hash = "sha256:6c06d43c3771bda1795226e327722b4b980fa1ca1ec9e985f2ef3e29795bdd52"}, + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] -[package.dependencies] -backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -grpcio = ">=1.0.0,<2.0.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.20.0" -opentelemetry-proto = "1.20.0" -opentelemetry-sdk = ">=1.20.0,<1.21.0" - [package.extras] -test = ["pytest-grpc"] +fast = ["fastnumbers (>=2.0.0)"] +icu = ["PyICU (>=1.0.0)"] [[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.20.0" -description = "OpenTelemetry Collector Protobuf over HTTP Exporter" +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl", hash = "sha256:03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.20.0.tar.gz", hash = "sha256:500f42821420fdf0759193d6438edc0f4e984a83e14c08a23023c06a188861b4"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] -[package.dependencies] -backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.20.0" -opentelemetry-proto = "1.20.0" -opentelemetry-sdk = ">=1.20.0,<1.21.0" -requests = ">=2.7,<3.0" - -[package.extras] -test = ["responses (==0.22.0)"] - [[package]] -name = "opentelemetry-proto" -version = "1.20.0" -description = "OpenTelemetry Python Proto" +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" optional = false -python-versions = ">=3.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "opentelemetry_proto-1.20.0-py3-none-any.whl", hash = "sha256:512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b"}, - {file = "opentelemetry_proto-1.20.0.tar.gz", hash = "sha256:cf01f49b3072ee57468bccb1a4f93bdb55411f4512d0ac3f97c5c04c0040b5a2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -protobuf = ">=3.19,<5.0" +[[package]] +name = "numba" +version = "0.60.0" +description = "compiling Python code using LLVM" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, + {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, + {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, + {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, + {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, + {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, + {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, + {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, + {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, + {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, + {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, + {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, + {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, +] + +[package.dependencies] +llvmlite = "==0.43.*" +numpy = ">=1.22,<2.1" [[package]] -name = "opentelemetry-sdk" -version = "1.20.0" -description = "OpenTelemetry Python SDK" +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "opentelemetry_sdk-1.20.0-py3-none-any.whl", hash = "sha256:f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804"}, - {file = "opentelemetry_sdk-1.20.0.tar.gz", hash = "sha256:702e432a457fa717fd2ddfd30640180e69938f85bb7fec3e479f85f61c1843f8"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[package.dependencies] -opentelemetry-api = "1.20.0" -opentelemetry-semantic-conventions = "0.41b0" -typing-extensions = ">=3.7.4" - [[package]] -name = "opentelemetry-semantic-conventions" -version = "0.41b0" -description = "OpenTelemetry Semantic Conventions" +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl", hash = "sha256:45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2"}, - {file = "opentelemetry_semantic_conventions-0.41b0.tar.gz", hash = "sha256:0ce5b040b8a3fc816ea5879a743b3d6fe5db61f6485e4def94c6ee4d402e1eb7"}, + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, ] +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + [[package]] -name = "ordered-set" -version = "4.1.0" -description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +name = "omegaconf" +version = "2.3.0" +description = "A flexible configuration library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, - {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, + {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, + {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, ] -[package.extras] -dev = ["black", "mypy", "pytest"] +[package.dependencies] +antlr4-python3-runtime = "==4.9.*" +PyYAML = ">=5.1.0" [[package]] name = "orjson" -version = "3.9.10" +version = "3.10.10" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.9.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c18a4da2f50050a03d1da5317388ef84a16013302a5281d6f64e4a3f406aabc4"}, - {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5148bab4d71f58948c7c39d12b14a9005b6ab35a0bdf317a8ade9a9e4d9d0bd5"}, - {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cf7837c3b11a2dfb589f8530b3cff2bd0307ace4c301e8997e95c7468c1378e"}, - {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c62b6fa2961a1dcc51ebe88771be5319a93fd89bd247c9ddf732bc250507bc2b"}, - {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb3922a7a804755bbe6b5be9b312e746137a03600f488290318936c1a2d4dc"}, - {file = "orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1234dc92d011d3554d929b6cf058ac4a24d188d97be5e04355f1b9223e98bbe9"}, - {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:06ad5543217e0e46fd7ab7ea45d506c76f878b87b1b4e369006bdb01acc05a83"}, - {file = "orjson-3.9.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fd72fab7bddce46c6826994ce1e7de145ae1e9e106ebb8eb9ce1393ca01444d"}, - {file = "orjson-3.9.10-cp310-none-win32.whl", hash = "sha256:b5b7d4a44cc0e6ff98da5d56cde794385bdd212a86563ac321ca64d7f80c80d1"}, - {file = "orjson-3.9.10-cp310-none-win_amd64.whl", hash = "sha256:61804231099214e2f84998316f3238c4c2c4aaec302df12b21a64d72e2a135c7"}, - {file = "orjson-3.9.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cff7570d492bcf4b64cc862a6e2fb77edd5e5748ad715f487628f102815165e9"}, - {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8bc367f725dfc5cabeed1ae079d00369900231fbb5a5280cf0736c30e2adf7"}, - {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c812312847867b6335cfb264772f2a7e85b3b502d3a6b0586aa35e1858528ab1"}, - {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edd2856611e5050004f4722922b7b1cd6268da34102667bd49d2a2b18bafb81"}, - {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:674eb520f02422546c40401f4efaf8207b5e29e420c17051cddf6c02783ff5ca"}, - {file = "orjson-3.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0dc4310da8b5f6415949bd5ef937e60aeb0eb6b16f95041b5e43e6200821fb"}, - {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99c625b8c95d7741fe057585176b1b8783d46ed4b8932cf98ee145c4facf499"}, - {file = "orjson-3.9.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f18f96b47299c11203edfbdc34e1b69085070d9a3d1f302810cc23ad36bf3"}, - {file = "orjson-3.9.10-cp311-none-win32.whl", hash = "sha256:ce0a29c28dfb8eccd0f16219360530bc3cfdf6bf70ca384dacd36e6c650ef8e8"}, - {file = "orjson-3.9.10-cp311-none-win_amd64.whl", hash = "sha256:cf80b550092cc480a0cbd0750e8189247ff45457e5a023305f7ef1bcec811616"}, - {file = "orjson-3.9.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:602a8001bdf60e1a7d544be29c82560a7b49319a0b31d62586548835bbe2c862"}, - {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f295efcd47b6124b01255d1491f9e46f17ef40d3d7eabf7364099e463fb45f0f"}, - {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92af0d00091e744587221e79f68d617b432425a7e59328ca4c496f774a356071"}, - {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5a02360e73e7208a872bf65a7554c9f15df5fe063dc047f79738998b0506a14"}, - {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858379cbb08d84fe7583231077d9a36a1a20eb72f8c9076a45df8b083724ad1d"}, - {file = "orjson-3.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666c6fdcaac1f13eb982b649e1c311c08d7097cbda24f32612dae43648d8db8d"}, - {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3fb205ab52a2e30354640780ce4587157a9563a68c9beaf52153e1cea9aa0921"}, - {file = "orjson-3.9.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7ec960b1b942ee3c69323b8721df2a3ce28ff40e7ca47873ae35bfafeb4555ca"}, - {file = "orjson-3.9.10-cp312-none-win_amd64.whl", hash = "sha256:3e892621434392199efb54e69edfff9f699f6cc36dd9553c5bf796058b14b20d"}, - {file = "orjson-3.9.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8b9ba0ccd5a7f4219e67fbbe25e6b4a46ceef783c42af7dbc1da548eb28b6531"}, - {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2ecd1d349e62e3960695214f40939bbfdcaeaaa62ccc638f8e651cf0970e5f"}, - {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f433be3b3f4c66016d5a20e5b4444ef833a1f802ced13a2d852c637f69729c1"}, - {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4689270c35d4bb3102e103ac43c3f0b76b169760aff8bcf2d401a3e0e58cdb7f"}, - {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd176f528a8151a6efc5359b853ba3cc0e82d4cd1fab9c1300c5d957dc8f48c"}, - {file = "orjson-3.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a2ce5ea4f71681623f04e2b7dadede3c7435dfb5e5e2d1d0ec25b35530e277b"}, - {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:49f8ad582da6e8d2cf663c4ba5bf9f83cc052570a3a767487fec6af839b0e777"}, - {file = "orjson-3.9.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a11b4b1a8415f105d989876a19b173f6cdc89ca13855ccc67c18efbd7cbd1f8"}, - {file = "orjson-3.9.10-cp38-none-win32.whl", hash = "sha256:a353bf1f565ed27ba71a419b2cd3db9d6151da426b61b289b6ba1422a702e643"}, - {file = "orjson-3.9.10-cp38-none-win_amd64.whl", hash = "sha256:e28a50b5be854e18d54f75ef1bb13e1abf4bc650ab9d635e4258c58e71eb6ad5"}, - {file = "orjson-3.9.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ee5926746232f627a3be1cc175b2cfad24d0170d520361f4ce3fa2fd83f09e1d"}, - {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a73160e823151f33cdc05fe2cea557c5ef12fdf276ce29bb4f1c571c8368a60"}, - {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c338ed69ad0b8f8f8920c13f529889fe0771abbb46550013e3c3d01e5174deef"}, - {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5869e8e130e99687d9e4be835116c4ebd83ca92e52e55810962446d841aba8de"}, - {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2c1e559d96a7f94a4f581e2a32d6d610df5840881a8cba8f25e446f4d792df3"}, - {file = "orjson-3.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a3a3a72c9811b56adf8bcc829b010163bb2fc308877e50e9910c9357e78521"}, - {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f8fb7f5ecf4f6355683ac6881fd64b5bb2b8a60e3ccde6ff799e48791d8f864"}, - {file = "orjson-3.9.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c943b35ecdf7123b2d81d225397efddf0bce2e81db2f3ae633ead38e85cd5ade"}, - {file = "orjson-3.9.10-cp39-none-win32.whl", hash = "sha256:fb0b361d73f6b8eeceba47cd37070b5e6c9de5beaeaa63a1cb35c7e1a73ef088"}, - {file = "orjson-3.9.10-cp39-none-win_amd64.whl", hash = "sha256:b90f340cb6397ec7a854157fac03f0c82b744abdd1c0941a024c3c29d1340aff"}, - {file = "orjson-3.9.10.tar.gz", hash = "sha256:9ebbdbd6a046c304b1845e96fbcc5559cd296b4dfd3ad2509e33c4d9ce07d6a1"}, + {file = "orjson-3.10.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b788a579b113acf1c57e0a68e558be71d5d09aa67f62ca1f68e01117e550a998"}, + {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:804b18e2b88022c8905bb79bd2cbe59c0cd014b9328f43da8d3b28441995cda4"}, + {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9972572a1d042ec9ee421b6da69f7cc823da5962237563fa548ab17f152f0b9b"}, + {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc6993ab1c2ae7dd0711161e303f1db69062955ac2668181bfdf2dd410e65258"}, + {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d78e4cacced5781b01d9bc0f0cd8b70b906a0e109825cb41c1b03f9c41e4ce86"}, + {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6eb2598df518281ba0cbc30d24c5b06124ccf7e19169e883c14e0831217a0bc"}, + {file = "orjson-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23776265c5215ec532de6238a52707048401a568f0fa0d938008e92a147fe2c7"}, + {file = "orjson-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8cc2a654c08755cef90b468ff17c102e2def0edd62898b2486767204a7f5cc9c"}, + {file = "orjson-3.10.10-cp310-none-win32.whl", hash = "sha256:081b3fc6a86d72efeb67c13d0ea7c030017bd95f9868b1e329a376edc456153b"}, + {file = "orjson-3.10.10-cp310-none-win_amd64.whl", hash = "sha256:ff38c5fb749347768a603be1fb8a31856458af839f31f064c5aa74aca5be9efe"}, + {file = "orjson-3.10.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:879e99486c0fbb256266c7c6a67ff84f46035e4f8749ac6317cc83dacd7f993a"}, + {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019481fa9ea5ff13b5d5d95e6fd5ab25ded0810c80b150c2c7b1cc8660b662a7"}, + {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0dd57eff09894938b4c86d4b871a479260f9e156fa7f12f8cad4b39ea8028bb5"}, + {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbde6d70cd95ab4d11ea8ac5e738e30764e510fc54d777336eec09bb93b8576c"}, + {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2625cb37b8fb42e2147404e5ff7ef08712099197a9cd38895006d7053e69d6"}, + {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf3c20c6a7db69df58672a0d5815647ecf78c8e62a4d9bd284e8621c1fe5ccb"}, + {file = "orjson-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:75c38f5647e02d423807d252ce4528bf6a95bd776af999cb1fb48867ed01d1f6"}, + {file = "orjson-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:23458d31fa50ec18e0ec4b0b4343730928296b11111df5f547c75913714116b2"}, + {file = "orjson-3.10.10-cp311-none-win32.whl", hash = "sha256:2787cd9dedc591c989f3facd7e3e86508eafdc9536a26ec277699c0aa63c685b"}, + {file = "orjson-3.10.10-cp311-none-win_amd64.whl", hash = "sha256:6514449d2c202a75183f807bc755167713297c69f1db57a89a1ef4a0170ee269"}, + {file = "orjson-3.10.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8564f48f3620861f5ef1e080ce7cd122ee89d7d6dacf25fcae675ff63b4d6e05"}, + {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bf161a32b479034098c5b81f2608f09167ad2fa1c06abd4e527ea6bf4837a9"}, + {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b65c93617bcafa7f04b74ae8bc2cc214bd5cb45168a953256ff83015c6747d"}, + {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8e28406f97fc2ea0c6150f4c1b6e8261453318930b334abc419214c82314f85"}, + {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4d0d9fe174cc7a5bdce2e6c378bcdb4c49b2bf522a8f996aa586020e1b96cee"}, + {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3be81c42f1242cbed03cbb3973501fcaa2675a0af638f8be494eaf37143d999"}, + {file = "orjson-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65f9886d3bae65be026219c0a5f32dbbe91a9e6272f56d092ab22561ad0ea33b"}, + {file = "orjson-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:730ed5350147db7beb23ddaf072f490329e90a1d059711d364b49fe352ec987b"}, + {file = "orjson-3.10.10-cp312-none-win32.whl", hash = "sha256:a8f4bf5f1c85bea2170800020d53a8877812892697f9c2de73d576c9307a8a5f"}, + {file = "orjson-3.10.10-cp312-none-win_amd64.whl", hash = "sha256:384cd13579a1b4cd689d218e329f459eb9ddc504fa48c5a83ef4889db7fd7a4f"}, + {file = "orjson-3.10.10-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44bffae68c291f94ff5a9b4149fe9d1bdd4cd0ff0fb575bcea8351d48db629a1"}, + {file = "orjson-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e27b4c6437315df3024f0835887127dac2a0a3ff643500ec27088d2588fa5ae1"}, + {file = "orjson-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca84df16d6b49325a4084fd8b2fe2229cb415e15c46c529f868c3387bb1339d"}, + {file = "orjson-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c14ce70e8f39bd71f9f80423801b5d10bf93d1dceffdecd04df0f64d2c69bc01"}, + {file = "orjson-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:24ac62336da9bda1bd93c0491eff0613003b48d3cb5d01470842e7b52a40d5b4"}, + {file = "orjson-3.10.10-cp313-none-win32.whl", hash = "sha256:eb0a42831372ec2b05acc9ee45af77bcaccbd91257345f93780a8e654efc75db"}, + {file = "orjson-3.10.10-cp313-none-win_amd64.whl", hash = "sha256:f0c4f37f8bf3f1075c6cc8dd8a9f843689a4b618628f8812d0a71e6968b95ffd"}, + {file = "orjson-3.10.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:829700cc18503efc0cf502d630f612884258020d98a317679cd2054af0259568"}, + {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0ceb5e0e8c4f010ac787d29ae6299846935044686509e2f0f06ed441c1ca949"}, + {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c25908eb86968613216f3db4d3003f1c45d78eb9046b71056ca327ff92bdbd4"}, + {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:218cb0bc03340144b6328a9ff78f0932e642199ac184dd74b01ad691f42f93ff"}, + {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2277ec2cea3775640dc81ab5195bb5b2ada2fe0ea6eee4677474edc75ea6785"}, + {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:848ea3b55ab5ccc9d7bbd420d69432628b691fba3ca8ae3148c35156cbd282aa"}, + {file = "orjson-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e3e67b537ac0c835b25b5f7d40d83816abd2d3f4c0b0866ee981a045287a54f3"}, + {file = "orjson-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7948cfb909353fce2135dcdbe4521a5e7e1159484e0bb024c1722f272488f2b8"}, + {file = "orjson-3.10.10-cp38-none-win32.whl", hash = "sha256:78bee66a988f1a333dc0b6257503d63553b1957889c17b2c4ed72385cd1b96ae"}, + {file = "orjson-3.10.10-cp38-none-win_amd64.whl", hash = "sha256:f1d647ca8d62afeb774340a343c7fc023efacfd3a39f70c798991063f0c681dd"}, + {file = "orjson-3.10.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5a059afddbaa6dd733b5a2d76a90dbc8af790b993b1b5cb97a1176ca713b5df8"}, + {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f9b5c59f7e2a1a410f971c5ebc68f1995822837cd10905ee255f96074537ee6"}, + {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5ef198bafdef4aa9d49a4165ba53ffdc0a9e1c7b6f76178572ab33118afea25"}, + {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf29ce0bb5d3320824ec3d1508652421000ba466abd63bdd52c64bcce9eb1fa"}, + {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dddd5516bcc93e723d029c1633ae79c4417477b4f57dad9bfeeb6bc0315e654a"}, + {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12f2003695b10817f0fa8b8fca982ed7f5761dcb0d93cff4f2f9f6709903fd7"}, + {file = "orjson-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:672f9874a8a8fb9bb1b771331d31ba27f57702c8106cdbadad8bda5d10bc1019"}, + {file = "orjson-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dcbb0ca5fafb2b378b2c74419480ab2486326974826bbf6588f4dc62137570a"}, + {file = "orjson-3.10.10-cp39-none-win32.whl", hash = "sha256:d9bbd3a4b92256875cb058c3381b782649b9a3c68a4aa9a2fff020c2f9cfc1be"}, + {file = "orjson-3.10.10-cp39-none-win_amd64.whl", hash = "sha256:766f21487a53aee8524b97ca9582d5c6541b03ab6210fbaf10142ae2f3ced2aa"}, + {file = "orjson-3.10.10.tar.gz", hash = "sha256:37949383c4df7b4337ce82ee35b6d7471e55195efa7dcb45ab8226ceadb0fe3b"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "paginate" -version = "0.5.6" +version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" files = [ - {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, ] +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" -version = "2.2.0" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, - {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, - {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, - {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, - {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, - {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, - {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, -] - -[package.dependencies] -numpy = {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""} + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +gcsfs = {version = ">=2022.11.0", optional = true, markers = "extra == \"gcp\""} +numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""} +pandas-gbq = {version = ">=0.19.0", optional = true, markers = "extra == \"gcp\""} +pyarrow = {version = ">=10.0.1", optional = true, markers = "extra == \"parquet\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -5567,6 +3546,7 @@ parquet = ["pyarrow (>=10.0.1)"] performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] plot = ["matplotlib (>=3.6.3)"] postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] spss = ["pyreadstat (>=1.2.0)"] sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] @@ -5574,13 +3554,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-gbq" -version = "0.19.2" +version = "0.24.0" description = "Google BigQuery connector for pandas" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pandas-gbq-0.19.2.tar.gz", hash = "sha256:b0f7fa84a2be0fe767e33a008ca7e4ad9a9e3ac67255fd0a41fc19b503138447"}, - {file = "pandas_gbq-0.19.2-py2.py3-none-any.whl", hash = "sha256:0ef8da3e4088053a2bea069ed688992a44b52af67dadb97eee494b32a2147563"}, + {file = "pandas_gbq-0.24.0-py2.py3-none-any.whl", hash = "sha256:e3e39f4fd8651ced033515e5e63a6c19bc757b26155fac01c4367e1aa74ee122"}, + {file = "pandas_gbq-0.24.0.tar.gz", hash = "sha256:264415277059821497e74ed0b2240b538cba9646ee627fb4668cac5cf274e4c3"}, ] [package.dependencies] @@ -5588,15 +3568,17 @@ db-dtypes = ">=1.0.4,<2.0.0" google-api-core = ">=2.10.2,<3.0.0dev" google-auth = ">=2.13.0" google-auth-oauthlib = ">=0.7.0" -google-cloud-bigquery = ">=3.3.5,<4.0.0dev" -google-cloud-bigquery-storage = ">=2.16.2,<3.0.0dev" -numpy = ">=1.16.6" +google-cloud-bigquery = ">=3.4.2,<4.0.0dev" +numpy = ">=1.18.1" +packaging = ">=22.0.0" pandas = ">=1.1.4" -pyarrow = ">=3.0.0" +pyarrow = ">=4.0.0" pydata-google-auth = ">=1.5.0" setuptools = "*" [package.extras] +bqstorage = ["google-cloud-bigquery-storage (>=2.16.2,<3.0.0dev)"] +geopandas = ["Shapely (>=1.8.4)", "geopandas (>=0.9.0)"] tqdm = ["tqdm (>=4.23.0)"] [[package]] @@ -5615,73 +3597,39 @@ regex = ">=2022.3.15" [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pendulum" -version = "2.1.2" -description = "Python datetimes made easy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" files = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[package.dependencies] -python-dateutil = ">=2.6,<3.0" -pytzdata = ">=2020.1" - [[package]] name = "pep8-naming" -version = "0.13.3" +version = "0.14.1" description = "Check PEP-8 naming conventions, plugin for flake8" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, - {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, + {file = "pep8-naming-0.14.1.tar.gz", hash = "sha256:1ef228ae80875557eb6c1549deafed4dabbf3261cfcafa12f773fe0db9be8a36"}, + {file = "pep8_naming-0.14.1-py3-none-any.whl", hash = "sha256:63f514fc777d715f935faf185dedd679ab99526a7f2f503abb61587877f7b1c5"}, ] [package.dependencies] @@ -5689,13 +3637,13 @@ flake8 = ">=5.0.0" [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -5703,95 +3651,121 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.1.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "3.11.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "plotly" -version = "5.18.0" +version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "plotly-5.18.0-py3-none-any.whl", hash = "sha256:23aa8ea2f4fb364a20d34ad38235524bd9d691bf5299e800bca608c31e8db8de"}, - {file = "plotly-5.18.0.tar.gz", hash = "sha256:360a31e6fbb49d12b007036eb6929521343d6bee2236f8459915821baefa2cbb"}, + {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, + {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, ] [package.dependencies] @@ -5800,13 +3774,13 @@ tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -5815,13 +3789,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.1" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, ] [package.dependencies] @@ -5834,13 +3808,13 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "pre-commit" -version = "3.6.0" +version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, - {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, ] [package.dependencies] @@ -5862,52 +3836,142 @@ files = [ ] [[package]] -name = "prison" -version = "0.2.1" -description = "Rison encoder/decoder" +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = "*" +python-versions = ">=3.7.0" files = [ - {file = "prison-0.2.1-py2.py3-none-any.whl", hash = "sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5"}, - {file = "prison-0.2.1.tar.gz", hash = "sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] -six = "*" - -[package.extras] -dev = ["nose", "pipreqs", "twine"] +wcwidth = "*" [[package]] -name = "prompt-toolkit" -version = "3.0.41" -description = "Library for building powerful interactive command lines in Python" +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, ] -[package.dependencies] -wcwidth = "*" - [[package]] name = "proto-plus" -version = "1.22.3" +version = "1.25.0" description = "Beautiful, Pythonic protocol buffers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, - {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, + {file = "proto_plus-1.25.0-py3-none-any.whl", hash = "sha256:c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961"}, + {file = "proto_plus-1.25.0.tar.gz", hash = "sha256:fbb17f57f7bd05a68b7707e745e26528b0b3c34e378db91eef93912c54982d91"}, ] [package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" @@ -5942,31 +4006,33 @@ files = [ [[package]] name = "psutil" -version = "5.9.6" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "ptyprocess" @@ -5981,13 +4047,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -6017,76 +4083,82 @@ files = [ [[package]] name = "pyarrow" -version = "14.0.1" +version = "18.0.0" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pyarrow-14.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a"}, - {file = "pyarrow-14.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93"}, - {file = "pyarrow-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd"}, - {file = "pyarrow-14.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220"}, - {file = "pyarrow-14.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83"}, - {file = "pyarrow-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23"}, - {file = "pyarrow-14.0.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10"}, - {file = "pyarrow-14.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee"}, - {file = "pyarrow-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd"}, - {file = "pyarrow-14.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee"}, - {file = "pyarrow-14.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27"}, - {file = "pyarrow-14.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad"}, - {file = "pyarrow-14.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450"}, - {file = "pyarrow-14.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510"}, - {file = "pyarrow-14.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283"}, - {file = "pyarrow-14.0.1.tar.gz", hash = "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1"}, -] - -[package.dependencies] -numpy = ">=1.16.6" + {file = "pyarrow-18.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2333f93260674e185cfbf208d2da3007132572e56871f451ba1a556b45dae6e2"}, + {file = "pyarrow-18.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4c381857754da44326f3a49b8b199f7f87a51c2faacd5114352fc78de30d3aba"}, + {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:603cd8ad4976568954598ef0a6d4ed3dfb78aff3d57fa8d6271f470f0ce7d34f"}, + {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58a62549a3e0bc9e03df32f350e10e1efb94ec6cf63e3920c3385b26663948ce"}, + {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bc97316840a349485fbb137eb8d0f4d7057e1b2c1272b1a20eebbbe1848f5122"}, + {file = "pyarrow-18.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:2e549a748fa8b8715e734919923f69318c953e077e9c02140ada13e59d043310"}, + {file = "pyarrow-18.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:606e9a3dcb0f52307c5040698ea962685fb1c852d72379ee9412be7de9c5f9e2"}, + {file = "pyarrow-18.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d5795e37c0a33baa618c5e054cd61f586cf76850a251e2b21355e4085def6280"}, + {file = "pyarrow-18.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:5f0510608ccd6e7f02ca8596962afb8c6cc84c453e7be0da4d85f5f4f7b0328a"}, + {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616ea2826c03c16e87f517c46296621a7c51e30400f6d0a61be645f203aa2b93"}, + {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1824f5b029ddd289919f354bc285992cb4e32da518758c136271cf66046ef22"}, + {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd1b52d0d58dd8f685ced9971eb49f697d753aa7912f0a8f50833c7a7426319"}, + {file = "pyarrow-18.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:320ae9bd45ad7ecc12ec858b3e8e462578de060832b98fc4d671dee9f10d9954"}, + {file = "pyarrow-18.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2c992716cffb1088414f2b478f7af0175fd0a76fea80841b1706baa8fb0ebaad"}, + {file = "pyarrow-18.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:e7ab04f272f98ebffd2a0661e4e126036f6936391ba2889ed2d44c5006237802"}, + {file = "pyarrow-18.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:03f40b65a43be159d2f97fd64dc998f769d0995a50c00f07aab58b0b3da87e1f"}, + {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be08af84808dff63a76860847c48ec0416928a7b3a17c2f49a072cac7c45efbd"}, + {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70c1965cde991b711a98448ccda3486f2a336457cf4ec4dca257a926e149c9"}, + {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:00178509f379415a3fcf855af020e3340254f990a8534294ec3cf674d6e255fd"}, + {file = "pyarrow-18.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a71ab0589a63a3e987beb2bc172e05f000a5c5be2636b4b263c44034e215b5d7"}, + {file = "pyarrow-18.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe92efcdbfa0bcf2fa602e466d7f2905500f33f09eb90bf0bcf2e6ca41b574c8"}, + {file = "pyarrow-18.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:907ee0aa8ca576f5e0cdc20b5aeb2ad4d3953a3b4769fc4b499e00ef0266f02f"}, + {file = "pyarrow-18.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:66dcc216ebae2eb4c37b223feaf82f15b69d502821dde2da138ec5a3716e7463"}, + {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1daf7c425f58527900876354390ee41b0ae962a73ad0959b9d829def583bb1"}, + {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871b292d4b696b09120ed5bde894f79ee2a5f109cb84470546471df264cae136"}, + {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:082ba62bdcb939824ba1ce10b8acef5ab621da1f4c4805e07bfd153617ac19d4"}, + {file = "pyarrow-18.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:2c664ab88b9766413197733c1720d3dcd4190e8fa3bbdc3710384630a0a7207b"}, + {file = "pyarrow-18.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc892be34dbd058e8d189b47db1e33a227d965ea8805a235c8a7286f7fd17d3a"}, + {file = "pyarrow-18.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:28f9c39a56d2c78bf6b87dcc699d520ab850919d4a8c7418cd20eda49874a2ea"}, + {file = "pyarrow-18.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:f1a198a50c409ab2d009fbf20956ace84567d67f2c5701511d4dd561fae6f32e"}, + {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5bd7fd32e3ace012d43925ea4fc8bd1b02cc6cc1e9813b518302950e89b5a22"}, + {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336addb8b6f5208be1b2398442c703a710b6b937b1a046065ee4db65e782ff5a"}, + {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:45476490dd4adec5472c92b4d253e245258745d0ccaabe706f8d03288ed60a79"}, + {file = "pyarrow-18.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b46591222c864e7da7faa3b19455196416cd8355ff6c2cc2e65726a760a3c420"}, + {file = "pyarrow-18.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:eb7e3abcda7e1e6b83c2dc2909c8d045881017270a119cc6ee7fdcfe71d02df8"}, + {file = "pyarrow-18.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:09f30690b99ce34e0da64d20dab372ee54431745e4efb78ac938234a282d15f9"}, + {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5ca5d707e158540312e09fd907f9f49bacbe779ab5236d9699ced14d2293b8"}, + {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6331f280c6e4521c69b201a42dd978f60f7e129511a55da9e0bfe426b4ebb8d"}, + {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3ac24b2be732e78a5a3ac0b3aa870d73766dd00beba6e015ea2ea7394f8b4e55"}, + {file = "pyarrow-18.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b30a927c6dff89ee702686596f27c25160dd6c99be5bcc1513a763ae5b1bfc03"}, + {file = "pyarrow-18.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8f40ec677e942374e3d7f2fad6a67a4c2811a8b975e8703c6fd26d3b168a90e2"}, + {file = "pyarrow-18.0.0.tar.gz", hash = "sha256:a6aa027b1a9d2970cf328ccd6dbe4a996bc13c39fd427f502782f5bdb9ca20f5"}, +] + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] [[package]] name = "pyasn1" -version = "0.5.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pycares" @@ -6156,163 +4228,26 @@ idna = ["idna (>=2.1)"] [[package]] name = "pycodestyle" -version = "2.11.1" +version = "2.12.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydantic" -version = "2.4.2" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-2.4.2-py3-none-any.whl", hash = "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"}, - {file = "pydantic-2.4.2.tar.gz", hash = "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.10.1" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.10.1" -description = "" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.10.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63"}, - {file = "pydantic_core-2.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e"}, - {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e"}, - {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e"}, - {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6"}, - {file = "pydantic_core-2.10.1-cp310-none-win32.whl", hash = "sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b"}, - {file = "pydantic_core-2.10.1-cp310-none-win_amd64.whl", hash = "sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0"}, - {file = "pydantic_core-2.10.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea"}, - {file = "pydantic_core-2.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8"}, - {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4"}, - {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607"}, - {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f"}, - {file = "pydantic_core-2.10.1-cp311-none-win32.whl", hash = "sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6"}, - {file = "pydantic_core-2.10.1-cp311-none-win_amd64.whl", hash = "sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27"}, - {file = "pydantic_core-2.10.1-cp311-none-win_arm64.whl", hash = "sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325"}, - {file = "pydantic_core-2.10.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921"}, - {file = "pydantic_core-2.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901"}, - {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d"}, - {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f"}, - {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c"}, - {file = "pydantic_core-2.10.1-cp312-none-win32.whl", hash = "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f"}, - {file = "pydantic_core-2.10.1-cp312-none-win_amd64.whl", hash = "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430"}, - {file = "pydantic_core-2.10.1-cp312-none-win_arm64.whl", hash = "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15"}, - {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f"}, - {file = "pydantic_core-2.10.1-cp37-none-win32.whl", hash = "sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c"}, - {file = "pydantic_core-2.10.1-cp37-none-win_amd64.whl", hash = "sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e"}, - {file = "pydantic_core-2.10.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc"}, - {file = "pydantic_core-2.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302"}, - {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e"}, - {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561"}, - {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de"}, - {file = "pydantic_core-2.10.1-cp38-none-win32.whl", hash = "sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee"}, - {file = "pydantic_core-2.10.1-cp38-none-win_amd64.whl", hash = "sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e"}, - {file = "pydantic_core-2.10.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970"}, - {file = "pydantic_core-2.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a"}, - {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429"}, - {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7"}, - {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595"}, - {file = "pydantic_core-2.10.1-cp39-none-win32.whl", hash = "sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a"}, - {file = "pydantic_core-2.10.1-cp39-none-win_amd64.whl", hash = "sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357"}, - {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2"}, - {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132"}, - {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7"}, - {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776"}, - {file = "pydantic_core-2.10.1.tar.gz", hash = "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - [[package]] name = "pydata-google-auth" version = "1.8.2" @@ -6331,18 +4266,18 @@ setuptools = "*" [[package]] name = "pydoclint" -version = "0.4.1" +version = "0.5.9" description = "A Python docstring linter that checks arguments, returns, yields, and raises sections" optional = false python-versions = ">=3.8" files = [ - {file = "pydoclint-0.4.1-py2.py3-none-any.whl", hash = "sha256:4e32fdf0a47a2199377617f09af0a82a2157f80543026f919a17112a396e752f"}, - {file = "pydoclint-0.4.1.tar.gz", hash = "sha256:d39ed26a793203afadb1917011710fbf258ac3dddcd79b53212e0a2107221643"}, + {file = "pydoclint-0.5.9-py2.py3-none-any.whl", hash = "sha256:089327003cef6fe5605cbaa9887859ea5229ce0c9abb52775ffd57513094c1ae"}, + {file = "pydoclint-0.5.9.tar.gz", hash = "sha256:e200f964a5d9fbbb2ff1078bd7cb5433a0564d2482b6a1ba1be848f66bc4924f"}, ] [package.dependencies] click = ">=8.1.0" -docstring-parser-fork = ">=0.0.5" +docstring-parser-fork = ">=0.0.9" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [package.extras] @@ -6350,38 +4285,38 @@ flake8 = ["flake8 (>=4)"] [[package]] name = "pyflakes" -version = "3.1.0" +version = "3.2.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" files = [ - {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, - {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] [[package]] name = "pygments" -version = "2.16.1" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.dependencies] @@ -6389,65 +4324,48 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyliftover" -version = "0.4" +version = "0.4.1" description = "Pure-python implementation of UCSC ``liftOver`` genome coordinate conversion." optional = false python-versions = "*" files = [ - {file = "pyliftover-0.4.tar.gz", hash = "sha256:72bcfb7de907569b0eb75e86c817840365297d63ba43a961da394187e399da41"}, + {file = "pyliftover-0.4.1-py3-none-any.whl", hash = "sha256:49ef8938010d2e934abb483d3ef8073897ed6b88bcd978c486c8f7631c24dbc1"}, + {file = "pyliftover-0.4.1.tar.gz", hash = "sha256:33ad187e35d1b6662ba446432f4dd1a808ac2914ce1645eef37598fa5a3860cd"}, ] [[package]] name = "pymdown-extensions" -version = "10.7" +version = "10.12" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, - {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, + {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"}, + {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"}, ] [package.dependencies] -markdown = ">=3.5" +markdown = ">=3.6" pyyaml = "*" [package.extras] extra = ["pygments (>=2.12)"] -[[package]] -name = "pyopenssl" -version = "23.2.0" -description = "Python wrapper module around the OpenSSL library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, - {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, -] - -[package.dependencies] -cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" - -[package.extras] -docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] - [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -6474,13 +4392,13 @@ sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] [[package]] name = "pytest" -version = "8.0.1" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, - {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -6488,21 +4406,21 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.3.0,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -6510,7 +4428,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-sugar" @@ -6533,77 +4451,38 @@ dev = ["black", "flake8", "pre-commit"] [[package]] name = "pytest-xdist" -version = "3.5.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, - {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] setproctitle = ["setproctitle"] testing = ["filelock"] -[[package]] -name = "python-daemon" -version = "3.0.1" -description = "Library to implement a well-behaved Unix daemon process." -optional = false -python-versions = ">=3" -files = [ - {file = "python-daemon-3.0.1.tar.gz", hash = "sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5"}, - {file = "python_daemon-3.0.1-py3-none-any.whl", hash = "sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341"}, -] - -[package.dependencies] -docutils = "*" -lockfile = ">=0.10" -setuptools = ">=62.4.0" - -[package.extras] -devel = ["coverage", "docutils", "isort", "testscenarios (>=0.4)", "testtools", "twine"] -test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"] - [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] six = ">=1.5" -[[package]] -name = "python-gitlab" -version = "3.15.0" -description = "Interact with GitLab API" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "python-gitlab-3.15.0.tar.gz", hash = "sha256:c9e65eb7612a9fbb8abf0339972eca7fd7a73d4da66c9b446ffe528930aff534"}, - {file = "python_gitlab-3.15.0-py3-none-any.whl", hash = "sha256:8f8d1c0d387f642eb1ac7bf5e8e0cd8b3dd49c6f34170cee3c7deb7d384611f3"}, -] - -[package.dependencies] -requests = ">=2.25.0" -requests-toolbelt = ">=0.10.1" - -[package.extras] -autocompletion = ["argcomplete (>=1.10.0,<3)"] -yaml = ["PyYaml (>=5.2)"] - [[package]] name = "python-json-logger" version = "2.0.7" @@ -6615,170 +4494,104 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] -[[package]] -name = "python-nvd3" -version = "0.15.0" -description = "Python NVD3 - Chart Library for d3.js" -optional = false -python-versions = "*" -files = [ - {file = "python-nvd3-0.15.0.tar.gz", hash = "sha256:fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715"}, -] - -[package.dependencies] -Jinja2 = ">=2.8" -python-slugify = ">=1.2.5" - -[[package]] -name = "python-semantic-release" -version = "9.1.0" -description = "Automatic Semantic Versioning for Python projects" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-semantic-release-9.1.0.tar.gz", hash = "sha256:0317e72a940c5080c8aa6ff56cce6230f045b1a8f91f0a58fdc8f80745912369"}, - {file = "python_semantic_release-9.1.0-py3-none-any.whl", hash = "sha256:7ca5fb1ea4d5215182db477fbc53d9f4c907b7030520c4ac6640b9aaa71dbce7"}, -] - -[package.dependencies] -click = ">=8,<9" -dotty-dict = ">=1.3.0,<2" -gitpython = ">=3.0.8,<4" -importlib-resources = ">=5.7,<7" -jinja2 = ">=3.1.2,<4" -pydantic = ">=2,<3" -python-gitlab = ">=2,<5" -requests = ">=2.25,<3" -rich = ">=12.5.1" -shellingham = ">=1.5.0.post1" -tomlkit = ">=0.11,<1.0" - -[package.extras] -dev = ["pre-commit", "ruff (==0.1.11)", "tox"] -docs = ["Sphinx (<=6.0.0)", "furo (>=2023.3.27)", "sphinx-autobuild (==2021.03.14)", "sphinxcontrib-apidoc (==0.3.0)"] -mypy = ["mypy", "types-requests"] -test = ["coverage[toml] (>=6,<8)", "pytest (>=7,<8)", "pytest-clarity (>=1.0.1)", "pytest-cov (>=4,<5)", "pytest-env (>=1.0,<2.0)", "pytest-lazy-fixture (>=0.6.3,<0.7.0)", "pytest-mock (>=3,<4)", "pytest-pretty (>=1.2.0,<2)", "pytest-xdist (>=2,<4)", "requests-mock (>=1.10.0,<2)", "responses (==0.23.3)", "types-pytest-lazy-fixture (>=0.6.3.3)"] - -[[package]] -name = "python-slugify" -version = "8.0.1" -description = "A Python slugify application that also handles Unicode" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, - {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, -] - -[package.dependencies] -text-unidecode = ">=1.3" - -[package.extras] -unidecode = ["Unidecode (>=1.1.1)"] - [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, -] - -[[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -6797,230 +4610,237 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "25.1.1" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "referencing" -version = "0.30.2" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, - {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - [[package]] name = "regex" -version = "2023.10.3" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, - {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, - {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, - {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, - {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, - {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, - {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, - {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, - {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, - {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, - {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, - {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, - {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, - {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, - {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, - {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -7035,13 +4855,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -7051,34 +4871,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - [[package]] name = "rich" version = "12.6.0" @@ -7097,128 +4889,6 @@ pygments = ">=2.6.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] -[[package]] -name = "rich-argparse" -version = "1.4.0" -description = "Rich help formatters for argparse and optparse" -optional = false -python-versions = ">=3.7" -files = [ - {file = "rich_argparse-1.4.0-py3-none-any.whl", hash = "sha256:68b263d3628d07b1d27cfe6ad896da2f5a5583ee2ba226aeeb24459840023b38"}, - {file = "rich_argparse-1.4.0.tar.gz", hash = "sha256:c275f34ea3afe36aec6342c2a2298893104b5650528941fb53c21067276dba19"}, -] - -[package.dependencies] -rich = ">=11.0.0" - -[[package]] -name = "rpds-py" -version = "0.10.6" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, - {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, - {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, - {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, - {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, - {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, - {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, - {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, - {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, - {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, - {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, - {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, - {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, - {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, - {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, - {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, - {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, - {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, - {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, - {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, - {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, - {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, - {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, - {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, - {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, - {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, - {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, - {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, - {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, - {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, - {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, - {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, - {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, - {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, - {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, - {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, - {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, - {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, - {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, - {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, - {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, - {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, - {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, - {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, -] - [[package]] name = "rsa" version = "4.9" @@ -7235,108 +4905,97 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.2.0" +version = "0.7.1" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:638ea3294f800d18bae84a492cb5a245c8d29c90d19a91d8e338937a4c27fca0"}, - {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff35433fcf4dff6d610738712152df6b7d92351a1bde8e00bd405b08b3d5759"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9faafbdcf4f53917019f2c230766da437d4fd5caecd12ddb68bb6a17d74399"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8153a3e4128ed770871c47545f1ae7b055023e0c222ff72a759f5a341ee06483"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a75a98ae989a27090e9c51f763990ad5bbc92d20626d54e9701c7fe597f399"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:87057dd2fdde297130ff99553be8549ca38a2965871462a97394c22ed2dfc19d"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d232f99d3ab00094ebaf88e0fb7a8ccacaa54cc7fa3b8993d9627a11e6aed7a"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3c641f95f435fc6754b05591774a17df41648f0daf3de0d75ad3d9f099ab92"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3826fb34c144ef1e171b323ed6ae9146ab76d109960addca730756dc19dc7b22"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eceab7d85d09321b4de18b62d38710cf296cb49e98979960a59c6b9307c18cfe"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:30ad74687e1f4a9ff8e513b20b82ccadb6bd796fe5697f1e417189c5cde6be3e"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7e3818698f8460bd0f8d4322bbe99db8327e9bc2c93c789d3159f5b335f47da"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:edf23041242c48b0d8295214783ef543847ef29e8226d9f69bf96592dba82a83"}, - {file = "ruff-0.2.0-py3-none-win32.whl", hash = "sha256:e155147199c2714ff52385b760fe242bb99ea64b240a9ffbd6a5918eb1268843"}, - {file = "ruff-0.2.0-py3-none-win_amd64.whl", hash = "sha256:ba918e01cdd21e81b07555564f40d307b0caafa9a7a65742e98ff244f5035c59"}, - {file = "ruff-0.2.0-py3-none-win_arm64.whl", hash = "sha256:3fbaff1ba9564a2c5943f8f38bc221f04bac687cc7485e45237579fee7ccda79"}, - {file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"}, + {file = "ruff-0.7.1-py3-none-linux_armv6l.whl", hash = "sha256:cb1bc5ed9403daa7da05475d615739cc0212e861b7306f314379d958592aaa89"}, + {file = "ruff-0.7.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27c1c52a8d199a257ff1e5582d078eab7145129aa02721815ca8fa4f9612dc35"}, + {file = "ruff-0.7.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:588a34e1ef2ea55b4ddfec26bbe76bc866e92523d8c6cdec5e8aceefeff02d99"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fc32f9cdf72dc75c451e5f072758b118ab8100727168a3df58502b43a599ca"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:985818742b833bffa543a84d1cc11b5e6871de1b4e0ac3060a59a2bae3969250"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32f1e8a192e261366c702c5fb2ece9f68d26625f198a25c408861c16dc2dea9c"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:699085bf05819588551b11751eff33e9ca58b1b86a6843e1b082a7de40da1565"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:344cc2b0814047dc8c3a8ff2cd1f3d808bb23c6658db830d25147339d9bf9ea7"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4316bbf69d5a859cc937890c7ac7a6551252b6a01b1d2c97e8fc96e45a7c8b4a"}, + {file = "ruff-0.7.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79d3af9dca4c56043e738a4d6dd1e9444b6d6c10598ac52d146e331eb155a8ad"}, + {file = "ruff-0.7.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c5c121b46abde94a505175524e51891f829414e093cd8326d6e741ecfc0a9112"}, + {file = "ruff-0.7.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8422104078324ea250886954e48f1373a8fe7de59283d747c3a7eca050b4e378"}, + {file = "ruff-0.7.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:56aad830af8a9db644e80098fe4984a948e2b6fc2e73891538f43bbe478461b8"}, + {file = "ruff-0.7.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:658304f02f68d3a83c998ad8bf91f9b4f53e93e5412b8f2388359d55869727fd"}, + {file = "ruff-0.7.1-py3-none-win32.whl", hash = "sha256:b517a2011333eb7ce2d402652ecaa0ac1a30c114fbbd55c6b8ee466a7f600ee9"}, + {file = "ruff-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f38c41fcde1728736b4eb2b18850f6d1e3eedd9678c914dede554a70d5241307"}, + {file = "ruff-0.7.1-py3-none-win_arm64.whl", hash = "sha256:19aa200ec824c0f36d0c9114c8ec0087082021732979a359d6f3c390a6ff2a37"}, + {file = "ruff-0.7.1.tar.gz", hash = "sha256:9d8a41d4aa2dad1575adb98a82870cf5db5f76b2938cf2206c22c940034a36f4"}, ] [[package]] name = "s3transfer" -version = "0.7.0" +version = "0.10.3" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, - {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [package.dependencies] -botocore = ">=1.12.36,<2.0a.0" +botocore = ">=1.33.2,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "scikit-learn" -version = "1.4.0" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.4.0.tar.gz", hash = "sha256:d4373c984eba20e393216edd51a3e3eede56cbe93d4247516d205643c3b93121"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fce93a7473e2f4ee4cc280210968288d6a7d7ad8dc6fa7bb7892145e407085f9"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d77df3d1e15fc37a9329999979fa7868ba8655dbab21fe97fc7ddabac9e08cc7"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404659fedec40eeafa310cd14d613e564d13dbf8f3c752d31c095195ec05de6"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98632da8f6410e6fb6bf66937712c949b4010600ccd3f22a5388a83e610cc3c"}, - {file = "scikit_learn-1.4.0-1-cp310-cp310-win_amd64.whl", hash = "sha256:11b3b140f70fbc9f6a08884631ae8dd60a4bb2d7d6d1de92738ea42b740d8992"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8341eabdc754d5ab91641a7763243845e96b6d68e03e472531e88a4f1b09f21"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1f6bce875ac2bb6b52514f67c185c564ccd299a05b65b7bab091a4c13dde12d"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c408b46b2fd61952d519ea1af2f8f0a7a703e1433923ab1704c4131520b2083b"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b465dd1dcd237b7b1dcd1a9048ccbf70a98c659474324fa708464c3a2533fad"}, - {file = "scikit_learn-1.4.0-1-cp311-cp311-win_amd64.whl", hash = "sha256:0db8e22c42f7980fe5eb22069b1f84c48966f3e0d23a01afde5999e3987a2501"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7eef6ea2ed289af40e88c0be9f7704ca8b5de18508a06897c3fe21e0905efdf"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:349669b01435bc4dbf25c6410b0892073befdaec52637d1a1d1ff53865dc8db3"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d439c584e58434d0350701bd33f6c10b309e851fccaf41c121aed55f6851d8cf"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e2427d9ef46477625ab9b55c1882844fe6fc500f418c3f8e650200182457bc"}, - {file = "scikit_learn-1.4.0-1-cp312-cp312-win_amd64.whl", hash = "sha256:d3d75343940e7bf9b85c830c93d34039fa015eeb341c5c0b4cd7a90dadfe00d4"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76986d22e884ab062b1beecdd92379656e9d3789ecc1f9870923c178de55f9fe"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e22446ad89f1cb7657f0d849dcdc345b48e2d10afa3daf2925fdb740f85b714c"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74812c9eabb265be69d738a8ea8d4884917a59637fcbf88a5f0e9020498bc6b3"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad2a63e0dd386b92da3270887a29b308af4d7c750d8c4995dfd9a4798691bcc"}, - {file = "scikit_learn-1.4.0-1-cp39-cp39-win_amd64.whl", hash = "sha256:53b9e29177897c37e2ff9d4ba6ca12fdb156e22523e463db05def303f5c72b5c"}, - {file = "scikit_learn-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb8f044a8f5962613ce1feb4351d66f8d784bd072d36393582f351859b065f7d"}, - {file = "scikit_learn-1.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a6372c90bbf302387792108379f1ec77719c1618d88496d0df30cb8e370b4661"}, - {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:785ce3c352bf697adfda357c3922c94517a9376002971bc5ea50896144bc8916"}, - {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aba2a20d89936d6e72d95d05e3bf1db55bca5c5920926ad7b92c34f5e7d3bbe"}, - {file = "scikit_learn-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bac5d56b992f8f06816f2cd321eb86071c6f6d44bb4b1cb3d626525820d754b"}, - {file = "scikit_learn-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ae4b0f1b2c77107c096a7e05b33458354107b47775428d1f11b23e30a73e8a"}, - {file = "scikit_learn-1.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5c5c62ffb52c3ffb755eb21fa74cc2cbf2c521bd53f5c04eaa10011dbecf5f80"}, - {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f0d2018ac6fa055dab65fe8a485967990d33c672d55bc254c56c35287b02fab"}, - {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a8918c415c4b4bf1d60c38d32958849a9191c2428ab35d30b78354085c7c7a"}, - {file = "scikit_learn-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:80a21de63275f8bcd7877b3e781679d2ff1eddfed515a599f95b2502a3283d42"}, - {file = "scikit_learn-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0f33bbafb310c26b81c4d41ecaebdbc1f63498a3f13461d50ed9a2e8f24d28e4"}, - {file = "scikit_learn-1.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8b6ac1442ec714b4911e5aef8afd82c691b5c88b525ea58299d455acc4e8dcec"}, - {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05fc5915b716c6cc60a438c250108e9a9445b522975ed37e416d5ea4f9a63381"}, - {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:842b7d6989f3c574685e18da6f91223eb32301d0f93903dd399894250835a6f7"}, - {file = "scikit_learn-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:88bcb586fdff865372df1bc6be88bb7e6f9e0aa080dab9f54f5cac7eca8e2b6b"}, - {file = "scikit_learn-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f77674647dd31f56cb12ed13ed25b6ed43a056fffef051715022d2ebffd7a7d1"}, - {file = "scikit_learn-1.4.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:833999872e2920ce00f3a50839946bdac7539454e200eb6db54898a41f4bfd43"}, - {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970ec697accaef10fb4f51763f3a7b1250f9f0553cf05514d0e94905322a0172"}, - {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923d778f378ebacca2c672ab1740e5a413e437fb45ab45ab02578f8b689e5d43"}, - {file = "scikit_learn-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d041bc95006b545b59e458399e3175ab11ca7a03dc9a74a573ac891f5df1489"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, + {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] joblib = ">=1.2.0" numpy = ">=1.19.5" scipy = ">=1.6.0" -threadpoolctl = ">=2.0.0" +threadpoolctl = ">=3.1.0" [package.extras] -benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -7382,39 +5041,46 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "sentry-sdk" -version = "1.33.1" +version = "2.17.0" description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "sentry-sdk-1.33.1.tar.gz", hash = "sha256:816aeb900a54bba2d9346bad8ffac2d258c4fa09271b95a6533a714e9000f074"}, - {file = "sentry_sdk-1.33.1-py2.py3-none-any.whl", hash = "sha256:1cce906dc86afda1ecd22c4716b0c846639151a3c3b59e23826711c6525c5642"}, + {file = "sentry_sdk-2.17.0-py2.py3-none-any.whl", hash = "sha256:625955884b862cc58748920f9e21efdfb8e0d4f98cca4ab0d3918576d5b606ad"}, + {file = "sentry_sdk-2.17.0.tar.gz", hash = "sha256:dd0a05352b78ffeacced73a94e86f38b32e2eae15fff5f30ca5abb568a72eacf"}, ] [package.dependencies] certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} +urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] arq = ["arq (>=0.23)"] asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] chalice = ["chalice (>=1.16.0)"] clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] -grpcio = ["grpcio (>=1.21.1)"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +litestar = ["litestar (>=2.0.0)"] loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] -pure-eval = ["asttokens", "executing", "pure_eval"] +opentelemetry-experimental = ["opentelemetry-distro"] +pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] @@ -7423,7 +5089,7 @@ sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=5)"] +tornado = ["tornado (>=6)"] [[package]] name = "setproctitle" @@ -7527,76 +5193,97 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "68.2.2" +version = "75.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, + {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, + {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] [[package]] -name = "shapely" -version = "2.0.2" -description = "Manipulation and analysis of geometric objects" +name = "setuptools-scm" +version = "8.1.0" +description = "the blessed package to manage your versions by scm tags" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6ca8cffbe84ddde8f52b297b53f8e0687bd31141abb2c373fd8a9f032df415d6"}, - {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:baa14fc27771e180c06b499a0a7ba697c7988c7b2b6cba9a929a19a4d2762de3"}, - {file = "shapely-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36480e32c434d168cdf2f5e9862c84aaf4d714a43a8465ae3ce8ff327f0affb7"}, - {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef753200cbffd4f652efb2c528c5474e5a14341a473994d90ad0606522a46a2"}, - {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a41ff4323fc9d6257759c26eb1cf3a61ebc7e611e024e6091f42977303fd3a"}, - {file = "shapely-2.0.2-cp310-cp310-win32.whl", hash = "sha256:72b5997272ae8c25f0fd5b3b967b3237e87fab7978b8d6cd5fa748770f0c5d68"}, - {file = "shapely-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:34eac2337cbd67650248761b140d2535855d21b969d76d76123317882d3a0c1a"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b0c052709c8a257c93b0d4943b0b7a3035f87e2d6a8ac9407b6a992d206422f"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d217e56ae067e87b4e1731d0dc62eebe887ced729ba5c2d4590e9e3e9fdbd88"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94ac128ae2ab4edd0bffcd4e566411ea7bdc738aeaf92c32a8a836abad725f9f"}, - {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3ee28f5e63a130ec5af4dc3c4cb9c21c5788bb13c15e89190d163b14f9fb89"}, - {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:737dba15011e5a9b54a8302f1748b62daa207c9bc06f820cd0ad32a041f1c6f2"}, - {file = "shapely-2.0.2-cp311-cp311-win32.whl", hash = "sha256:45ac6906cff0765455a7b49c1670af6e230c419507c13e2f75db638c8fc6f3bd"}, - {file = "shapely-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:dc9342fc82e374130db86a955c3c4525bfbf315a248af8277a913f30911bed9e"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:06f193091a7c6112fc08dfd195a1e3846a64306f890b151fa8c63b3e3624202c"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eebe544df5c018134f3c23b6515877f7e4cd72851f88a8d0c18464f414d141a2"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7e92e7c255f89f5cdf777690313311f422aa8ada9a3205b187113274e0135cd8"}, - {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be46d5509b9251dd9087768eaf35a71360de6afac82ce87c636990a0871aa18b"}, - {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5533a925d8e211d07636ffc2fdd9a7f9f13d54686d00577eeb11d16f00be9c4"}, - {file = "shapely-2.0.2-cp312-cp312-win32.whl", hash = "sha256:084b023dae8ad3d5b98acee9d3bf098fdf688eb0bb9b1401e8b075f6a627b611"}, - {file = "shapely-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:ea84d1cdbcf31e619d672b53c4532f06253894185ee7acb8ceb78f5f33cbe033"}, - {file = "shapely-2.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ed1e99702125e7baccf401830a3b94d810d5c70b329b765fe93451fe14cf565b"}, - {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7d897e6bdc6bc64f7f65155dbbb30e49acaabbd0d9266b9b4041f87d6e52b3a"}, - {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0521d76d1e8af01e712db71da9096b484f081e539d4f4a8c97342e7971d5e1b4"}, - {file = "shapely-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:5324be299d4c533ecfcfd43424dfd12f9428fd6f12cda38a4316da001d6ef0ea"}, - {file = "shapely-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:78128357a0cee573257a0c2c388d4b7bf13cb7dbe5b3fe5d26d45ebbe2a39e25"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87dc2be34ac3a3a4a319b963c507ac06682978a5e6c93d71917618b14f13066e"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42997ac806e4583dad51c80a32d38570fd9a3d4778f5e2c98f9090aa7db0fe91"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ccfd5fa10a37e67dbafc601c1ddbcbbfef70d34c3f6b0efc866ddbdb55893a6c"}, - {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7c95d3379ae3abb74058938a9fcbc478c6b2e28d20dace38f8b5c587dde90aa"}, - {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a21353d28209fb0d8cc083e08ca53c52666e0d8a1f9bbe23b6063967d89ed24"}, - {file = "shapely-2.0.2-cp38-cp38-win32.whl", hash = "sha256:03e63a99dfe6bd3beb8d5f41ec2086585bb969991d603f9aeac335ad396a06d4"}, - {file = "shapely-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:c6fd29fbd9cd76350bd5cc14c49de394a31770aed02d74203e23b928f3d2f1aa"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f217d28ecb48e593beae20a0082a95bd9898d82d14b8fcb497edf6bff9a44d7"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:394e5085b49334fd5b94fa89c086edfb39c3ecab7f669e8b2a4298b9d523b3a5"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd3ad17b64466a033848c26cb5b509625c87d07dcf39a1541461cacdb8f7e91c"}, - {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d41a116fcad58048d7143ddb01285e1a8780df6dc1f56c3b1e1b7f12ed296651"}, - {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dea9a0651333cf96ef5bb2035044e3ad6a54f87d90e50fe4c2636debf1b77abc"}, - {file = "shapely-2.0.2-cp39-cp39-win32.whl", hash = "sha256:b8eb0a92f7b8c74f9d8fdd1b40d395113f59bd8132ca1348ebcc1f5aece94b96"}, - {file = "shapely-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:794affd80ca0f2c536fc948a3afa90bd8fb61ebe37fe873483ae818e7f21def4"}, - {file = "shapely-2.0.2.tar.gz", hash = "sha256:1713cc04c171baffc5b259ba8531c58acc2a301707b7f021d88a15ed090649e7"}, + {file = "setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3"}, + {file = "setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7"}, ] [package.dependencies] -numpy = ">=1.14" +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["entangled-cli (>=2.0,<3.0)", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "typing-extensions", "wheel"] + +[[package]] +name = "shap" +version = "0.46.0" +description = "A unified approach to explain the output of any machine learning model." +optional = false +python-versions = ">=3.9" +files = [ + {file = "shap-0.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:905b2d7a0262ef820785a7c0e3c7f24c9d281e6f934edb65cbe811fe0e971187"}, + {file = "shap-0.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bccbb30ffbf8b9ed53e476d0c1319fdfcbeac455fe9df277fb0d570d92790e80"}, + {file = "shap-0.46.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9633d3d7174acc01455538169ca6e6344f570530384548631aeadcf7bfdaaaea"}, + {file = "shap-0.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6097eb2ab7e8c194254bac3e462266490fbdd43bfe35a1014e9ee21c4ef10ee"}, + {file = "shap-0.46.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0cf7c6e3f056cf3bfd16bcfd5744d0cc25b851555b1e750a3ab889b3077d2d05"}, + {file = "shap-0.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:949bd7fa40371c3f1885a30ae0611dd481bf4ac90066ff726c73cb5bb393032b"}, + {file = "shap-0.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f18217c98f39fd485d541f6aab0b860b3be74b69b21d4faf11959e3fcba765c5"}, + {file = "shap-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5bbdae4489577c6fce1cfe2d9d8f3d5b96d69284d29645fe651f78f6e965aeb4"}, + {file = "shap-0.46.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13d36dc58d1e8c010feb4e7da71c77d23626a52d12d16b02869e793b11be4695"}, + {file = "shap-0.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70e06fdfdf53d5fb932c82f4529397552b262e0ccce734f5226fb1e1eab2bc3e"}, + {file = "shap-0.46.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:943f0806fa00b4fafb174f172a73d88de2d8600e6d69c2e2bff833f00e6c4c21"}, + {file = "shap-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:c972a2efdc9fc00d543efaa55805eca947b8c418d065962d967824c2d5d295d0"}, + {file = "shap-0.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a9cc9be191562bea1a782baff912854d267c6f4831bbf454d8d7bb7df7ddb214"}, + {file = "shap-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab1fecfb43604605be17e26ae12bde4406c451c46b54b980d9570cec03fbc239"}, + {file = "shap-0.46.0-cp312-cp312-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b216adf2a17b0e0694f17965ac29354ca8c4f27ac3c66f68bf6fc4cb2aa28207"}, + {file = "shap-0.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6e5dc5257b747a784f7a9b3acb64216a9011f01734f3c96b27fe5e15ae5f99f"}, + {file = "shap-0.46.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1230bf973463041dfa15734f290fbf3ab9c6e4e8222339c76f68fc355b940d80"}, + {file = "shap-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:0cbbf996537b2a42d3bc7f2a13492988822ee1bfd7220700989408dfb9e1c5ad"}, + {file = "shap-0.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c7d0c53a8cbefb2260ce28a98fa866c1a287770981f95c40a54f9d1082cbb31"}, + {file = "shap-0.46.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0726f8c63f09dde586c9859ad315641f5a080e9aecf123a0cabc336b61703d66"}, + {file = "shap-0.46.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99edc28daac4cbb98cd9f02febf4e9fbc6b9e3d24519c22ed59a98c68c47336c"}, + {file = "shap-0.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a6ff9c9e15abd9a332360cff8d105165a600466167d6274dab468a050d005a"}, + {file = "shap-0.46.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9f9f9727839e2459dfa4b4fbc190224e87f7b4b2a29f0e2a438500215921192b"}, + {file = "shap-0.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:b169b485a69f7d32e32fa64ad77be00129436c4455b9d0997b21b553f0becc8c"}, + {file = "shap-0.46.0.tar.gz", hash = "sha256:bdaa5b098be5a958348015e940f6fd264339b5db1e651f9898a3117be95b05a0"}, +] + +[package.dependencies] +cloudpickle = "*" +numba = "*" +numpy = "*" +packaging = ">20.9" +pandas = "*" +scikit-learn = "*" +scipy = "*" +slicer = "0.0.8" +tqdm = ">=4.27.0" [package.extras] -docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov"] +docs = ["ipython", "matplotlib", "myst-parser (==2.0.0)", "nbsphinx (==0.9.3)", "numpydoc", "requests", "sphinx (==7.2.6)", "sphinx-github-changelog (==1.2.1)", "sphinx-rtd-theme (==2.0.0)"] +others = ["lime"] +plots = ["ipython", "matplotlib"] +test = ["catboost", "gpboost", "lightgbm", "ngboost", "opencv-python", "protobuf (==3.20.3)", "pyod", "pyspark", "pytest", "pytest-cov", "pytest-mpl", "sentencepiece", "tensorflow", "tf-keras", "torch", "torch (==2.2.0)", "torchvision", "transformers", "xgboost"] +test-core = ["pytest", "pytest-cov", "pytest-mpl"] +test-notebooks = ["datasets", "jupyter", "keras", "nbconvert", "nbformat", "nlp", "transformers"] [[package]] name = "shellingham" @@ -7621,25 +5308,47 @@ files = [ ] [[package]] -name = "smmap" -version = "5.0.1" -description = "A pure Python implementation of a sliding window memory map manager" +name = "skops" +version = "0.10.0" +description = "A set of tools to push scikit-learn based models to and pull from Hugging Face Hub" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, - {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, + {file = "skops-0.10.0-py3-none-any.whl", hash = "sha256:2a8a8efe7dca350f920cb0d18a2b79168520ebf28ac7dda78c51c31878583622"}, + {file = "skops-0.10.0.tar.gz", hash = "sha256:95645999976e296a55af5d1c96a4ae5e683dee0c6af711634cd5286a224053b7"}, +] + +[package.dependencies] +huggingface-hub = ">=0.17.0" +packaging = ">=17.0" +scikit-learn = ">=0.24" +tabulate = ">=0.8.8" + +[package.extras] +docs = ["fairlearn (>=0.7.0)", "matplotlib (>=3.3)", "numpydoc (>=1.0.0)", "pandas (>=1)", "sphinx (>=3.2.0)", "sphinx-gallery (>=0.7.0)", "sphinx-issues (>=1.2.0)", "sphinx-prompt (>=1.3.0)", "sphinx-rtd-theme (>=1)"] +rich = ["rich (>=12)"] +tests = ["catboost (>=1.0)", "fairlearn (>=0.7.0)", "flake8 (>=3.8.2)", "flaky (>=3.7.0)", "lightgbm (>=3)", "matplotlib (>=3.3)", "pandas (>=1)", "pytest (>=7)", "pytest-cov (>=2.9.0)", "quantile-forest (>=1.0.0)", "rich (>=12)", "types-requests (>=2.28.5)", "xgboost (>=1.6)"] + +[[package]] +name = "slicer" +version = "0.0.8" +description = "A small package for big slicing." +optional = false +python-versions = ">=3.6" +files = [ + {file = "slicer-0.0.8-py3-none-any.whl", hash = "sha256:6c206258543aecd010d497dc2eca9d2805860a0b3758673903456b7df7934dc3"}, + {file = "slicer-0.0.8.tar.gz", hash = "sha256:2e7553af73f0c0c2d355f4afcc3ecf97c6f2156fcf4593955c3f56cf6c4d6eb7"}, ] [[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] [[package]] @@ -7655,196 +5364,15 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - -[[package]] -name = "sqlalchemy" -version = "1.4.50" -description = "Database Abstraction Library" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "SQLAlchemy-1.4.50-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:54138aa80d2dedd364f4e8220eef284c364d3270aaef621570aa2bd99902e2e8"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-win32.whl", hash = "sha256:6c78e3fb4a58e900ec433b6b5f4efe1a0bf81bbb366ae7761c6e0051dd310ee3"}, - {file = "SQLAlchemy-1.4.50-cp310-cp310-win_amd64.whl", hash = "sha256:d55f7a33e8631e15af1b9e67c9387c894fedf6deb1a19f94be8731263c51d515"}, - {file = "SQLAlchemy-1.4.50-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:324b1fdd50e960a93a231abb11d7e0f227989a371e3b9bd4f1259920f15d0304"}, - {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7"}, - {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace"}, - {file = "SQLAlchemy-1.4.50-cp311-cp311-win32.whl", hash = "sha256:8bdab03ff34fc91bfab005e96f672ae207d87e0ac7ee716d74e87e7046079d8b"}, - {file = "SQLAlchemy-1.4.50-cp311-cp311-win_amd64.whl", hash = "sha256:52e01d60b06f03b0a5fc303c8aada405729cbc91a56a64cead8cb7c0b9b13c1a"}, - {file = "SQLAlchemy-1.4.50-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:77fde9bf74f4659864c8e26ac08add8b084e479b9a18388e7db377afc391f926"}, - {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc"}, - {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75"}, - {file = "SQLAlchemy-1.4.50-cp312-cp312-win32.whl", hash = "sha256:e86c920b7d362cfa078c8b40e7765cbc34efb44c1007d7557920be9ddf138ec7"}, - {file = "SQLAlchemy-1.4.50-cp312-cp312-win_amd64.whl", hash = "sha256:6b3df20fbbcbcd1c1d43f49ccf3eefb370499088ca251ded632b8cbaee1d497d"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fb9adc4c6752d62c6078c107d23327aa3023ef737938d0135ece8ffb67d07030"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-win32.whl", hash = "sha256:1b9c4359d3198f341480e57494471201e736de459452caaacf6faa1aca852bd8"}, - {file = "SQLAlchemy-1.4.50-cp36-cp36m-win_amd64.whl", hash = "sha256:35e4520f7c33c77f2636a1e860e4f8cafaac84b0b44abe5de4c6c8890b6aaa6d"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:f5b1fb2943d13aba17795a770d22a2ec2214fc65cff46c487790192dda3a3ee7"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-win32.whl", hash = "sha256:7b4396452273aedda447e5aebe68077aa7516abf3b3f48408793e771d696f397"}, - {file = "SQLAlchemy-1.4.50-cp37-cp37m-win_amd64.whl", hash = "sha256:752f9df3dddbacb5f42d8405b2d5885675a93501eb5f86b88f2e47a839cf6337"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:35c7ed095a4b17dbc8813a2bfb38b5998318439da8e6db10a804df855e3a9e3a"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-win32.whl", hash = "sha256:8a219688297ee5e887a93ce4679c87a60da4a5ce62b7cb4ee03d47e9e767f558"}, - {file = "SQLAlchemy-1.4.50-cp38-cp38-win_amd64.whl", hash = "sha256:a648770db002452703b729bdcf7d194e904aa4092b9a4d6ab185b48d13252f63"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:4be4da121d297ce81e1ba745a0a0521c6cf8704634d7b520e350dce5964c71ac"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-win32.whl", hash = "sha256:a7c9b9dca64036008962dd6b0d9fdab2dfdbf96c82f74dbd5d86006d8d24a30f"}, - {file = "SQLAlchemy-1.4.50-cp39-cp39-win_amd64.whl", hash = "sha256:df200762efbd672f7621b253721644642ff04a6ff957236e0e2fe56d9ca34d2c"}, - {file = "SQLAlchemy-1.4.50.tar.gz", hash = "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "sqlalchemy-bigquery" -version = "1.8.0" -description = "SQLAlchemy dialect for BigQuery" -optional = false -python-versions = ">=3.7, <3.12" -files = [ - {file = "sqlalchemy-bigquery-1.8.0.tar.gz", hash = "sha256:fdc58cc23415b9e251dc90a97052a4831894c15b1b54911909d746696eba6f38"}, - {file = "sqlalchemy_bigquery-1.8.0-py2.py3-none-any.whl", hash = "sha256:d755a9f820c373858cc799fd4b03d334fb1c372e21a6d224f82eb4f10db00124"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0.0dev" -google-cloud-bigquery = ">=2.25.2,<4.0.0dev" -packaging = "*" -sqlalchemy = ">=1.2.0,<2.0.0dev" - -[package.extras] -alembic = ["alembic"] -all = ["GeoAlchemy2", "alembic", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "packaging", "pyarrow (>=3.0.0)", "pytz", "shapely"] -bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geography = ["GeoAlchemy2", "shapely"] -tests = ["packaging", "pytz"] - -[[package]] -name = "sqlalchemy-jsonfield" -version = "1.0.1.post0" -description = "SQLALchemy JSONField implementation for storing dicts at SQL" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "SQLAlchemy-JSONField-1.0.1.post0.tar.gz", hash = "sha256:72a5e714fe0493d2660abd7484a9fd9f492f493a0856288dd22a5decb29f5dc4"}, - {file = "SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl", hash = "sha256:d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4"}, -] - -[package.dependencies] -sqlalchemy = "*" - -[[package]] -name = "sqlalchemy-spanner" -version = "1.6.2" -description = "SQLAlchemy dialect integrated into Cloud Spanner database" -optional = false -python-versions = "*" -files = [ - {file = "sqlalchemy-spanner-1.6.2.tar.gz", hash = "sha256:093aed5b46d75a075a259d7aa8fbead4924190535461756cd6b86e19f1592c58"}, - {file = "sqlalchemy_spanner-1.6.2-py3-none-any.whl", hash = "sha256:901d5fe35d105baf58dce9f8098e903f399e9d6f9ccd027964bea853c9e4e507"}, -] - -[package.dependencies] -alembic = "*" -google-cloud-spanner = ">=3.12.0" -sqlalchemy = ">=1.1.13" - -[package.extras] -tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] - -[[package]] -name = "sqlalchemy-utils" -version = "0.41.1" -description = "Various utility functions for SQLAlchemy." -optional = false -python-versions = ">=3.6" -files = [ - {file = "SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74"}, - {file = "SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"}, -] - -[package.dependencies] -SQLAlchemy = ">=1.3" - -[package.extras] -arrow = ["arrow (>=0.3.4)"] -babel = ["Babel (>=1.3)"] -color = ["colour (>=0.0.4)"] -encrypted = ["cryptography (>=0.6)"] -intervals = ["intervals (>=0.7.1)"] -password = ["passlib (>=1.6,<2.0)"] -pendulum = ["pendulum (>=2.0.5)"] -phone = ["phonenumbers (>=5.9.2)"] -test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -timezone = ["python-dateutil"] -url = ["furl (>=0.4.1)"] - -[[package]] -name = "sqlparse" -version = "0.4.4" -description = "A non-validating SQL parser." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] -[package.extras] -dev = ["build", "flake8"] -doc = ["sphinx"] -test = ["pytest", "pytest-cov"] - [[package]] name = "stack-data" version = "0.6.3" @@ -7880,369 +5408,320 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.2.3" +version = "9.0.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "termcolor" -version = "2.3.0" +version = "2.5.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, - {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [package.extras] tests = ["pytest", "pytest-cov"] -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -optional = false -python-versions = "*" -files = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] - [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.5.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, -] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] -name = "tomlkit" -version = "0.12.3" -description = "Style preserving TOML library" +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] -name = "tornado" -version = "6.3.3" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +name = "tqdm" +version = "4.66.6" +description = "Fast, Extensible Progress Meter" optional = false -python-versions = ">= 3.8" +python-versions = ">=3.7" files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"}, + {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"}, ] +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typer" -version = "0.9.0" +version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, - {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] - [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, -] - -[[package]] -name = "uc-micro-py" -version = "1.0.2" -description = "Micro subset of unicode data files for linkify-it-py projects." -optional = false -python-versions = ">=3.7" -files = [ - {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, - {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, -] - -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "unicodecsv" -version = "0.14.1" -description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." -optional = false -python-versions = "*" -files = [ - {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, -] - -[[package]] -name = "universal-pathlib" -version = "0.1.4" -description = "pathlib api extended to use fsspec backends" -optional = false -python-versions = ">=3.8" -files = [ - {file = "universal_pathlib-0.1.4-py3-none-any.whl", hash = "sha256:f99186cf950bde1262de9a590bb019613ef84f9fabd9f276e8b019722201943a"}, - {file = "universal_pathlib-0.1.4.tar.gz", hash = "sha256:82e5d86d16a27e0ea1adc7d88acbcba9d02d5a45488163174f96d9ac289db2e4"}, -] - -[package.dependencies] -fsspec = ">=2022.1.0" - -[package.extras] -dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "hadoop-test-cluster", "moto[s3,server]", "mypy (==1.3.0)", "packaging", "pyarrow", "pydantic", "pydantic-settings", "pylint (==2.17.4)", "pytest (==7.3.2)", "pytest-cov (==4.1.0)", "pytest-mock (==3.11.1)", "pytest-sugar (==0.9.6)", "requests", "s3fs", "webdav4[fsspec]", "wsgidav"] -tests = ["mypy (==1.3.0)", "packaging", "pylint (==2.17.4)", "pytest (==7.3.2)", "pytest-cov (==4.1.0)", "pytest-mock (==3.11.1)", "pytest-sugar (==0.9.6)"] - -[[package]] -name = "uritemplate" -version = "4.1.1" -description = "Implementation of RFC 6570 URI Templates" -optional = false -python-versions = ">=3.6" -files = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvloop" -version = "0.19.0" +version = "0.21.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, - {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, - {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, - {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, - {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, - {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, - {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, - {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, - {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, - {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, - {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, - {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, - {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, - {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, - {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, - {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, - {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, - {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, - {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, - {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, - {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, - {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, - {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, - {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, - {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, -] - -[package.extras] + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, + {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +] + +[package.extras] +dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] +test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "virtualenv" -version = "20.24.6" +version = "20.27.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, - {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, + {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "wandb" -version = "0.16.2" +version = "0.18.5" description = "A CLI and library for interacting with the Weights & Biases API." optional = false python-versions = ">=3.7" files = [ - {file = "wandb-0.16.2-py3-none-any.whl", hash = "sha256:6b119cf3c01f35e7276b62d052128e5320621d182c9eb5796a12cf62a9b3134f"}, - {file = "wandb-0.16.2.tar.gz", hash = "sha256:e40cd79ea6272fe4762a80b9f47b172e141daeb3b56eb9d1e192ebd10752e64e"}, + {file = "wandb-0.18.5-py3-none-any.whl", hash = "sha256:49ba7bafff0cecff2159bc6fb68176d6e5561d744a9bd6a63753e7077a74e26d"}, + {file = "wandb-0.18.5-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c9d903dbff9517843881d9a0d561d82bcf0e949d8b8c03aafa35aceef31ea7e0"}, + {file = "wandb-0.18.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:33d3e5765a9bb305558af4f291338cf8723856d2b3a3c377414cd8f8b711baa4"}, + {file = "wandb-0.18.5-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:9ff72e7a45e998e2a7ff42645ec76bedabf17ea51fd112ae2837dce5023ac0cc"}, + {file = "wandb-0.18.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:136a79c06c114c225add8f977acec23d53df5e2a4d2803700a5eb5501ae40160"}, + {file = "wandb-0.18.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:350fc0f6f5bc23f4baeef12ccfea6daa89d1a5b84948d72d48249cbb652ab22a"}, + {file = "wandb-0.18.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4e31741eefa2b2a83aa9f69ef27ce6112fee6f4c792a9e2996cf374a74465276"}, + {file = "wandb-0.18.5-py3-none-win32.whl", hash = "sha256:b2a25e9caf63c12e5de1cbdb30b13f76553c04754f9ff404080f70386adb8384"}, + {file = "wandb-0.18.5-py3-none-win_amd64.whl", hash = "sha256:83b619167eb2ffdd1188cba3805ccad158f6fd7fc06bef43daf6d2729a787fa0"}, + {file = "wandb-0.18.5.tar.gz", hash = "sha256:75ef47ba7fc709b787be05e558f1635d99246afeacc9369031c1be6e5b620ce6"}, ] [package.dependencies] -appdirs = ">=1.4.3" -Click = ">=7.1,<8.0.0 || >8.0.0" +click = ">=7.1,<8.0.0 || >8.0.0" docker-pycreds = ">=0.4.0" -GitPython = ">=1.0.0,<3.1.29 || >3.1.29" -protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} +gitpython = ">=1.0.0,<3.1.29 || >3.1.29" +platformdirs = "*" +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<6", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} psutil = ">=5.0.0" -PyYAML = "*" +pyyaml = "*" requests = ">=2.0.0,<3" -sentry-sdk = ">=1.0.0" +sentry-sdk = ">=2.0.0" setproctitle = "*" setuptools = "*" +typing-extensions = {version = ">=4.4,<5", markers = "python_version < \"3.12\""} [package.extras] -async = ["httpx (>=0.23.0)"] aws = ["boto3"] azure = ["azure-identity", "azure-storage-blob"] gcp = ["google-cloud-storage"] +importers = ["filelock", "mlflow", "polars (<=1.2.1)", "rich", "tenacity"] kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] -launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "typing-extensions"] -media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"] +launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "typing-extensions"] +media = ["bokeh", "imageio", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit", "soundfile"] models = ["cloudpickle"] perf = ["orjson"] sweeps = ["sweeps (>=0.2.0)"] +workspaces = ["wandb-workspaces"] [[package]] name = "watchdog" -version = "3.0.0" +version = "5.0.3" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -8250,13 +5729,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcmatch" -version = "8.5" +version = "10.0" description = "Wildcard/glob file name matcher." optional = false python-versions = ">=3.8" files = [ - {file = "wcmatch-8.5-py3-none-any.whl", hash = "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5"}, - {file = "wcmatch-8.5.tar.gz", hash = "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3"}, + {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, + {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, ] [package.dependencies] @@ -8264,169 +5743,103 @@ bracex = ">=2.1.1" [[package]] name = "wcwidth" -version = "0.2.9" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, - {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "werkzeug" -version = "2.3.7" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, - {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, -] - -[[package]] -name = "wtforms" -version = "3.0.1" -description = "Form validation and rendering for Python web development." -optional = false -python-versions = ">=3.7" -files = [ - {file = "WTForms-3.0.1-py3-none-any.whl", hash = "sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b"}, - {file = "WTForms-3.0.1.tar.gz", hash = "sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc"}, -] - -[package.dependencies] -MarkupSafe = "*" - -[package.extras] -email = ["email-validator"] - -[[package]] -name = "xgboost" -version = "1.7.6" -description = "XGBoost Python Package" -optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "xgboost-1.7.6-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:4c34675b4d2678c624ddde5d45361e7e16046923e362e4e609b88353e6b87124"}, - {file = "xgboost-1.7.6-py3-none-macosx_12_0_arm64.whl", hash = "sha256:59b4b366d2cafc7f645e87d897983a5b59be02876194b1d213bd8d8b811d8ce8"}, - {file = "xgboost-1.7.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:281c3c6f4fbed2d36bf95cd02a641afa95e72e9abde70064056da5e76233e8df"}, - {file = "xgboost-1.7.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b1d5db49b199152d62bd9217c98760207d3de86d2b9d243260c573ffe638f80a"}, - {file = "xgboost-1.7.6-py3-none-win_amd64.whl", hash = "sha256:127cf1f5e2ec25cd41429394c6719b87af1456ce583e89f0bffd35d02ad18bcb"}, - {file = "xgboost-1.7.6.tar.gz", hash = "sha256:1c527554a400445e0c38186039ba1a00425dcdb4e40b37eed0e74cb39a159c47"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] -[package.dependencies] -numpy = "*" -scipy = "*" - -[package.extras] -dask = ["dask", "distributed", "pandas"] -datatable = ["datatable"] -pandas = ["pandas"] -plotting = ["graphviz", "matplotlib"] -pyspark = ["cloudpickle", "pyspark", "scikit-learn"] -scikit-learn = ["scikit-learn"] - [[package]] name = "xyzservices" -version = "2023.10.1" +version = "2024.9.0" description = "Source of XYZ tiles providers" optional = false python-versions = ">=3.8" files = [ - {file = "xyzservices-2023.10.1-py3-none-any.whl", hash = "sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68"}, - {file = "xyzservices-2023.10.1.tar.gz", hash = "sha256:091229269043bc8258042edbedad4fcb44684b0473ede027b5672ad40dc9fa02"}, + {file = "xyzservices-2024.9.0-py3-none-any.whl", hash = "sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644"}, + {file = "xyzservices-2024.9.0.tar.gz", hash = "sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde"}, ] [[package]] @@ -8449,107 +5862,101 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [[package]] name = "yarl" -version = "1.9.2" +version = "1.17.0" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d8715edfe12eee6f27f32a3655f38d6c7410deb482158c0b7d4b7fad5d07628"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1803bf2a7a782e02db746d8bd18f2384801bc1d108723840b25e065b116ad726"}, + {file = "yarl-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e66589110e20c2951221a938fa200c7aa134a8bdf4e4dc97e6b21539ff026d4"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7069d411cfccf868e812497e0ec4acb7c7bf8d684e93caa6c872f1e6f5d1664d"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbf70ba16118db3e4b0da69dcde9d4d4095d383c32a15530564c283fa38a7c52"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0bc53cc349675b32ead83339a8de79eaf13b88f2669c09d4962322bb0f064cbc"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6aa18a402d1c80193ce97c8729871f17fd3e822037fbd7d9b719864018df746"}, + {file = "yarl-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d89c5bc701861cfab357aa0cd039bc905fe919997b8c312b4b0c358619c38d4d"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b728bdf38ca58f2da1d583e4af4ba7d4cd1a58b31a363a3137a8159395e7ecc7"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:5542e57dc15d5473da5a39fbde14684b0cc4301412ee53cbab677925e8497c11"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e564b57e5009fb150cb513804d7e9e9912fee2e48835638f4f47977f88b4a39c"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:eb3c4cff524b4c1c1dba3a6da905edb1dfd2baf6f55f18a58914bbb2d26b59e1"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:05e13f389038842da930d439fbed63bdce3f7644902714cb68cf527c971af804"}, + {file = "yarl-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:153c38ee2b4abba136385af4467459c62d50f2a3f4bde38c7b99d43a20c143ef"}, + {file = "yarl-1.17.0-cp310-cp310-win32.whl", hash = "sha256:4065b4259d1ae6f70fd9708ffd61e1c9c27516f5b4fae273c41028afcbe3a094"}, + {file = "yarl-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:abf366391a02a8335c5c26163b5fe6f514cc1d79e74d8bf3ffab13572282368e"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19a4fe0279626c6295c5b0c8c2bb7228319d2e985883621a6e87b344062d8135"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cadd0113f4db3c6b56868d6a19ca6286f5ccfa7bc08c27982cf92e5ed31b489a"}, + {file = "yarl-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:60d6693eef43215b1ccfb1df3f6eae8db30a9ff1e7989fb6b2a6f0b468930ee8"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb8bf3843e1fa8cf3fe77813c512818e57368afab7ebe9ef02446fe1a10b492"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2a5b35fd1d8d90443e061d0c8669ac7600eec5c14c4a51f619e9e105b136715"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5bf17b32f392df20ab5c3a69d37b26d10efaa018b4f4e5643c7520d8eee7ac7"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f51b529b958cd06e78158ff297a8bf57b4021243c179ee03695b5dbf9cb6e1"}, + {file = "yarl-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fcaa06bf788e19f913d315d9c99a69e196a40277dc2c23741a1d08c93f4d430"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32f3ee19ff0f18a7a522d44e869e1ebc8218ad3ae4ebb7020445f59b4bbe5897"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a4fb69a81ae2ec2b609574ae35420cf5647d227e4d0475c16aa861dd24e840b0"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7bacc8b77670322132a1b2522c50a1f62991e2f95591977455fd9a398b4e678d"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:437bf6eb47a2d20baaf7f6739895cb049e56896a5ffdea61a4b25da781966e8b"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30534a03c87484092080e3b6e789140bd277e40f453358900ad1f0f2e61fc8ec"}, + {file = "yarl-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b30df4ff98703649915144be6f0df3b16fd4870ac38a09c56d5d9e54ff2d5f96"}, + {file = "yarl-1.17.0-cp311-cp311-win32.whl", hash = "sha256:263b487246858e874ab53e148e2a9a0de8465341b607678106829a81d81418c6"}, + {file = "yarl-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:07055a9e8b647a362e7d4810fe99d8f98421575e7d2eede32e008c89a65a17bd"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84095ab25ba69a8fa3fb4936e14df631b8a71193fe18bd38be7ecbe34d0f5512"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02608fb3f6df87039212fc746017455ccc2a5fc96555ee247c45d1e9f21f1d7b"}, + {file = "yarl-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13468d291fe8c12162b7cf2cdb406fe85881c53c9e03053ecb8c5d3523822cd9"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8da3f8f368fb7e2f052fded06d5672260c50b5472c956a5f1bd7bf474ae504ab"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec0507ab6523980bed050137007c76883d941b519aca0e26d4c1ec1f297dd646"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08fc76df7fd8360e9ff30e6ccc3ee85b8dbd6ed5d3a295e6ec62bcae7601b932"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d522f390686acb6bab2b917dd9ca06740c5080cd2eaa5aef8827b97e967319d"}, + {file = "yarl-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:147c527a80bb45b3dcd6e63401af8ac574125d8d120e6afe9901049286ff64ef"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:24cf43bcd17a0a1f72284e47774f9c60e0bf0d2484d5851f4ddf24ded49f33c6"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c28a44b9e0fba49c3857360e7ad1473fc18bc7f6659ca08ed4f4f2b9a52c75fa"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:350cacb2d589bc07d230eb995d88fcc646caad50a71ed2d86df533a465a4e6e1"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fd1ab1373274dea1c6448aee420d7b38af163b5c4732057cd7ee9f5454efc8b1"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4934e0f96dadc567edc76d9c08181633c89c908ab5a3b8f698560124167d9488"}, + {file = "yarl-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8d0a278170d75c88e435a1ce76557af6758bfebc338435b2eba959df2552163e"}, + {file = "yarl-1.17.0-cp312-cp312-win32.whl", hash = "sha256:61584f33196575a08785bb56db6b453682c88f009cd9c6f338a10f6737ce419f"}, + {file = "yarl-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9987a439ad33a7712bd5bbd073f09ad10d38640425fa498ecc99d8aa064f8fc4"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8deda7b8eb15a52db94c2014acdc7bdd14cb59ec4b82ac65d2ad16dc234a109e"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56294218b348dcbd3d7fce0ffd79dd0b6c356cb2a813a1181af730b7c40de9e7"}, + {file = "yarl-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1fab91292f51c884b290ebec0b309a64a5318860ccda0c4940e740425a67b6b7"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf93fa61ff4d9c7d40482ce1a2c9916ca435e34a1b8451e17f295781ccc034f"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:261be774a0d71908c8830c33bacc89eef15c198433a8cc73767c10eeeb35a7d0"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deec9693b67f6af856a733b8a3e465553ef09e5e8ead792f52c25b699b8f9e6e"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c804b07622ba50a765ca7fb8145512836ab65956de01307541def869e4a456c9"}, + {file = "yarl-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d013a7c9574e98c14831a8f22d27277688ec3b2741d0188ac01a910b009987a"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e2cfcba719bd494c7413dcf0caafb51772dec168c7c946e094f710d6aa70494e"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c068aba9fc5b94dfae8ea1cedcbf3041cd4c64644021362ffb750f79837e881f"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3616df510ffac0df3c9fa851a40b76087c6c89cbcea2de33a835fc80f9faac24"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:755d6176b442fba9928a4df787591a6a3d62d4969f05c406cad83d296c5d4e05"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c18f6e708d1cf9ff5b1af026e697ac73bea9cb70ee26a2b045b112548579bed2"}, + {file = "yarl-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b937c216b6dee8b858c6afea958de03c5ff28406257d22b55c24962a2baf6fd"}, + {file = "yarl-1.17.0-cp313-cp313-win32.whl", hash = "sha256:d0131b14cb545c1a7bd98f4565a3e9bdf25a1bd65c83fc156ee5d8a8499ec4a3"}, + {file = "yarl-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:01c96efa4313c01329e88b7e9e9e1b2fc671580270ddefdd41129fa8d0db7696"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d44f67e193f0a7acdf552ecb4d1956a3a276c68e7952471add9f93093d1c30d"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16ea0aa5f890cdcb7ae700dffa0397ed6c280840f637cd07bffcbe4b8d68b985"}, + {file = "yarl-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf5469dc7dcfa65edf5cc3a6add9f84c5529c6b556729b098e81a09a92e60e51"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e662bf2f6e90b73cf2095f844e2bc1fda39826472a2aa1959258c3f2a8500a2f"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8260e88f1446904ba20b558fa8ce5d0ab9102747238e82343e46d056d7304d7e"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dc16477a4a2c71e64c5d3d15d7ae3d3a6bb1e8b955288a9f73c60d2a391282f"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46027e326cecd55e5950184ec9d86c803f4f6fe4ba6af9944a0e537d643cdbe0"}, + {file = "yarl-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc95e46c92a2b6f22e70afe07e34dbc03a4acd07d820204a6938798b16f4014f"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:16ca76c7ac9515320cd09d6cc083d8d13d1803f6ebe212b06ea2505fd66ecff8"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:eb1a5b97388f2613f9305d78a3473cdf8d80c7034e554d8199d96dcf80c62ac4"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:41fd5498975418cdc34944060b8fbeec0d48b2741068077222564bea68daf5a6"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:146ca582ed04a5664ad04b0e0603934281eaab5c0115a5a46cce0b3c061a56a1"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6abb8c06107dbec97481b2392dafc41aac091a5d162edf6ed7d624fe7da0587a"}, + {file = "yarl-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d14be4613dd4f96c25feb4bd8c0d8ce0f529ab0ae555a17df5789e69d8ec0c5"}, + {file = "yarl-1.17.0-cp39-cp39-win32.whl", hash = "sha256:174d6a6cad1068f7850702aad0c7b1bca03bcac199ca6026f84531335dfc2646"}, + {file = "yarl-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:6af417ca2c7349b101d3fd557ad96b4cd439fdb6ab0d288e3f64a068eea394d0"}, + {file = "yarl-1.17.0-py3-none-any.whl", hash = "sha256:62dd42bb0e49423f4dd58836a04fcf09c80237836796025211bbe913f1524993"}, + {file = "yarl-1.17.0.tar.gz", hash = "sha256:d3f13583f378930377e02002b4085a3d025b00402d5a80911726d43a67911cd9"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" - -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.10, <3.11" -content-hash = "8d85933db4bf8f4ca92ef227e9a767d26f4f7d2b360083449cfafc54878885fc" +content-hash = "c22ab3de1b76f7549448f4204d52fe0a2d9e68cbbd4d4e873fad667a075dffe3" diff --git a/pyproject.toml b/pyproject.toml index 3f4f44545..54b5a20ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,24 +24,27 @@ pyspark = "3.3.4" scipy = "^1.11.4" hydra-core = "^1.3.2" pyliftover = "^0.4" -xgboost = "^1.7.3" numpy = "^1.26.2" hail = "0.2.127" -wandb = "^0.16.2" +wandb = ">=0.16.2,<0.19.0" google = "^3.0.0" omegaconf = "^2.3.0" typing-extensions = "^4.9.0" scikit-learn = "^1.3.2" -pandas = "^2.1.4" +pandas = { extras = ["gcp", "parquet"], version = "^2.2.2" } +skops = ">=0.9,<0.11" +google-cloud-secret-manager = "^2.20.0" +shap = "^0.46.0" +matplotlib = "3.7.3" [tool.poetry.dev-dependencies] -pre-commit = "^3.6.0" -mypy = "^1.8" -pep8-naming = "^0.13.2" -interrogate = "^1.5.0" +pre-commit = "^4.0.0" +mypy = "^1.13" +pep8-naming = "^0.14.1" +interrogate = "^1.7.0" isort = "^5.13.2" darglint = "^1.8.1" -ruff = "^0.2.0" +ruff = "^0.7.0" [tool.poetry.group.docs.dependencies] mkdocs = "^1.5.3" @@ -58,9 +61,9 @@ pymdown-extensions = "^10.7" [tool.poetry.group.tests.dependencies] -pytest-cov = "^4.1.0" +pytest-cov = ">=4.1,<6.0" pytest-sugar = ">=0.9.5,<1.1.0" -dbldatagen = "^0.3.1" +dbldatagen = ">=0.3.1,<0.5.0" pyparsing = "^3.1.1" pytest = ">=7.4.4,<9.0.0" pytest-xdist = "^3.5.0" @@ -70,12 +73,9 @@ pytest-xdist = "^3.5.0" ipython = "^8.19.0" ipykernel = "^6.28.0" google-cloud-dataproc = "^5.8.0" -apache-airflow = "^2.8.0" -apache-airflow-providers-google = "^10.13.1" -pydoclint = ">=0.3.8,<0.5.0" +pydoclint = ">=0.3.8,<0.6.0" prettier = "^0.0.7" -deptry = "^0.12.0" -python-semantic-release = ">=8.7,<10.0" +deptry = ">=0.12,<0.21" yamllint = "^1.33.0" [tool.semantic_release] @@ -113,7 +113,7 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.deptry] -extend_exclude = ["src/conftest.py", "src/airflow", "src/utils"] +extend_exclude = ["src/conftest.py", "src/utils"] [tool.deptry.per_rule_ignores] DEP001 = ["gentropy"] @@ -126,8 +126,9 @@ exclude = ["dist"] [tool.pytest.ini_options] addopts = "-n auto --doctest-modules --cov=src/ --cov-report=xml" -pythonpath = [".", "./src/airflow/dags"] -testpaths = ["tests/gentropy", "src/gentropy/"] +pythonpath = ["."] +testpaths = ["tests/gentropy", "src/gentropy"] +markers = ["step_test"] # Semi-strict mode for mypy [tool.mypy] @@ -158,13 +159,14 @@ module = [ ignore_missing_imports = true -[tool.ruff] +[tool.ruff.lint] select = [ "B002", # Python does not support the unary prefix increment "B007", # Loop control variable {name} not used within loop body "B014", # Exception handler with duplicate exception "B023", # Function definition does not bind loop variable {name} "B026", # Star-arg unpacking after a keyword argument is strongly discouraged + "B904", # Checks for raise statements in exception handlers that lack a from clause "C", # complexity "COM818", # Trailing comma on bare tuple prohibited "D", # docstrings @@ -179,7 +181,6 @@ select = [ "N804", # First argument of a class method should be named cls "N805", # First argument of a method should be named self "N815", # Variable {name} in class scope should not be mixedCase - "PGH001", # No builtin eval() allowed "PGH004", # Use specific rule codes when using noqa "PLC0414", # Useless import alias. Import alias does not rename original package. "PLC", # pylint @@ -218,7 +219,6 @@ select = [ "T20", # flake8-print "TID251", # Banned imports "TRY004", # Prefer TypeError exception for invalid type - "TRY200", # Use raise from to specify exception cause "TRY302", # Remove exception handler; error is immediately re-raised "UP", # pyupgrade "W", # pycodestyle @@ -248,15 +248,15 @@ ignore = [ ] -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "__init__.py" = ["E402"] "path/to/file.py" = ["E402"] "**/{tests,docs,tools}/*" = ["E402"] -[tool.ruff.flake8-quotes] +[tool.ruff.lint.flake8-quotes] docstring-quotes = "double" -[tool.ruff.pydocstyle] +[tool.ruff.lint.pydocstyle] convention = "google" [tool.pydoclint] @@ -267,3 +267,4 @@ check-return-types = true allow-init-docstring = true arg-type-hints-in-docstring = true skip-checking-short-docstrings = false +check-class-attributes = false diff --git a/src/airflow/.env b/src/airflow/.env deleted file mode 100644 index 2bcd8244f..000000000 --- a/src/airflow/.env +++ /dev/null @@ -1,6 +0,0 @@ -AIRFLOW_IMAGE_NAME=extending_airflow:latest -GOOGLE_LOCAL_CREDENTIALS_PATH=~/.config/gcloud -GOOGLE_DOCKER_CREDENTIALS_PATH=/.config/gcloud -GOOGLE_APPLICATION_CREDENTIALS=/.config/gcloud/service_account_credentials.json -AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='google-cloud-platform://?extra__google_cloud_platform__key_path=/.config/gcloud/service_account_credentials.json' -GCP_PROJECT_ID=open-targets-genetics-dev diff --git a/src/airflow/Dockerfile b/src/airflow/Dockerfile deleted file mode 100644 index 9ca7c9193..000000000 --- a/src/airflow/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM apache/airflow:slim-2.7.3-python3.10 - -# Install additional Python requirements. -# --no-cache-dir is a good practice when installing packages using pip, because it helps to keep the image lightweight. -COPY requirements.txt /requirements.txt -RUN pip install --quiet --user --no-cache-dir --upgrade pip setuptools && \ - pip install --quiet --user --no-cache-dir -r /requirements.txt - -# Source: https://airflow.apache.org/docs/docker-stack/recipes.html -# Installing the GCP CLI in the container -SHELL ["/bin/bash", "-o", "pipefail", "-e", "-u", "-x", "-c"] - -USER 0 -ARG CLOUD_SDK_VERSION=452.0.0 -ENV GCLOUD_HOME=/home/google-cloud-sdk - -ENV PATH="${GCLOUD_HOME}/bin/:${PATH}" - -RUN DOWNLOAD_URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" \ - && TMP_DIR="$(mktemp -d)" \ - && curl -fL "${DOWNLOAD_URL}" --output "${TMP_DIR}/google-cloud-sdk.tar.gz" \ - && mkdir -p "${GCLOUD_HOME}" \ - && tar xzf "${TMP_DIR}/google-cloud-sdk.tar.gz" -C "${GCLOUD_HOME}" --strip-components=1 \ - && "${GCLOUD_HOME}/install.sh" \ - --bash-completion=false \ - --path-update=false \ - --usage-reporting=false \ - --quiet \ - && rm -rf "${TMP_DIR}" \ - && gcloud --version - -# Switch back to a non-root user for security purposes -USER airflow diff --git a/src/airflow/dags/common_airflow.py b/src/airflow/dags/common_airflow.py deleted file mode 100644 index e3dc56ccb..000000000 --- a/src/airflow/dags/common_airflow.py +++ /dev/null @@ -1,353 +0,0 @@ -"""Airflow boilerplate code which can be shared by several DAGs.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -import pendulum -import yaml -from airflow.providers.google.cloud.operators.dataproc import ( - ClusterGenerator, - DataprocCreateClusterOperator, - DataprocDeleteClusterOperator, - DataprocSubmitJobOperator, -) -from airflow.utils.trigger_rule import TriggerRule -from google.cloud import dataproc_v1 - -if TYPE_CHECKING: - from pathlib import Path - -# Code version. It has to be repeated here as well as in `pyproject.toml`, because Airflow isn't able to look at files outside of its `dags/` directory. -GENTROPY_VERSION = "0.0.0" - -# Cloud configuration. -GCP_PROJECT = "open-targets-genetics-dev" -GCP_REGION = "europe-west1" -GCP_ZONE = "europe-west1-d" -GCP_DATAPROC_IMAGE = "2.1" -GCP_AUTOSCALING_POLICY = "otg-etl" - -# Cluster init configuration. -INITIALISATION_BASE_PATH = ( - f"gs://genetics_etl_python_playground/initialisation/{GENTROPY_VERSION}" -) -CONFIG_TAG = f"{INITIALISATION_BASE_PATH}/config.tar.gz" -PACKAGE_WHEEL = ( - f"{INITIALISATION_BASE_PATH}/gentropy-{GENTROPY_VERSION}-py3-none-any.whl" -) -INITIALISATION_EXECUTABLE_FILE = [ - f"{INITIALISATION_BASE_PATH}/install_dependencies_on_cluster.sh" -] - -# CLI configuration. -CLUSTER_CONFIG_DIR = "/config" -CONFIG_NAME = "ot_config" -PYTHON_CLI = "cli.py" - -# Shared DAG construction parameters. -shared_dag_args = { - "owner": "Open Targets Data Team", - "retries": 0, -} - -shared_dag_kwargs = { - "tags": ["genetics_etl", "experimental"], - "start_date": pendulum.now(tz="Europe/London").subtract(days=1), - "schedule": "@once", - "catchup": False, -} - - -def create_cluster( - cluster_name: str, - master_machine_type: str = "n1-highmem-16", - worker_machine_type: str = "n1-standard-16", - num_workers: int = 2, - num_preemptible_workers: int = 0, - num_local_ssds: int = 1, - autoscaling_policy: str = GCP_AUTOSCALING_POLICY, - master_disk_size: int = 500, -) -> DataprocCreateClusterOperator: - """Generate an Airflow task to create a Dataproc cluster. Common parameters are reused, and varying parameters can be specified as needed. - - Args: - cluster_name (str): Name of the cluster. - master_machine_type (str): Machine type for the master node. Defaults to "n1-highmem-8". - worker_machine_type (str): Machine type for the worker nodes. Defaults to "n1-standard-16". - num_workers (int): Number of worker nodes. Defaults to 2. - num_preemptible_workers (int): Number of preemptible worker nodes. Defaults to 0. - num_local_ssds (int): How many local SSDs to attach to each worker node, both primary and secondary. Defaults to 1. - autoscaling_policy (str): Name of the autoscaling policy to use. Defaults to GCP_AUTOSCALING_POLICY. - master_disk_size (int): Size of the master node's boot disk in GB. Defaults to 500. - - Returns: - DataprocCreateClusterOperator: Airflow task to create a Dataproc cluster. - """ - # Create base cluster configuration. - cluster_config = ClusterGenerator( - project_id=GCP_PROJECT, - zone=GCP_ZONE, - master_machine_type=master_machine_type, - worker_machine_type=worker_machine_type, - master_disk_size=master_disk_size, - worker_disk_size=500, - num_preemptible_workers=num_preemptible_workers, - num_workers=num_workers, - image_version=GCP_DATAPROC_IMAGE, - enable_component_gateway=True, - init_actions_uris=INITIALISATION_EXECUTABLE_FILE, - metadata={ - "CONFIGTAR": CONFIG_TAG, - "PACKAGE": PACKAGE_WHEEL, - }, - idle_delete_ttl=30 * 60, # In seconds. - autoscaling_policy=f"projects/{GCP_PROJECT}/regions/{GCP_REGION}/autoscalingPolicies/{autoscaling_policy}", - ).make() - - # If specified, amend the configuration to include local SSDs for worker nodes. - if num_local_ssds: - for worker_section in ("worker_config", "secondary_worker_config"): - # Create a disk config section if it does not exist. - cluster_config[worker_section].setdefault("disk_config", {}) - # Specify the number of local SSDs. - cluster_config[worker_section]["disk_config"][ - "num_local_ssds" - ] = num_local_ssds - - # Return the cluster creation operator. - return DataprocCreateClusterOperator( - task_id="create_cluster", - project_id=GCP_PROJECT, - cluster_config=cluster_config, - region=GCP_REGION, - cluster_name=cluster_name, - trigger_rule=TriggerRule.ALL_SUCCESS, - ) - - -def submit_job( - cluster_name: str, - task_id: str, - job_type: str, - job_specification: dict[str, Any], - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, -) -> DataprocSubmitJobOperator: - """Submit an arbitrary job to a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - task_id (str): Name of the task. - job_type (str): Type of the job to submit. - job_specification (dict[str, Any]): Specification of the job to submit. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit an arbitrary job to a Dataproc cluster. - """ - return DataprocSubmitJobOperator( - task_id=task_id, - region=GCP_REGION, - project_id=GCP_PROJECT, - job={ - "job_uuid": f"airflow-{task_id}", - "reference": {"project_id": GCP_PROJECT}, - "placement": {"cluster_name": cluster_name}, - job_type: job_specification, - }, - trigger_rule=trigger_rule, - ) - - -def submit_pyspark_job( - cluster_name: str, - task_id: str, - python_module_path: str, - args: list[str], - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, -) -> DataprocSubmitJobOperator: - """Submit a PySpark job to a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - task_id (str): Name of the task. - python_module_path (str): Path to the Python module to run. - args (list[str]): Arguments to pass to the Python module. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit a PySpark job to a Dataproc cluster. - """ - return submit_job( - cluster_name=cluster_name, - task_id=task_id, - job_type="pyspark_job", - trigger_rule=trigger_rule, - job_specification={ - "main_python_file_uri": python_module_path, - "args": args, - "properties": { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - }, - }, - ) - - -def submit_step( - cluster_name: str, - step_id: str, - task_id: str = "", - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, - other_args: Optional[list[str]] = None, -) -> DataprocSubmitJobOperator: - """Submit a PySpark job to execute a specific CLI step. - - Args: - cluster_name (str): Name of the cluster. - step_id (str): Name of the step in gentropy. - task_id (str): Name of the task. Defaults to step_id. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit a PySpark job to execute a specific CLI step. - """ - if task_id == "": - task_id = step_id - return submit_pyspark_job( - cluster_name=cluster_name, - task_id=task_id, - python_module_path=f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}", - trigger_rule=trigger_rule, - args=[f"step={step_id}"] - + (other_args if other_args is not None else []) - + [ - f"--config-dir={CLUSTER_CONFIG_DIR}", - f"--config-name={CONFIG_NAME}", - ], - ) - - -def install_dependencies(cluster_name: str) -> DataprocSubmitJobOperator: - """Install dependencies on a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - - Returns: - DataprocSubmitJobOperator: Airflow task to install dependencies on a Dataproc cluster. - """ - return submit_job( - cluster_name=cluster_name, - task_id="install_dependencies", - job_type="pig_job", - job_specification={ - "jar_file_uris": [ - f"gs://genetics_etl_python_playground/initialisation/{GENTROPY_VERSION}/install_dependencies_on_cluster.sh" - ], - "query_list": { - "queries": [ - "sh chmod 750 ${PWD}/install_dependencies_on_cluster.sh", - "sh ${PWD}/install_dependencies_on_cluster.sh", - ] - }, - }, - ) - - -def delete_cluster(cluster_name: str) -> DataprocDeleteClusterOperator: - """Generate an Airflow task to delete a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - - Returns: - DataprocDeleteClusterOperator: Airflow task to delete a Dataproc cluster. - """ - return DataprocDeleteClusterOperator( - task_id="delete_cluster", - project_id=GCP_PROJECT, - cluster_name=cluster_name, - region=GCP_REGION, - trigger_rule=TriggerRule.ALL_DONE, - ) - - -def read_yaml_config(config_path: Path) -> Any: - """Parse a YAMl config file and do all necessary checks. - - Args: - config_path (Path): Path to the YAML config file. - - Returns: - Any: Parsed YAML config file. - """ - assert config_path.exists(), f"YAML config path {config_path} does not exist." - with open(config_path) as config_file: - return yaml.safe_load(config_file) - - -def generate_dag(cluster_name: str, tasks: list[DataprocSubmitJobOperator]) -> Any: - """For a list of tasks, generate a complete DAG. - - Args: - cluster_name (str): Name of the cluster. - tasks (list[DataprocSubmitJobOperator]): List of tasks to execute. - - Returns: - Any: Airflow DAG. - """ - return ( - create_cluster(cluster_name) - >> install_dependencies(cluster_name) - >> tasks - >> delete_cluster(cluster_name) - ) - - -def submit_pyspark_job_no_operator( - cluster_name: str, - step_id: str, - other_args: Optional[list[str]] = None, -) -> None: - """Submits the Pyspark job to the cluster. - - Args: - cluster_name (str): Cluster name - step_id (str): Step id - other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. - """ - # Create the job client. - job_client = dataproc_v1.JobControllerClient( - client_options={"api_endpoint": f"{GCP_REGION}-dataproc.googleapis.com:443"} - ) - - python_uri = f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}" - # Create the job config. 'main_jar_file_uri' can also be a - # Google Cloud Storage URL. - job_description = { - "placement": {"cluster_name": cluster_name}, - "pyspark_job": { - "main_python_file_uri": python_uri, - "args": [f"step={step_id}"] - + (other_args if other_args is not None else []) - + [ - f"--config-dir={CLUSTER_CONFIG_DIR}", - f"--config-name={CONFIG_NAME}", - ], - "properties": { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - }, - }, - } - job_client.submit_job( - project_id=GCP_PROJECT, region=GCP_REGION, job=job_description - ) diff --git a/src/airflow/dags/configs/dag.yaml b/src/airflow/dags/configs/dag.yaml deleted file mode 100644 index 0b634caaa..000000000 --- a/src/airflow/dags/configs/dag.yaml +++ /dev/null @@ -1,18 +0,0 @@ -- id: "ot_gene_index" -- id: "ot_variant_index" -- id: "ot_variant_to_gene" - prerequisites: - - "ot_variant_index" - - "ot_gene_index" -- id: "ot_colocalisation" -- id: "ot_locus_to_gene_train" - prerequisites: - - "ot_variant_index" - - "ot_variant_to_gene" - - "ot_colocalisation" -- id: "ot_locus_to_gene_predict" - prerequisites: - - "ot_locus_to_gene_train" - - "ot_variant_index" - - "ot_variant_to_gene" - - "ot_colocalisation" diff --git a/src/airflow/dags/dag_genetics_etl.py b/src/airflow/dags/dag_genetics_etl.py deleted file mode 100644 index 1d27b8bba..000000000 --- a/src/airflow/dags/dag_genetics_etl.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Airflow DAG for the ETL part of the pipeline.""" -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-etl" -SOURCE_CONFIG_FILE_PATH = Path(__file__).parent / "configs" / "dag.yaml" - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics ETL workflow", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # Parse and define all steps and their prerequisites. - tasks = {} - steps = common.read_yaml_config(SOURCE_CONFIG_FILE_PATH) - for step in steps: - # Define task for the current step. - step_id = step["id"] - this_task = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id=step_id, - task_id=step_id, - ) - # Chain prerequisites. - tasks[step_id] = this_task - for prerequisite in step.get("prerequisites", []): - this_task.set_upstream(tasks[prerequisite]) - # Construct the DAG with all tasks. - dag = common.generate_dag(cluster_name=CLUSTER_NAME, tasks=list(tasks.values())) diff --git a/src/airflow/dags/dag_preprocess.py b/src/airflow/dags/dag_preprocess.py deleted file mode 100644 index 4439914c5..000000000 --- a/src/airflow/dags/dag_preprocess.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Airflow DAG for the Preprocess part of the pipeline.""" -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-preprocess" - -ALL_STEPS = [ - "ot_ld_index", - "ot_variant_annotation", -] - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” Preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - all_tasks = [ - common.submit_step(cluster_name=CLUSTER_NAME, step_id=step, task_id=step) - for step in ALL_STEPS - ] - dag = common.generate_dag(cluster_name=CLUSTER_NAME, tasks=all_tasks) diff --git a/src/airflow/dags/finngen_harmonisation.py b/src/airflow/dags/finngen_harmonisation.py deleted file mode 100644 index e2f2d1b4a..000000000 --- a/src/airflow/dags/finngen_harmonisation.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Airflow DAG for the harmonisation part of the pipeline.""" -from __future__ import annotations - -import re -import time -from pathlib import Path -from typing import Any - -import common_airflow as common -from airflow.decorators import task -from airflow.models.dag import DAG -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator - -CLUSTER_NAME = "otg-finngen-harmonisation" -AUTOSCALING = "gwascatalog-harmonisation" # same as GWAS Catalog harmonisation -SUMMARY_STATS_BUCKET_NAME = "finngen-public-data-r10" -RELEASEBUCKET = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX" -SUMSTATS_PARQUET = f"{RELEASEBUCKET}/summary_statistics/finngen" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” Finngen harmonisation", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # List raw harmonised files from GWAS Catalog - list_inputs = GCSListObjectsOperator( - task_id="list_raw_sumstats", - bucket=SUMMARY_STATS_BUCKET_NAME, - prefix="summary_stats", - match_glob="**/*.gz", - ) - - # Submit jobs to dataproc - @task(task_id="submit_jobs") - def submit_jobs(**kwargs: Any) -> None: - """Submit jobs to dataproc. - - Args: - **kwargs (Any): Keyword arguments. - """ - ti = kwargs["ti"] - todo = ti.xcom_pull(task_ids="list_raw_sumstats", key="return_value") - print("Number of jobs to submit: ", len(todo)) # noqa: T201 - for i in range(len(todo)): - # Not to exceed default quota 400 jobs per minute - if i > 0 and i % 399 == 0: - time.sleep(60) - input_path = todo[i] - match_result = re.search(r"summary_stats/finngen_(.*).gz", input_path) - if match_result: - study_id = match_result.group(1) - print("Submitting job for study: ", study_id) # noqa: T201 - common.submit_pyspark_job_no_operator( - cluster_name=CLUSTER_NAME, - step_id="ot_finngen_sumstat_preprocess", - other_args=[ - f"step.raw_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{input_path}", - f"step.out_sumstats_path={SUMSTATS_PARQUET}/{study_id}.parquet", - ], - ) - - # list_inputs >> - ( - list_inputs - >> common.create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - num_workers=8, - # num_preemptible_workers=8, - master_machine_type="n1-highmem-32", - worker_machine_type="n1-standard-2", - ) - >> common.install_dependencies(CLUSTER_NAME) - >> submit_jobs() - >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/finngen_preprocess.py b/src/airflow/dags/finngen_preprocess.py deleted file mode 100644 index 38aeb2510..000000000 --- a/src/airflow/dags/finngen_preprocess.py +++ /dev/null @@ -1,105 +0,0 @@ -"""Airflow DAG for the Preprocess part of the pipeline.""" -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common -from airflow.models.dag import DAG -from airflow.utils.task_group import TaskGroup -from airflow.utils.trigger_rule import TriggerRule - -CLUSTER_NAME = "otg-preprocess-finngen" -AUTOSCALING = "finngen-preprocess" - -# Get all parameters for the DAG: -FINNGEN_VERSION = "r10" -FINNGEN_BUCKET = f"gs://finngen_data/{FINNGEN_VERSION}" - -STUDY_INDEX = f"{FINNGEN_BUCKET}/study_index" -SUMMARY_STATISTICS = f"{FINNGEN_BUCKET}/harmonised_summary_statistics" -WINDOW_BASED_CLUMPED = f"{FINNGEN_BUCKET}/study_locus_datasets/finngen_window_clumped" -LD_CLUMPED = f"{FINNGEN_BUCKET}/study_locus_datasets/finngen_ld_clumped" -PICSED_CREDIBLE_SET = f"{FINNGEN_BUCKET}/credible_set_datasets/finngen_pics" - -FINNGEN_FINEMAPPING = ( - "gs://genetics_etl_python_playground/input/Finngen_susie_finemapping_r10/full" -) -FINNGEN_FM_SUMMARIES = "gs://genetics_etl_python_playground/input/Finngen_susie_finemapping_r10/Finngen_susie_credset_summary_r10.tsv" -FINNGEN_PREFIX = "FINNGEN_R10_" -FINNGEN_FM_OUT = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/finngen_susie_processed" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” Finngen preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - finngen_finemapping_ingestion = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_finngen_finemapping_ingestion", - task_id="finngen_finemapping_ingestion", - other_args=[ - f"step.finngen_finemapping_out={FINNGEN_FM_OUT}", - f"step.finngen_release_prefix={FINNGEN_PREFIX}", - f"step.finngen_finemapping_results_path={FINNGEN_FINEMAPPING}", - f"step.finngen_finemapping_summaries_path={FINNGEN_FM_SUMMARIES}", - ], - # This allows to attempt running the task when above step fails do to failifexists - trigger_rule=TriggerRule.ALL_DONE, - ) - with TaskGroup( - group_id="finngen_summary_stats_preprocess" - ) as finngen_summary_stats_preprocess: - study_index = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_finngen_studies", - task_id="finngen_studies", - other_args=[ - f"step.finngen_study_index_out={STUDY_INDEX}", - ], - ) - - window_based_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="window_based_clumping", - task_id="finngen_window_based_clumping", - other_args=[ - f"step.summary_statistics_input_path={SUMMARY_STATISTICS}", - f"step.study_locus_output_path={WINDOW_BASED_CLUMPED}", - ], - ) - ld_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ld_based_clumping", - task_id="finngen_ld_clumping", - other_args=[ - f"step.study_locus_input_path={WINDOW_BASED_CLUMPED}", - f"step.study_index_path={STUDY_INDEX}", - f"step.clumped_study_locus_output_path={LD_CLUMPED}", - ], - trigger_rule=TriggerRule.ALL_DONE, - ) - pics = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_pics", - task_id="finngen_pics", - other_args=[ - f"step.study_locus_ld_annotated_in={LD_CLUMPED}", - f"step.picsed_study_locus_out={PICSED_CREDIBLE_SET}", - ], - # This allows to attempt running the task when above step fails do to failifexists - trigger_rule=TriggerRule.ALL_DONE, - ) - # Define order of steps: - (study_index >> window_based_clumping >> ld_clumping >> pics) - ( - common.create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - master_disk_size=2000, - num_workers=6, - ) - >> common.install_dependencies(CLUSTER_NAME) - >> [finngen_summary_stats_preprocess, finngen_finemapping_ingestion] - >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/gwas_catalog_harmonisation.py b/src/airflow/dags/gwas_catalog_harmonisation.py deleted file mode 100644 index 5713e223d..000000000 --- a/src/airflow/dags/gwas_catalog_harmonisation.py +++ /dev/null @@ -1,123 +0,0 @@ -"""Airflow DAG for the harmonisation part of the pipeline.""" -from __future__ import annotations - -import re -import time -from pathlib import Path -from typing import Any - -import common_airflow as common -from airflow.decorators import task -from airflow.models.dag import DAG -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator - -CLUSTER_NAME = "otg-gwascatalog-harmonisation" -AUTOSCALING = "gwascatalog-harmonisation" - -SUMMARY_STATS_BUCKET_NAME = "gwas_catalog_data" -RAW_SUMMARY_STATISTICS_PREFIX = "raw_summary_statistics" -HARMONISED_SUMMARY_STATISTICS_PREFIX = "harmonised_summary_statistics" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” GWAS Catalog harmonisation", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # List raw harmonised files from GWAS Catalog - list_inputs = GCSListObjectsOperator( - task_id="list_raw_harmonised", - bucket=SUMMARY_STATS_BUCKET_NAME, - prefix=RAW_SUMMARY_STATISTICS_PREFIX, - match_glob="**/*.h.tsv.gz", - ) - # List parquet files that have been previously processed - list_outputs = GCSListObjectsOperator( - task_id="list_harmonised_parquet", - bucket=SUMMARY_STATS_BUCKET_NAME, - prefix=HARMONISED_SUMMARY_STATISTICS_PREFIX, - match_glob="**/_SUCCESS", - ) - - # Create list of pending jobs - @task(task_id="create_to_do_list") - def create_to_do_list(**kwargs: Any) -> Any: - """Create the to-do list of studies. - - Args: - **kwargs (Any): Keyword arguments. - - Returns: - Any: To-do list. - """ - ti = kwargs["ti"] - raw_harmonised = ti.xcom_pull( - task_ids="list_raw_harmonised", key="return_value" - ) - print("Number of raw harmonised files: ", len(raw_harmonised)) # noqa: T201 - to_do_list = [] - # Remove the ones that have been processed - parquets = ti.xcom_pull(task_ids="list_harmonised_parquet", key="return_value") - print("Number of parquet files: ", len(parquets)) # noqa: T201 - for path in raw_harmonised: - match_result = re.search( - rf"{RAW_SUMMARY_STATISTICS_PREFIX}/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", - path, - ) - if match_result: - study_id = match_result.group(2) - if ( - f"{HARMONISED_SUMMARY_STATISTICS_PREFIX}/{study_id}.parquet/_SUCCESS" - not in parquets - ): - to_do_list.append(path) - print("Number of jobs to submit: ", len(to_do_list)) # noqa: T201 - ti.xcom_push(key="to_do_list", value=to_do_list) - - # Submit jobs to dataproc - @task(task_id="submit_jobs") - def submit_jobs(**kwargs: Any) -> None: - """Submit jobs to dataproc. - - Args: - **kwargs (Any): Keyword arguments. - """ - ti = kwargs["ti"] - todo = ti.xcom_pull(task_ids="create_to_do_list", key="to_do_list") - print("Number of jobs to submit: ", len(todo)) # noqa: T201 - for i in range(len(todo)): - # Not to exceed default quota 400 jobs per minute - if i > 0 and i % 399 == 0: - time.sleep(60) - input_path = todo[i] - match_result = re.search( - rf"{RAW_SUMMARY_STATISTICS_PREFIX}/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", - input_path, - ) - if match_result: - study_id = match_result.group(2) - print("Submitting job for study: ", study_id) # noqa: T201 - common.submit_pyspark_job_no_operator( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_sumstat_preprocess", - other_args=[ - f"step.raw_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{input_path}", - f"step.out_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{HARMONISED_SUMMARY_STATISTICS_PREFIX}/{study_id}.parquet", - ], - ) - - ( - [list_inputs, list_outputs] - >> create_to_do_list() - >> common.create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - num_workers=8, - num_preemptible_workers=8, - master_machine_type="n1-highmem-64", - worker_machine_type="n1-standard-2", - ) - >> common.install_dependencies(CLUSTER_NAME) - >> submit_jobs() - # >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/gwas_catalog_preprocess.py b/src/airflow/dags/gwas_catalog_preprocess.py deleted file mode 100644 index 36130c87e..000000000 --- a/src/airflow/dags/gwas_catalog_preprocess.py +++ /dev/null @@ -1,225 +0,0 @@ -"""Airflow DAG for the preprocessing of GWAS Catalog's harmonised summary statistics and curated associations.""" -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common -from airflow.models.dag import DAG -from airflow.operators.python import PythonOperator -from airflow.providers.google.cloud.hooks.gcs import GCSHook -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator -from airflow.utils.task_group import TaskGroup - -CLUSTER_NAME = "otg-preprocess-gwascatalog" -AUTOSCALING = "otg-preprocess-gwascatalog" - -# Setting up bucket name and output object names: -GWAS_CATALOG_BUCKET_NAME = "gwas_catalog_data" -HARMONISED_SUMSTATS_PREFIX = "harmonised_summary_statistics" - -# Manifest paths: -MANIFESTS_PATH = f"gs://{GWAS_CATALOG_BUCKET_NAME}/manifests/" - -# The name of the manifest files have to be consistent with the config file: -HARMONISED_SUMSTATS_LIST_OBJECT_NAME = ( - "manifests/gwas_catalog_harmonised_summary_statistics_list.txt" -) -HARMONISED_SUMSTATS_LIST_FULL_NAME = ( - f"gs://{GWAS_CATALOG_BUCKET_NAME}/{HARMONISED_SUMSTATS_LIST_OBJECT_NAME}" -) -CURATION_INCLUSION_NAME = f"{MANIFESTS_PATH}/gwas_catalog_curation_included_studies" -CURATION_EXCLUSION_NAME = f"{MANIFESTS_PATH}/gwas_catalog_curation_excluded_studies" -SUMMARY_STATISTICS_INCLUSION_NAME = ( - f"{MANIFESTS_PATH}/gwas_catalog_summary_statistics_included_studies" -) -SUMMARY_STATISTICS_EXCLUSION_NAME = ( - f"{MANIFESTS_PATH}/gwas_catalog_summary_statistics_excluded_studies" -) - -# Study index: -STUDY_INDEX = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_index" - -# Study loci: -CURATED_STUDY_LOCI = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_curated_associations" -CURATED_LD_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_curated_associations_ld_clumped" -WINDOW_BASED_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_summary_stats_window_clumped" -LD_BASED_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_summary_stats_ld_clumped" -# Credible sets: -CURATED_CREDIBLE_SETS = ( - f"gs://{GWAS_CATALOG_BUCKET_NAME}/credible_set_datasets/gwas_catalog_curated" -) -SUMMARY_STATISTICS_CREDIBLE_SETS = ( - f"gs://{GWAS_CATALOG_BUCKET_NAME}/credible_set_datasets/gwas_catalog_summary_stats" -) - - -def upload_harmonized_study_list( - concatenated_studies: str, bucket_name: str, object_name: str -) -> None: - """This function uploads file to GCP. - - Args: - concatenated_studies (str): Concatenated list of harmonized summary statistics. - bucket_name (str): Bucket name - object_name (str): Name of the object - """ - hook = GCSHook(gcp_conn_id="google_cloud_default") - hook.upload( - bucket_name=bucket_name, - object_name=object_name, - data=concatenated_studies, - encoding="utf-8", - ) - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” GWAS Catalog preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # Getting list of folders (each a gwas study with summary statistics) - list_harmonised_sumstats = GCSListObjectsOperator( - task_id="list_harmonised_parquet", - bucket=GWAS_CATALOG_BUCKET_NAME, - prefix=HARMONISED_SUMSTATS_PREFIX, - match_glob="**/_SUCCESS", - ) - - # Upload resuling list to a bucket: - upload_task = PythonOperator( - task_id="uploader", - python_callable=upload_harmonized_study_list, - op_kwargs={ - "concatenated_studies": '{{ "\n".join(ti.xcom_pull( key="return_value", task_ids="list_harmonised_parquet")) }}', - "bucket_name": GWAS_CATALOG_BUCKET_NAME, - "object_name": HARMONISED_SUMSTATS_LIST_OBJECT_NAME, - }, - ) - - # Processing curated GWAS Catalog top-bottom: - with TaskGroup(group_id="curation_processing") as curation_processing: - # Generate inclusion list: - curation_calculate_inclusion_list = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_study_inclusion", - task_id="catalog_curation_inclusion_list", - other_args=[ - "step.criteria=curation", - f"step.inclusion_list_path={CURATION_INCLUSION_NAME}", - f"step.exclusion_list_path={CURATION_EXCLUSION_NAME}", - f"step.harmonised_study_file={HARMONISED_SUMSTATS_LIST_FULL_NAME}", - ], - ) - - # Ingest curated associations from GWAS Catalog: - curation_ingest_data = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_ingestion", - task_id="ingest_curated_gwas_catalog_data", - other_args=[f"step.inclusion_list_path={CURATION_INCLUSION_NAME}"], - ) - - # Run LD-annotation and clumping on curated data: - curation_ld_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ld_based_clumping", - task_id="catalog_curation_ld_clumping", - other_args=[ - f"step.study_locus_input_path={CURATED_STUDY_LOCI}", - f"step.study_index_path={STUDY_INDEX}", - f"step.clumped_study_locus_output_path={CURATED_LD_CLUMPED}", - ], - ) - - # Do PICS based finemapping: - curation_pics = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_pics", - task_id="catalog_curation_pics", - other_args=[ - f"step.study_locus_ld_annotated_in={CURATED_LD_CLUMPED}", - f"step.picsed_study_locus_out={CURATED_CREDIBLE_SETS}", - ], - ) - - # Define order of steps: - ( - curation_calculate_inclusion_list - >> curation_ingest_data - >> curation_ld_clumping - >> curation_pics - ) - - # Processing summary statistics from GWAS Catalog: - with TaskGroup( - group_id="summary_statistics_processing" - ) as summary_statistics_processing: - # Generate inclusion study lists: - summary_stats_calculate_inclusion_list = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_study_inclusion", - task_id="catalog_sumstats_inclusion_list", - other_args=[ - "step.criteria=summary_stats", - f"step.inclusion_list_path={SUMMARY_STATISTICS_INCLUSION_NAME}", - f"step.exclusion_list_path={SUMMARY_STATISTICS_EXCLUSION_NAME}", - f"step.harmonised_study_file={HARMONISED_SUMSTATS_LIST_FULL_NAME}", - ], - ) - - # Run window-based clumping: - summary_stats_window_based_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_window_based_clumping", - task_id="catalog_sumstats_window_clumping", - other_args=[ - f"step.summary_statistics_input_path=gs://{GWAS_CATALOG_BUCKET_NAME}/{HARMONISED_SUMSTATS_PREFIX}", - f"step.inclusion_list_path={SUMMARY_STATISTICS_INCLUSION_NAME}", - f"step.study_locus_output_path={WINDOW_BASED_CLUMPED}", - ], - ) - - # Run LD based clumping: - summary_stats_ld_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ld_based_clumping", - task_id="catalog_sumstats_ld_clumping", - other_args=[ - f"step.study_locus_input_path={WINDOW_BASED_CLUMPED}", - f"step.study_index_path={STUDY_INDEX}", - f"step.clumped_study_locus_output_path={LD_BASED_CLUMPED}", - ], - ) - - # Run PICS finemapping: - summary_stats_pics = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_pics", - task_id="catalog_sumstats_pics", - other_args=[ - f"step.study_locus_ld_annotated_in={LD_BASED_CLUMPED}", - f"step.picsed_study_locus_out={SUMMARY_STATISTICS_CREDIBLE_SETS}", - ], - ) - - # Order of steps within the group: - ( - summary_stats_calculate_inclusion_list - >> summary_stats_window_based_clumping - >> summary_stats_ld_clumping - >> summary_stats_pics - ) - - # DAG description: - ( - common.create_cluster( - CLUSTER_NAME, autoscaling_policy=AUTOSCALING, num_workers=5 - ) - >> common.install_dependencies(CLUSTER_NAME) - >> list_harmonised_sumstats - >> upload_task - >> curation_processing - >> summary_statistics_processing - >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/gwas_curation_update.py b/src/airflow/dags/gwas_curation_update.py deleted file mode 100644 index 1ef0f39f9..000000000 --- a/src/airflow/dags/gwas_curation_update.py +++ /dev/null @@ -1,33 +0,0 @@ -"""DAG for updating GWAS Catalog curation table.""" -from __future__ import annotations - -from datetime import datetime -from pathlib import Path - -import common_airflow as common -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-gwascatalog-curation" -RUN_DATE = datetime.today().strftime("%Y-%m-%d") - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics β€” GWAS Catalog curation update", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - update_gwas_curation = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="gwas_catalog_curation_update", - task_id="gwas_catalog_curation_update", - other_args=[ - f"step.gwas_catalog_study_curation_out=gs://genetics_etl_python_playground/input/v2d/GWAS_Catalog_study_curation_{RUN_DATE}.tsv", - ], - ) - - # DAG description: - ( - common.create_cluster(CLUSTER_NAME, num_workers=2) - >> common.install_dependencies(CLUSTER_NAME) - >> update_gwas_curation - ) diff --git a/src/airflow/docker-compose.yaml b/src/airflow/docker-compose.yaml deleted file mode 100644 index 8e8523490..000000000 --- a/src/airflow/docker-compose.yaml +++ /dev/null @@ -1,228 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -# Basic Airflow cluster configuration for LocalExecutor with PostgreSQL. -# -# WARNING: This configuration is for local development. Do not use it in a production deployment. -# -# This configuration supports basic configuration using environment variables or an .env file -# The following variables are supported: -# -# AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. -# Default: apache/airflow:slim-2.7.2-python3.10 -# AIRFLOW_UID - User ID in Airflow containers -# Default: 50000 -# AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. -# Default: . -# Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode -# -# _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). -# Default: airflow -# _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). -# Default: airflow -# _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. -# Use this option ONLY for quick checks. Installing requirements at container -# startup is done EVERY TIME the service is started. -# A better way is to build a custom image or extend the official image -# as described in https://airflow.apache.org/docs/docker-stack/build.html. -# Default: '' -# -# Feel free to modify this file to suit your needs. -version: "3.8" -x-airflow-common: &airflow-common - # In order to add custom dependencies or upgrade provider packages you can use your extended image. - # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml - # and uncomment the "build" line below, Then run `docker-compose build` to build the images. - image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:slim-2.7.2-python3.10} - # build: . - environment: &airflow-common-env - AIRFLOW__CORE__EXECUTOR: LocalExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow - # For backward compatibility, with Airflow <2.3 - AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CORE__FERNET_KEY: "" - AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: "true" - AIRFLOW__CORE__LOAD_EXAMPLES: "false" - AIRFLOW__API__AUTH_BACKENDS: "airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session" - # yamllint disable rule:line-length - # Use simple http server on scheduler for health checks - # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server - # yamllint enable rule:line-length - AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: "true" - # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks - # for other purpose (development, test and especially production usage) build/extend Airflow image. - _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} - # GCLOUD Authentication - GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS:-} - AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT: ${AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT:-} - GCP_PROJECT_ID: ${GCP_PROJECT_ID:-} - GCP_GCS_BUCKET: ${GCP_GCS_BUCKET:-} - - volumes: - - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags - - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs - - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config - - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins - # GCLOUD Authentication - - ${GOOGLE_LOCAL_CREDENTIALS_PATH}:/${GOOGLE_DOCKER_CREDENTIALS_PATH}:ro - user: "${AIRFLOW_UID:-50000}:0" - depends_on: &airflow-common-depends-on - postgres: - condition: service_healthy - -services: - postgres: - image: postgres:13 - environment: - POSTGRES_USER: airflow - POSTGRES_PASSWORD: airflow - POSTGRES_DB: airflow - volumes: - - postgres-db-volume:/var/lib/postgresql/data - healthcheck: - test: ["CMD", "pg_isready", "-U", "airflow"] - interval: 10s - retries: 5 - start_period: 5s - restart: always - - airflow-webserver: - <<: *airflow-common - command: webserver - ports: - - "8080:8080" - healthcheck: - test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 30s - restart: always - depends_on: - <<: *airflow-common-depends-on - airflow-init: - condition: service_completed_successfully - - airflow-scheduler: - <<: *airflow-common - command: scheduler - healthcheck: - test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 30s - restart: always - depends_on: - <<: *airflow-common-depends-on - airflow-init: - condition: service_completed_successfully - - airflow-init: - <<: *airflow-common - entrypoint: /bin/bash - # yamllint disable rule:line-length - command: - - -c - - | - function ver() { - printf "%04d%04d%04d%04d" $${1//./ } - } - airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) - airflow_version_comparable=$$(ver $${airflow_version}) - min_airflow_version=2.2.0 - min_airflow_version_comparable=$$(ver $${min_airflow_version}) - if (( airflow_version_comparable < min_airflow_version_comparable )); then - echo - echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" - echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" - echo - exit 1 - fi - if [[ -z "${AIRFLOW_UID}" ]]; then - echo - echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" - echo "If you are on Linux, you SHOULD follow the instructions below to set " - echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." - echo "For other operating systems you can get rid of the warning with manually created .env file:" - echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" - echo - fi - one_meg=1048576 - mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) - cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) - disk_available=$$(df / | tail -1 | awk '{print $$4}') - warning_resources="false" - if (( mem_available < 4000 )) ; then - echo - echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" - echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" - echo - warning_resources="true" - fi - if (( cpus_available < 2 )); then - echo - echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" - echo "At least 2 CPUs recommended. You have $${cpus_available}" - echo - warning_resources="true" - fi - if (( disk_available < one_meg * 10 )); then - echo - echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" - echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" - echo - warning_resources="true" - fi - if [[ $${warning_resources} == "true" ]]; then - echo - echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" - echo "Please follow the instructions to increase amount of resources available:" - echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" - echo - fi - mkdir -p /sources/logs /sources/dags /sources/plugins - chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} - exec /entrypoint airflow version - # yamllint enable rule:line-length - environment: - <<: *airflow-common-env - _AIRFLOW_DB_MIGRATE: "true" - _AIRFLOW_WWW_USER_CREATE: "true" - _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} - _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} - _PIP_ADDITIONAL_REQUIREMENTS: "" - user: "0:0" - volumes: - - ${AIRFLOW_PROJ_DIR:-.}:/sources - - airflow-cli: - <<: *airflow-common - profiles: - - debug - environment: - <<: *airflow-common-env - CONNECTION_CHECK_MAX_COUNT: "0" - # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 - command: - - bash - - -c - - airflow - -volumes: - postgres-db-volume: diff --git a/src/airflow/logs/.gitkeep b/src/airflow/logs/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/plugins/.gitkeep b/src/airflow/plugins/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/requirements.txt b/src/airflow/requirements.txt deleted file mode 100644 index e9fd45142..000000000 --- a/src/airflow/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -apache-airflow-providers-google==10.10.1 -psycopg2-binary==2.9.9 diff --git a/src/gentropy/assets/data/gwas_population_2_LD_panel_map.json b/src/gentropy/assets/data/gwas_population_2_LD_panel_map.json index 52cee5140..fa00089c6 100644 --- a/src/gentropy/assets/data/gwas_population_2_LD_panel_map.json +++ b/src/gentropy/assets/data/gwas_population_2_LD_panel_map.json @@ -5,13 +5,13 @@ "Asian unspecified": "eas", "Hispanic or Latin American": "amr", "East Asian": "eas", - "Central Asian": "seu", + "Central Asian": "eas", "Oceanian": "eas", "South East Asian": "eas", "Other admixed ancestry": "nfe", "African unspecified": "afr", "Sub-Saharan African": "afr", - "Greater Middle Eastern (Middle Eastern, North African or Persian)": "seu", + "Greater Middle Eastern (Middle Eastern, North African or Persian)": "eas", "Aboriginal Australian": "eas", "Other": "nfe", "South Asian": "eas", diff --git a/src/gentropy/assets/schemas/biosample_index.json b/src/gentropy/assets/schemas/biosample_index.json new file mode 100644 index 000000000..6309ca2c7 --- /dev/null +++ b/src/gentropy/assets/schemas/biosample_index.json @@ -0,0 +1,83 @@ +{ + "type": "struct", + "fields": [ + { + "name": "biosampleId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "biosampleName", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "description", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "xrefs", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "synonyms", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "parents", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "ancestors", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "descendants", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "children", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + } + ] +} diff --git a/src/gentropy/assets/schemas/colocalisation.json b/src/gentropy/assets/schemas/colocalisation.json index 7ff7453b9..a065dc947 100644 --- a/src/gentropy/assets/schemas/colocalisation.json +++ b/src/gentropy/assets/schemas/colocalisation.json @@ -4,13 +4,19 @@ { "name": "leftStudyLocusId", "nullable": false, - "type": "long", + "type": "string", "metadata": {} }, { "name": "rightStudyLocusId", "nullable": false, - "type": "long", + "type": "string", + "metadata": {} + }, + { + "name": "rightStudyType", + "nullable": false, + "type": "string", "metadata": {} }, { @@ -62,13 +68,13 @@ "metadata": {} }, { - "name": "log2h4h3", + "name": "clpp", "type": "double", "nullable": true, "metadata": {} }, { - "name": "clpp", + "name": "betaRatioSignAverage", "type": "double", "nullable": true, "metadata": {} diff --git a/src/gentropy/assets/schemas/l2g_feature.json b/src/gentropy/assets/schemas/l2g_feature.json index 3139a57e4..314b4dde0 100644 --- a/src/gentropy/assets/schemas/l2g_feature.json +++ b/src/gentropy/assets/schemas/l2g_feature.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "long", + "type": "string", "nullable": false, "metadata": {} }, diff --git a/src/gentropy/assets/schemas/l2g_feature_matrix.json b/src/gentropy/assets/schemas/l2g_feature_matrix.json deleted file mode 100644 index a1b58040b..000000000 --- a/src/gentropy/assets/schemas/l2g_feature_matrix.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "fields": [ - { - "metadata": {}, - "name": "studyLocusId", - "nullable": false, - "type": "long" - }, - { - "metadata": {}, - "name": "geneId", - "nullable": false, - "type": "string" - }, - { - "metadata": {}, - "name": "goldStandardSet", - "nullable": true, - "type": "string" - }, - { - "metadata": {}, - "name": "distanceTssMean", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "distanceTssMinimum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "vepMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "vepMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "vepMeanNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "vepMean", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "eqtlColocClppMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "eqtlColocClppMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "eqtlColocLlrMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "eqtlColocLlrMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "pqtlColocClppMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "pqtlColocClppMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "pqtlColocLlrMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "pqtlColocLlrMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "sqtlColocClppMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "sqtlColocClppMaximumNeighborhood", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "sqtlColocLlrMaximum", - "nullable": true, - "type": "float" - }, - { - "metadata": {}, - "name": "sqtlColocLlrMaximumNeighborhood", - "nullable": true, - "type": "float" - } - ], - "type": "struct" -} diff --git a/src/gentropy/assets/schemas/l2g_gold_standard.json b/src/gentropy/assets/schemas/l2g_gold_standard.json index cf19d6b52..6af921d61 100644 --- a/src/gentropy/assets/schemas/l2g_gold_standard.json +++ b/src/gentropy/assets/schemas/l2g_gold_standard.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "long", + "type": "string", "nullable": false, "metadata": {} }, diff --git a/src/gentropy/assets/schemas/l2g_predictions.json b/src/gentropy/assets/schemas/l2g_predictions.json index 16b274207..57247a49a 100644 --- a/src/gentropy/assets/schemas/l2g_predictions.json +++ b/src/gentropy/assets/schemas/l2g_predictions.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "long", + "type": "string", "nullable": false, "metadata": {} }, @@ -18,6 +18,17 @@ "type": "double", "nullable": false, "metadata": {} + }, + { + "metadata": {}, + "name": "locusToGeneFeatures", + "nullable": true, + "type": { + "keyType": "string", + "type": "map", + "valueContainsNull": true, + "valueType": "float" + } } ] } diff --git a/src/gentropy/assets/schemas/pairwise_ld.json b/src/gentropy/assets/schemas/pairwise_ld.json new file mode 100644 index 000000000..bac781ac3 --- /dev/null +++ b/src/gentropy/assets/schemas/pairwise_ld.json @@ -0,0 +1,23 @@ +{ + "fields": [ + { + "metadata": {}, + "name": "variantIdI", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "variantIdJ", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "r", + "nullable": false, + "type": "double" + } + ], + "type": "struct" +} diff --git a/src/gentropy/assets/schemas/study_index.json b/src/gentropy/assets/schemas/study_index.json index 08f61c072..9c50d4a19 100644 --- a/src/gentropy/assets/schemas/study_index.json +++ b/src/gentropy/assets/schemas/study_index.json @@ -22,7 +22,7 @@ { "name": "traitFromSource", "type": "string", - "nullable": false, + "nullable": true, "metadata": {} }, { @@ -35,12 +35,34 @@ "nullable": true, "metadata": {} }, + { + "name": "diseaseIds", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, { "name": "geneId", "type": "string", "nullable": true, "metadata": {} }, + { + "name": "biosampleFromSourceId", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "biosampleId", + "type": "string", + "nullable": true, + "metadata": {} + }, { "name": "pubmedId", "type": "string", @@ -81,6 +103,16 @@ "nullable": true, "metadata": {} }, + { + "name": "backgroundDiseaseIds", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, { "name": "initialSampleSize", "type": "string", @@ -224,6 +256,23 @@ "type": "boolean", "nullable": true, "metadata": {} + }, + { + "name": "condition", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "sumstatQCValues", + "type": { + "type": "map", + "keyType": "string", + "valueType": "float", + "valueContainsNull": true + }, + "nullable": true, + "metadata": {} } ] } diff --git a/src/gentropy/assets/schemas/study_locus.json b/src/gentropy/assets/schemas/study_locus.json index e0f366d68..5c7bf1178 100644 --- a/src/gentropy/assets/schemas/study_locus.json +++ b/src/gentropy/assets/schemas/study_locus.json @@ -4,7 +4,13 @@ "metadata": {}, "name": "studyLocusId", "nullable": false, - "type": "long" + "type": "string" + }, + { + "metadata": {}, + "name": "studyType", + "nullable": true, + "type": "string" }, { "metadata": {}, @@ -42,6 +48,12 @@ "nullable": true, "type": "double" }, + { + "metadata": {}, + "name": "zScore", + "nullable": true, + "type": "double" + }, { "metadata": {}, "name": "pValueMantissa", @@ -100,6 +112,30 @@ "nullable": true, "type": "double" }, + { + "metadata": {}, + "name": "purityMeanR2", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "purityMinR2", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "locusStart", + "nullable": true, + "type": "integer" + }, + { + "metadata": {}, + "name": "locusEnd", + "nullable": true, + "type": "integer" + }, { "metadata": {}, "name": "sampleSize", @@ -205,6 +241,12 @@ }, "type": "array" } + }, + { + "metadata": {}, + "name": "confidence", + "nullable": true, + "type": "string" } ], "type": "struct" diff --git a/src/gentropy/assets/schemas/study_locus_overlap.json b/src/gentropy/assets/schemas/study_locus_overlap.json index 9a8e123cd..0c4319827 100644 --- a/src/gentropy/assets/schemas/study_locus_overlap.json +++ b/src/gentropy/assets/schemas/study_locus_overlap.json @@ -4,13 +4,19 @@ "metadata": {}, "name": "leftStudyLocusId", "nullable": false, - "type": "long" + "type": "string" }, { "metadata": {}, "name": "rightStudyLocusId", "nullable": false, - "type": "long" + "type": "string" + }, + { + "metadata": {}, + "name": "rightStudyType", + "nullable": false, + "type": "string" }, { "metadata": {}, diff --git a/src/gentropy/assets/schemas/v2g.json b/src/gentropy/assets/schemas/v2g.json deleted file mode 100644 index afbe401dd..000000000 --- a/src/gentropy/assets/schemas/v2g.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "type": "struct", - "fields": [ - { - "name": "geneId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "variantId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "distance", - "type": "long", - "nullable": true, - "metadata": {} - }, - { - "name": "chromosome", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "datatypeId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "datasourceId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "score", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "resourceScore", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "pmid", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "biofeature", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "variantFunctionalConsequenceId", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "isHighQualityPlof", - "type": "boolean", - "nullable": true, - "metadata": {} - } - ] -} diff --git a/src/gentropy/assets/schemas/variant_annotation.json b/src/gentropy/assets/schemas/variant_annotation.json deleted file mode 100644 index 826eabaf9..000000000 --- a/src/gentropy/assets/schemas/variant_annotation.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "type": "struct", - "fields": [ - { - "name": "variantId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "chromosome", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "position", - "type": "integer", - "nullable": false, - "metadata": {} - }, - { - "name": "gnomadVariantId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "referenceAllele", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "alternateAllele", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "chromosomeB37", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "positionB37", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "alleleType", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "rsIds", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "alleleFrequencies", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "populationName", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "alleleFrequency", - "type": "double", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": false, - "metadata": {} - }, - { - "name": "inSilicoPredictors", - "nullable": false, - "metadata": {}, - "type": { - "type": "struct", - "fields": [ - { - "name": "cadd", - "nullable": true, - "metadata": {}, - "type": { - "type": "struct", - "fields": [ - { - "name": "raw", - "type": "float", - "nullable": true, - "metadata": {} - }, - { - "name": "phred", - "type": "float", - "nullable": true, - "metadata": {} - } - ] - } - }, - { - "name": "revelMax", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "spliceaiDsMax", - "type": "float", - "nullable": true, - "metadata": {} - }, - { - "name": "pangolinLargestDs", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "phylop", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "siftMax", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "polyphenMax", - "type": "double", - "nullable": true, - "metadata": {} - } - ] - } - }, - { - "name": "vep", - "type": { - "type": "struct", - "fields": [ - { - "name": "mostSevereConsequence", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "transcriptConsequences", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "aminoAcids", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "consequenceTerms", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "geneId", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "lof", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": true, - "metadata": {} - } - ] - }, - "nullable": false, - "metadata": {} - } - ] -} diff --git a/src/gentropy/assets/schemas/variant_index.json b/src/gentropy/assets/schemas/variant_index.json index c6a3702c9..6d5e211ac 100644 --- a/src/gentropy/assets/schemas/variant_index.json +++ b/src/gentropy/assets/schemas/variant_index.json @@ -1,53 +1,224 @@ { - "type": "struct", "fields": [ { + "metadata": {}, "name": "variantId", - "type": "string", "nullable": false, - "metadata": {} + "type": "string" }, { + "metadata": {}, "name": "chromosome", - "type": "string", "nullable": false, - "metadata": {} + "type": "string" }, { + "metadata": {}, "name": "position", - "type": "integer", "nullable": false, - "metadata": {} + "type": "integer" }, { + "metadata": {}, "name": "referenceAllele", - "type": "string", "nullable": false, - "metadata": {} + "type": "string" }, { + "metadata": {}, "name": "alternateAllele", - "type": "string", "nullable": false, - "metadata": {} + "type": "string" }, { - "name": "chromosomeB37", - "type": "string", + "metadata": {}, + "name": "inSilicoPredictors", "nullable": true, - "metadata": {} + "type": { + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "method", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "assessment", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "score", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "assessmentFlag", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "targetId", + "nullable": true, + "type": "string" + } + ], + "type": "struct" + }, + "type": "array" + } }, { - "name": "positionB37", - "type": "integer", + "metadata": {}, + "name": "mostSevereConsequenceId", "nullable": true, - "metadata": {} + "type": "string" }, { - "name": "alleleType", - "type": "string", - "nullable": false, - "metadata": {} + "metadata": {}, + "name": "transcriptConsequences", + "nullable": true, + "type": { + "containsNull": false, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "variantFunctionalConsequenceIds", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "aminoAcidChange", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "uniprotAccessions", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "isEnsemblCanonical", + "nullable": false, + "type": "boolean" + }, + { + "metadata": {}, + "name": "codons", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "distanceFromFootprint", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "distanceFromTss", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "appris", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "maneSelect", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "targetId", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "impact", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "lofteePrediction", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "siftPrediction", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "polyphenPrediction", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "consequenceScore", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "transcriptIndex", + "nullable": true, + "type": "integer" + }, + { + "metadata": {}, + "name": "transcriptId", + "nullable": true, + "type": "string" + } + ], + "type": "struct" + }, + "type": "array" + } + }, + { + "metadata": {}, + "name": "rsIds", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "hgvsId", + "nullable": true, + "type": "string" }, { "name": "alleleFrequencies", @@ -72,92 +243,35 @@ }, "containsNull": true }, - "nullable": false, + "nullable": true, "metadata": {} }, { - "name": "inSilicoPredictors", - "nullable": false, "metadata": {}, + "name": "dbXrefs", + "nullable": true, "type": { - "type": "struct", - "fields": [ - { - "name": "cadd", - "nullable": true, - "metadata": {}, - "type": { - "type": "struct", - "fields": [ - { - "name": "raw", - "type": "float", - "nullable": true, - "metadata": {} - }, - { - "name": "phred", - "type": "float", - "nullable": true, - "metadata": {} - } - ] + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "id", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "source", + "nullable": true, + "type": "string" } - }, - { - "name": "revelMax", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "spliceaiDsMax", - "type": "float", - "nullable": true, - "metadata": {} - }, - { - "name": "pangolinLargestDs", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "phylop", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "siftMax", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "polyphenMax", - "type": "double", - "nullable": true, - "metadata": {} - } - ] + ], + "type": "struct" + }, + "type": "array" } - }, - { - "name": "mostSevereConsequence", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "rsIds", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} } - ] + ], + "type": "struct" } diff --git a/src/gentropy/assets/schemas/vep_json_output.json b/src/gentropy/assets/schemas/vep_json_output.json new file mode 100644 index 000000000..43c3f4ad7 --- /dev/null +++ b/src/gentropy/assets/schemas/vep_json_output.json @@ -0,0 +1,573 @@ +{ + "fields": [ + { + "metadata": {}, + "name": "allele_string", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "assembly_name", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "intergenic_consequences", + "nullable": true, + "type": { + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "hgvsg", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "cadd_phred", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "cadd_raw", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "consequence_terms", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "impact", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "variant_allele", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "gene_id", + "nullable": true, + "type": "string" + } + ], + "type": "struct" + }, + "type": "array" + } + }, + { + "metadata": {}, + "name": "colocated_variants", + "nullable": true, + "type": { + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "allele_string", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "clin_sig", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "clin_sig_allele", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "id", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "phenotype_or_disease", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "pubmed", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "long", + "type": "array" + } + }, + { + "metadata": {}, + "name": "seq_region_name", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "strand", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "var_synonyms", + "nullable": true, + "type": { + "fields": [ + { + "metadata": {}, + "name": "ClinVar", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "LMDD", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "OIVD", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "OMIM", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "double", + "type": "array" + } + }, + { + "metadata": {}, + "name": "PharmGKB", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "PhenCode", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "UniProt", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "dbPEX", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + } + ], + "type": "struct" + } + } + ], + "type": "struct" + }, + "type": "array" + } + }, + { + "metadata": {}, + "name": "end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "id", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "input", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "most_severe_consequence", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "seq_region_name", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "strand", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "transcript_consequences", + "nullable": true, + "type": { + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "alphamissense", + "nullable": true, + "type": { + "fields": [ + { + "metadata": {}, + "name": "am_class", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "am_pathogenicity", + "nullable": true, + "type": "double" + } + ], + "type": "struct" + } + }, + { + "metadata": {}, + "name": "amino_acids", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "hgvsg", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "hgvsc", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "hgvsp", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "appris", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "mane_select", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "tssdistance", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "cadd_phred", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "cadd_raw", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "canonical", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "cdna_end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "cdna_start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "cds_end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "cds_start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "codons", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "consequence_terms", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "distance", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "flags", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "gene_id", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "impact", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "lof", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "lof_filter", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "lof_flags", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "lof_info", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "polyphen_prediction", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "polyphen_score", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "protein_end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "protein_start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "sift_prediction", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "sift_score", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "strand", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "swissprot", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "transcript_id", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "trembl", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "uniparc", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "uniprot_isoform", + "nullable": true, + "type": { + "containsNull": true, + "elementType": "string", + "type": "array" + } + }, + { + "metadata": {}, + "name": "variant_allele", + "nullable": true, + "type": "string" + } + ], + "type": "struct" + }, + "type": "array" + } + } + ], + "type": "struct" +} diff --git a/src/gentropy/biosample_index.py b/src/gentropy/biosample_index.py new file mode 100644 index 000000000..e0b5e9b10 --- /dev/null +++ b/src/gentropy/biosample_index.py @@ -0,0 +1,37 @@ +"""Step to generate biosample index dataset.""" +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.datasource.biosample_ontologies.utils import extract_ontology_from_json + + +class BiosampleIndexStep: + """Biosample index step. + + This step generates a Biosample index dataset from the various ontology sources. Currently Cell Ontology and Uberon are supported. + """ + + def __init__( + self, + session: Session, + cell_ontology_input_path: str, + uberon_input_path: str, + efo_input_path: str, + biosample_index_path: str, + ) -> None: + """Run Biosample index generation step. + + Args: + session (Session): Session object. + cell_ontology_input_path (str): Input cell ontology dataset path. + uberon_input_path (str): Input uberon dataset path. + efo_input_path (str): Input efo dataset path. + biosample_index_path (str): Output gene index dataset path. + """ + cell_ontology_index = extract_ontology_from_json(cell_ontology_input_path, session.spark) + uberon_index = extract_ontology_from_json(uberon_input_path, session.spark) + efo_index = extract_ontology_from_json(efo_input_path, session.spark).retain_rows_with_ancestor_id(["CL_0000000"]) + + biosample_index = cell_ontology_index.merge_indices([uberon_index, efo_index]) + + biosample_index.df.write.mode(session.write_mode).parquet(biosample_index_path) diff --git a/src/gentropy/clump.py b/src/gentropy/clump.py deleted file mode 100644 index 9ea3306ac..000000000 --- a/src/gentropy/clump.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Step to run clump associations from summary statistics or study locus.""" -from __future__ import annotations - -from typing import Optional - -from gentropy.common.session import Session -from gentropy.dataset.ld_index import LDIndex -from gentropy.dataset.study_index import StudyIndex -from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.summary_statistics import SummaryStatistics - - -class ClumpStep: - """Perform clumping of an association dataset to identify independent signals. - - Two types of clumping are supported and are applied based on the input dataset: - - Clumping of summary statistics based on a window-based approach. - - Clumping of study locus based on LD. - - Both approaches yield a StudyLocus dataset. - """ - - def __init__( - self, - session: Session, - input_path: str, - clumped_study_locus_path: str, - study_index_path: Optional[str] = None, - ld_index_path: Optional[str] = None, - locus_collect_distance: Optional[int] = None, - ) -> None: - """Run the clumping step. - - Args: - session (Session): Session object. - input_path (str): Input path for the study locus or summary statistics files. - clumped_study_locus_path (str): Output path for the clumped study locus dataset. - study_index_path (Optional[str]): Input path for the study index dataset. - ld_index_path (Optional[str]): Input path for the LD index dataset. - locus_collect_distance (Optional[int]): Distance in base pairs to collect variants around the study locus. - - Raises: - ValueError: If study index and LD index paths are not provided for study locus. - """ - input_cols = session.spark.read.parquet( - input_path, recursiveFileLookup=True - ).columns - if "studyLocusId" in input_cols: - if study_index_path is None or ld_index_path is None: - raise ValueError( - "Study index and LD index paths are required for clumping study locus." - ) - study_locus = StudyLocus.from_parquet(session, input_path) - ld_index = LDIndex.from_parquet(session, ld_index_path) - study_index = StudyIndex.from_parquet(session, study_index_path) - - clumped_study_locus = study_locus.annotate_ld( - study_index=study_index, ld_index=ld_index - ).clump() - else: - sumstats = SummaryStatistics.from_parquet( - session, input_path, recursiveFileLookup=True - ).coalesce(4000) - clumped_study_locus = sumstats.window_based_clumping( - locus_collect_distance=locus_collect_distance - ) - - clumped_study_locus.df.write.mode(session.write_mode).parquet( - clumped_study_locus_path - ) diff --git a/src/gentropy/colocalisation.py b/src/gentropy/colocalisation.py index 010827713..a45a9a6a1 100644 --- a/src/gentropy/colocalisation.py +++ b/src/gentropy/colocalisation.py @@ -1,10 +1,15 @@ """Step to generate colocalisation results.""" + from __future__ import annotations +from functools import partial +from typing import Any, Type + +from pyspark.sql.functions import col + from gentropy.common.session import Session -from gentropy.dataset.study_index import StudyIndex -from gentropy.dataset.study_locus import CredibleInterval, StudyLocus -from gentropy.method.colocalisation import ECaviar +from gentropy.dataset.study_locus import StudyLocus +from gentropy.method.colocalisation import Coloc, ColocalisationMethodInterface class ColocalisationStep: @@ -13,34 +18,81 @@ class ColocalisationStep: This workflow runs colocalisation analyses that assess the degree to which independent signals of the association share the same causal variant in a region of the genome, typically limited by linkage disequilibrium (LD). """ + __coloc_methods__ = { + method.METHOD_NAME.lower(): method + for method in ColocalisationMethodInterface.__subclasses__() + } + def __init__( self, session: Session, credible_set_path: str, - study_index_path: str, coloc_path: str, + colocalisation_method: str, + colocalisation_method_params: dict[str, Any] | None = None, ) -> None: """Run Colocalisation step. + This step allows for running two colocalisation methods: ecaviar and coloc. + Args: session (Session): Session object. credible_set_path (str): Input credible sets path. - study_index_path (str): Input study index path. coloc_path (str): Output Colocalisation path. + colocalisation_method (str): Colocalisation method. + colocalisation_method_params (dict[str, Any] | None): Keyword arguments passed to the colocalise method of Colocalisation class. Defaults to None + + Keyword Args: + priorc1 (float): Prior on variant being causal for trait 1. Defaults to 1e-4. For coloc method only. + priorc2 (float): Prior on variant being causal for trait 2. Defaults to 1e-4. For coloc method only. + priorc12 (float): Prior on variant being causal for both traits. Defaults to 1e-5. For coloc method only. """ + colocalisation_method = colocalisation_method.lower() + colocalisation_class = self._get_colocalisation_class(colocalisation_method) + # Extract credible_set = StudyLocus.from_parquet( - session, credible_set_path, recursiveFileLookup=True - ) - si = StudyIndex.from_parquet( - session, study_index_path, recursiveFileLookup=True + session, credible_set_path, recusiveFileLookup=True ) + if colocalisation_method == Coloc.METHOD_NAME.lower(): + credible_set = credible_set.filter( + col("finemappingMethod").isin("SuSie", "SuSiE-inf") + ) # Transform - overlaps = credible_set.filter_credible_set( - CredibleInterval.IS95 - ).find_overlaps(si) - ecaviar_results = ECaviar.colocalise(overlaps) + overlaps = credible_set.find_overlaps() + # Make a partial caller to ensure that colocalisation_method_params are added to the call only when dict is not empty + coloc = colocalisation_class.colocalise + if colocalisation_method_params: + coloc = partial(coloc, **colocalisation_method_params) + colocalisation_results = coloc(overlaps) # Load - ecaviar_results.df.write.mode(session.write_mode).parquet(coloc_path) + colocalisation_results.df.write.mode(session.write_mode).parquet( + f"{coloc_path}/{colocalisation_method.lower()}" + ) + + @classmethod + def _get_colocalisation_class( + cls, method: str + ) -> Type[ColocalisationMethodInterface]: + """Get colocalisation class. + + Args: + method (str): Colocalisation method. + + Returns: + Type[ColocalisationMethodInterface]: Class that implements the ColocalisationMethodInterface. + + Raises: + ValueError: if method not available. + + Examples: + >>> ColocalisationStep._get_colocalisation_class("ECaviar") + + """ + method = method.lower() + if method not in cls.__coloc_methods__: + raise ValueError(f"Colocalisation method {method} not available.") + coloc_method = cls.__coloc_methods__[method] + return coloc_method diff --git a/src/gentropy/common/Liftover.py b/src/gentropy/common/Liftover.py index e0ac577c9..b7841c190 100644 --- a/src/gentropy/common/Liftover.py +++ b/src/gentropy/common/Liftover.py @@ -1,4 +1,5 @@ """LiftOver support.""" + from __future__ import annotations import tempfile @@ -24,17 +25,19 @@ class LiftOverSpark: - The mapping is dropped if the mapped chromosome is not on the same as the source. - The mapping is dropped if the mapping is ambiguous (more than one mapping is available). - If regions are provided, the mapping is dropped if the new region is reversed (mapped_start > mapped_end). - - If regions are provided, the mapping is dropped if the difference of the lenght of the mapped region and original is larger than a threshold. + - If regions are provided, the mapping is dropped if the difference of the length of the mapped region and original is larger than a threshold. - When lifting over intervals, only unique coordinates are lifted, they joined back to the original dataframe. - - Args: - chain_file (str): Path to the chain file - max_difference (int): Maximum difference between the length of the mapped region and the original region. Defaults to 100. """ - def __init__( # noqa: D107 + def __init__( self: LiftOverSpark, chain_file: str, max_difference: int = 100 ) -> None: + """Initialize the LiftOver object. + + Args: + chain_file (str): Path to the chain file + max_difference (int, optional): The maximum tolerated difference in the resulting length. Defaults to 100. + """ self.chain_file = chain_file self.max_difference = max_difference diff --git a/src/gentropy/common/genomic_region.py b/src/gentropy/common/genomic_region.py new file mode 100644 index 000000000..ffa298f86 --- /dev/null +++ b/src/gentropy/common/genomic_region.py @@ -0,0 +1,103 @@ +"""Genomic Region class.""" + +from enum import Enum + + +class KnownGenomicRegions(Enum): + """Known genomic regions in the human genome in string format.""" + + MHC = "chr6:25726063-33400556" + + +class GenomicRegion: + """Genomic regions of interest. + + Attributes: + chromosome (str): Chromosome. + start (int): Start position. + end (int): + """ + + def __init__(self, chromosome: str, start: int, end: int) -> None: + """Class constructor. + + Args: + chromosome (str): Chromosome. + start (int): Start position. + end (int): End position. + """ + self.chromosome = chromosome + self.start = start + self.end = end + + def __str__(self) -> str: + """String representation of the genomic region. + + Returns: + str: Genomic region in chr:start-end format. + """ + return f"{self.chromosome}:{self.start}-{self.end}" + + @classmethod + def from_string(cls: type["GenomicRegion"], region: str) -> "GenomicRegion": + """Parse region string to chr:start-end. + + Args: + region (str): Genomic region expected to follow chr##:#,###-#,### format or ##:####-#####. + + Returns: + GenomicRegion: Genomic region object. + + Raises: + ValueError: If the end and start positions cannot be casted to integer or not all three values value error is raised. + + Examples: + >>> print(GenomicRegion.from_string('chr6:28,510,120-33,480,577')) + 6:28510120-33480577 + >>> print(GenomicRegion.from_string('6:28510120-33480577')) + 6:28510120-33480577 + >>> print(GenomicRegion.from_string('6:28510120')) + Traceback (most recent call last): + ... + ValueError: Genomic region should follow a ##:####-#### format. + >>> print(GenomicRegion.from_string('6:28510120-foo')) + Traceback (most recent call last): + ... + ValueError: Start and the end position of the region has to be integer. + """ + region = region.replace(":", "-").replace(",", "") + try: + chromosome, start_position, end_position = region.split("-") + except ValueError as err: + raise ValueError( + "Genomic region should follow a ##:####-#### format." + ) from err + + try: + return cls( + chromosome=chromosome.replace("chr", ""), + start=int(start_position), + end=int(end_position), + ) + except ValueError as err: + raise ValueError( + "Start and the end position of the region has to be integer." + ) from err + + @classmethod + def from_known_genomic_region( + cls: type["GenomicRegion"], region: KnownGenomicRegions + ) -> "GenomicRegion": + """Get known genomic region. + + Args: + region (KnownGenomicRegions): Known genomic region. + + Returns: + GenomicRegion: Genomic region object. + + Examples: + >>> print(GenomicRegion.from_known_genomic_region(KnownGenomicRegions.MHC)) + 6:25726063-33400556 + """ + return GenomicRegion.from_string(region.value) diff --git a/src/gentropy/common/harmonise.py b/src/gentropy/common/harmonise.py new file mode 100644 index 000000000..6420245bd --- /dev/null +++ b/src/gentropy/common/harmonise.py @@ -0,0 +1,191 @@ +"""Variant harmonisation utilities.""" + +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark.sql import DataFrame, SparkSession + +from gentropy.common.spark_helpers import neglog_pvalue_to_mantissa_and_exponent + + +def harmonise_summary_stats( + spark: SparkSession, + raw_summary_stats_path: str, + tmp_variant_annotation_path: str, + chromosome: str, + colname_position: str, + colname_allele0: str, + colname_allele1: str, + colname_a1freq: str | None, + colname_info: str | None, + colname_beta: str, + colname_se: str, + colname_mlog10p: str, + colname_n: str | None, +) -> DataFrame: + """Ingest and harmonise the summary stats. + + 1. Rename chromosome 23 to X. + 2. Filter out low INFO rows. + 3. Filter out low frequency rows. + 4. Assign variant types. + 5. Create variant ID for joining the variant annotation dataset. + 6. Join with the Variant Annotation dataset. + 7. Drop bad quality variants. + + Args: + spark (SparkSession): Spark session object. + raw_summary_stats_path (str): Input raw summary stats path. + tmp_variant_annotation_path (str): Path to the Variant Annotation dataset which has been further prepared and processed by the per_chromosome module (previous PR in the chain) to speed up the joins in the harmonisation phase. It includes all variants in both the direct (A0/A1) and reverse (A1/A0) orientations, so that the direction of the variant can be easily determined on joining. + chromosome (str): Which chromosome to process. + colname_position (str): Column name for position. + colname_allele0 (str): Column name for allele0. + colname_allele1 (str): Column name for allele1. + colname_a1freq (str | None): Column name for allele1 frequency (optional). + colname_info (str | None): Column name for INFO, reflecting variant quality (optional). + colname_beta (str): Column name for beta. + colname_se (str): Column name for beta standard error. + colname_mlog10p (str): Column name for -log10(p). + colname_n (str | None): Column name for the number of samples (optional). + + Returns: + DataFrame: A harmonised summary stats dataframe. + """ + # Read the precomputed variant annotation dataset. + va_df = ( + spark + .read + .parquet(tmp_variant_annotation_path) + .filter(f.col("vaChromosome") == ("X" if chromosome == "23" else chromosome)) + .persist() + ) + + # Read and process the summary stats dataset. + df = ( + spark + .read + .parquet(raw_summary_stats_path) + .filter(f.col("chromosome") == chromosome) + # Harmonise, 1: Rename chromosome 23 to X. + .withColumn( + "chromosome", + f.when( + f.col("chromosome") == "23", "X" + ).otherwise(f.col("chromosome")) + ) + ) + if colname_info: + # Harmonise, 2: Filter out low INFO rows. + df = df.filter(f.col(colname_info) >= 0.8) + if colname_a1freq: + # Harmonise, 3: Filter out low frequency rows. + df = ( + df + .withColumn( + "MAF", + f.when(f.col(colname_a1freq) < 0.5, f.col(colname_a1freq)) + .otherwise(1 - f.col(colname_a1freq)) + ) + .filter(f.col("MAF") >= 0.0001) + .drop("MAF") + ) + df = ( + df + # Harmonise, 4: Assign variant types. + # There are three possible variant types: + # 1. `snp_c` means an SNP converting a base into its complementary base: A<>T or G> None: + """Prepare the Variant Annotation dataset for efficient per-chromosome joins. + + Args: + session (SparkSession): The Spark session to be used for reading and writing data. + variant_annotation_path (str): The path to the input variant annotation dataset. + tmp_variant_annotation_path (str): The path to store the temporary output for the repartitioned annotation dataset. + """ + va_df = ( + session + .spark + .read + .parquet(variant_annotation_path) + ) + va_df_direct = ( + va_df. + select( + f.col("chromosome").alias("vaChromosome"), + f.col("variantId"), + f.concat_ws( + "_", + f.col("chromosome"), + f.col("position"), + f.col("referenceAllele"), + f.col("alternateAllele") + ).alias("summary_stats_id"), + f.lit("direct").alias("direction") + ) + ) + va_df_flip = ( + va_df. + select( + f.col("chromosome").alias("vaChromosome"), + f.col("variantId"), + f.concat_ws( + "_", + f.col("chromosome"), + f.col("position"), + f.col("alternateAllele"), + f.col("referenceAllele") + ).alias("summary_stats_id"), + f.lit("flip").alias("direction") + ) + ) + ( + va_df_direct.union(va_df_flip) + .coalesce(1) + .repartition("vaChromosome") + .write + .partitionBy("vaChromosome") + .mode("overwrite") + .parquet(tmp_variant_annotation_path) + ) + + +def process_summary_stats_per_chromosome( + session: SparkSession, + ingestion_class: type[UkbPppEurSummaryStats] | type[FinngenUkbMetaSummaryStats], + raw_summary_stats_path: str, + tmp_variant_annotation_path: str, + summary_stats_output_path: str, + study_index_path: str, + ) -> None: + """Processes summary statistics for each chromosome, partitioning and writing results. + + Args: + session (SparkSession): The Spark session to use for distributed data processing. + ingestion_class (type[UkbPppEurSummaryStats] | type[FinngenUkbMetaSummaryStats]): The class used to handle ingestion of source data. Must have a `from_source` method returning a DataFrame. + raw_summary_stats_path (str): The path to the raw summary statistics files. + tmp_variant_annotation_path (str): The path to temporary variant annotation data, used for chromosome joins. + summary_stats_output_path (str): The output path to write processed summary statistics as parquet files. + study_index_path (str): The path to study index, which is necessary in some cases to populate the sample size column. + """ + # Set mode to overwrite for processing the first chromosome. + write_mode = "overwrite" + # Chromosome 23 is X, this is handled downstream. + for chromosome in list(range(1, 24)): + logging_message = f" Processing chromosome {chromosome}" + session.logger.info(logging_message) + ( + ingestion_class.from_source( + spark=session.spark, + raw_summary_stats_path=raw_summary_stats_path, + tmp_variant_annotation_path=tmp_variant_annotation_path, + chromosome=str(chromosome), + study_index_path=study_index_path, + ) + .df + .coalesce(1) + .repartition("studyId", "chromosome") + .write + .partitionBy("studyId", "chromosome") + .mode(write_mode) + .parquet(summary_stats_output_path) + ) + # Now that we have written the first chromosome, change mode to append for subsequent operations. + write_mode = "append" diff --git a/src/gentropy/common/schemas.py b/src/gentropy/common/schemas.py index 1dcd75a22..624e3e0e1 100644 --- a/src/gentropy/common/schemas.py +++ b/src/gentropy/common/schemas.py @@ -1,66 +1,212 @@ """Methods for handling schemas.""" + from __future__ import annotations import importlib.resources as pkg_resources import json -from collections import namedtuple -from typing import Any +from collections import defaultdict -import pyspark.sql.types as t +from pyspark.sql.types import ArrayType, StructType from gentropy.assets import schemas -def parse_spark_schema(schema_json: str) -> t.StructType: +class SchemaValidationError(Exception): + """This exception is raised when a schema validation fails.""" + + def __init__( + self: SchemaValidationError, message: str, errors: defaultdict[str, list[str]] + ) -> None: + """Initialize the SchemaValidationError. + + Args: + message (str): The message to be displayed. + errors (defaultdict[str, list[str]]): The collection of observed discrepancies + """ + super().__init__(message) + self.message = message # Explicitly set the message attribute + self.errors = errors + + def __str__(self: SchemaValidationError) -> str: + """Return a string representation of the exception. + + Returns: + str: The string representation of the exception. + """ + stringified_errors = "\n ".join( + [f'{k}: {",".join(v)}' for k, v in self.errors.items()] + ) + return f"{self.message}\nErrors:\n {stringified_errors}" + + +def parse_spark_schema(schema_json: str) -> StructType: """Parse Spark schema from JSON. Args: schema_json (str): JSON filename containing spark schema in the schemas package Returns: - t.StructType: Spark schema + StructType: Spark schema """ core_schema = json.loads( pkg_resources.read_text(schemas, schema_json, encoding="utf-8") ) - return t.StructType.fromJson(core_schema) + return StructType.fromJson(core_schema) -def flatten_schema(schema: t.StructType, prefix: str = "") -> list[Any]: - """It takes a Spark schema and returns a list of all fields in the schema once flattened. +def compare_array_schemas( + observed_schema: ArrayType, + expected_schema: ArrayType, + parent_field_name: str | None = None, + schema_issues: defaultdict[str, list[str]] | None = None, +) -> defaultdict[str, list[str]]: + """Compare two array schemas. + + The comparison is done recursively, so nested structs are also compared. Args: - schema (t.StructType): The schema of the dataframe - prefix (str): The prefix to prepend to the field names. Defaults to "". + observed_schema (ArrayType): The observed schema. + expected_schema (ArrayType): The expected schema. + parent_field_name (str | None): The parent field name. Defaults to None. + schema_issues (defaultdict[str, list[str]] | None): The schema issues. Defaults to None. Returns: - list[Any]: A list of all the columns in the dataframe. - - Examples: - >>> from pyspark.sql.types import ArrayType, StringType, StructField, StructType - >>> schema = StructType( - ... [ - ... StructField("studyLocusId", StringType(), False), - ... StructField("locus", ArrayType(StructType([StructField("variantId", StringType(), False)])), False) - ... ] - ... ) - >>> df = spark.createDataFrame([("A", [{"variantId": "varA"}]), ("B", [{"variantId": "varB"}])], schema) - >>> flatten_schema(df.schema) - [Field(name='studyLocusId', dataType=StringType()), Field(name='locus', dataType=ArrayType(StructType([]), True)), Field(name='locus.variantId', dataType=StringType())] + defaultdict[str, list[str]]: The schema issues. """ - Field = namedtuple("Field", ["name", "dataType"]) - fields = [] - for field in schema.fields: - name = f"{prefix}.{field.name}" if prefix else field.name - dtype = field.dataType - if isinstance(dtype, t.StructType): - fields.append(Field(name, t.ArrayType(t.StructType()))) - fields += flatten_schema(dtype, prefix=name) - elif isinstance(dtype, t.ArrayType) and isinstance( - dtype.elementType, t.StructType - ): - fields.append(Field(name, t.ArrayType(t.StructType()))) - fields += flatten_schema(dtype.elementType, prefix=name) - else: - fields.append(Field(name, dtype)) - return fields + # Create default values if not provided: + if schema_issues is None: + schema_issues = defaultdict(list) + + if parent_field_name is None: + parent_field_name = "" + + observed_type = observed_schema.elementType.typeName() + expected_type = expected_schema.elementType.typeName() + + # If element types are not matching, no further tests are needed: + if observed_type != expected_type: + schema_issues["columns_with_non_matching_type"].append( + f'For column "{parent_field_name}[]" found {observed_type} instead of {expected_type}' + ) + + # If element type is a struct, resolve nesting: + elif (observed_type == "struct") and (expected_type == "struct"): + schema_issues = compare_struct_schemas( + observed_schema.elementType, + expected_schema.elementType, + f"{parent_field_name}[].", + schema_issues, + ) + + # If element type is an array, resolve nesting: + elif (observed_type == "array") and (expected_type == "array"): + schema_issues = compare_array_schemas( + observed_schema.elementType, + expected_schema.elementType, + parent_field_name, + schema_issues, + ) + + return schema_issues + + +def compare_struct_schemas( + observed_schema: StructType, + expected_schema: StructType, + parent_field_name: str | None = None, + schema_issues: defaultdict[str, list[str]] | None = None, +) -> defaultdict[str, list[str]]: + """Compare two struct schemas. + + The comparison is done recursively, so nested structs are also compared. + + Checking logic: + 1. Checking for duplicated columns in the observed schema. + 2. Checking for missing mandatory columns in the observed schema. + 3. Now we know that all mandatory columns are present, we can iterate over the observed schema and compare the types. + 4. Flagging unexpected columns in the observed schema. + 5. Flagging columns with non-matching types. + 6. If a column is a struct -> call compare_struct_schemas + 7. If a column is an array -> call compare_array_schemas + 8. Return dictionary with issues. + + Args: + observed_schema (StructType): The observed schema. + expected_schema (StructType): The expected schema. + parent_field_name (str | None): The parent field name. Defaults to None. + schema_issues (defaultdict[str, list[str]] | None): The schema issues. Defaults to None. + + Returns: + defaultdict[str, list[str]]: The schema issues. + """ + # Create default values if not provided: + if schema_issues is None: + schema_issues = defaultdict(list) + + if parent_field_name is None: + parent_field_name = "" + + # Flagging duplicated columns if present: + if duplicated_columns := list( + { + f"{parent_field_name}{field.name}" + for field in observed_schema + if list(observed_schema).count(field) > 1 + } + ): + schema_issues["duplicated_columns"] += duplicated_columns + + # Testing mandatory fields: + required_fields = [x.name for x in expected_schema if not x.nullable] + if missing_required_fields := [ + f"{parent_field_name}{req}" + for req in required_fields + if not any(field.name == req for field in observed_schema) + ]: + schema_issues["missing_mandatory_columns"] += missing_required_fields + + # Converting schema to dictionaries for easier comparison: + observed_schema_dict = {field.name: field for field in observed_schema} + expected_schema_dict = {field.name: field for field in expected_schema} + + # Testing optional fields and types: + for field_name, field in observed_schema_dict.items(): + # Testing observed field name, if name is not matched, no further tests are needed: + if field_name not in expected_schema_dict: + schema_issues["unexpected_columns"].append( + f"{parent_field_name}{field_name}" + ) + continue + + # When we made sure the field is in both schemas, extracting field type information: + observed_type = field.dataType + observed_type_name = field.dataType.typeName() + + expected_type = expected_schema_dict[field_name].dataType + expected_type_name = expected_schema_dict[field_name].dataType.typeName() + + # Flagging non-matching types if types don't match, jumping to next field: + if observed_type_name != expected_type_name: + schema_issues["columns_with_non_matching_type"].append( + f'For column "{parent_field_name}{field_name}" found {observed_type_name} instead of {expected_type_name}' + ) + continue + + # If column is a struct, resolve nesting: + if observed_type_name == "struct": + schema_issues = compare_struct_schemas( + observed_type, + expected_type, + f"{parent_field_name}{field_name}.", + schema_issues, + ) + # If column is an array, resolve nesting: + elif observed_type_name == "array": + schema_issues = compare_array_schemas( + observed_type, + expected_type, + f"{parent_field_name}{field_name}[]", + schema_issues, + ) + + return schema_issues diff --git a/src/gentropy/common/session.py b/src/gentropy/common/session.py index 1837aec6b..297903629 100644 --- a/src/gentropy/common/session.py +++ b/src/gentropy/common/session.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING +import hail as hl from pyspark.conf import SparkConf from pyspark.sql import SparkSession @@ -50,6 +51,8 @@ def __init__( # noqa: D107 self.hail_home = hail_home self.start_hail = start_hail + if start_hail: + hl.init(sc=self.spark.sparkContext, log="/dev/null") def _default_config(self: Session) -> SparkConf: """Default spark configuration. @@ -122,24 +125,32 @@ def _create_merged_config( all_settings += list(extended_spark_conf.items()) return SparkConf().setAll(all_settings) - def read_parquet( + def load_data( self: Session, path: str | list[str], - schema: StructType, + format: str = "parquet", + schema: StructType | str | None = None, **kwargs: bool | float | int | str | None, ) -> DataFrame: - """Reads parquet dataset (provided as a single path or a list of paths) with a provided schema. + """Generic function to read a file or folder into a Spark dataframe. + + The `recursiveFileLookup` flag when set to True will skip all partition columns, but read files from all subdirectories. Args: - path (str | list[str]): path to the parquet dataset - schema (StructType): Spark schema - **kwargs (bool | float | int | str | None): Additional arguments to pass to spark.read.parquet + path (str | list[str]): path to the dataset + format (str): file format. Defaults to parquet. + schema (StructType | str | None): Schema to use when reading the data. + **kwargs (bool | float | int | str | None): Additional arguments to pass to spark.read.load. `mergeSchema` is set to True, `recursiveFileLookup` is set to False by default. Returns: - DataFrame: Dataframe with provided schema + DataFrame: Dataframe """ - path = [path] if isinstance(path, str) else path - return self.spark.read.schema(schema).parquet(*path, **kwargs) + # Set default kwargs + if schema is None: + kwargs["inferSchema"] = kwargs.get("inferSchema", True) + kwargs["mergeSchema"] = kwargs.get("mergeSchema", True) + kwargs["recursiveFileLookup"] = kwargs.get("recursiveFileLookup", False) + return self.spark.read.load(path, format=format, schema=schema, **kwargs) class Log4j: diff --git a/src/gentropy/common/spark_helpers.py b/src/gentropy/common/spark_helpers.py index bd22d91c9..a1bf9670a 100644 --- a/src/gentropy/common/spark_helpers.py +++ b/src/gentropy/common/spark_helpers.py @@ -1,21 +1,23 @@ """Common utilities in Spark that can be used across the project.""" + from __future__ import annotations import re import sys -from typing import TYPE_CHECKING, Any, Iterable, Optional +from functools import reduce, wraps +from itertools import chain +from typing import TYPE_CHECKING, Any, Callable, Iterable, Optional, TypeVar import pyspark.sql.functions as f import pyspark.sql.types as t from pyspark.ml import Pipeline from pyspark.ml.feature import MinMaxScaler, VectorAssembler from pyspark.ml.functions import vector_to_array -from pyspark.sql import Row, Window -from pyspark.sql.types import FloatType +from pyspark.sql import Column, Row, Window from scipy.stats import norm if TYPE_CHECKING: - from pyspark.sql import Column, DataFrame, WindowSpec + from pyspark.sql import DataFrame, WindowSpec def convert_from_wide_to_long( @@ -53,7 +55,7 @@ def convert_from_wide_to_long( _vars_and_vals = f.array( *( f.struct( - f.lit(c).alias(var_name), f.col(c).cast(FloatType()).alias(value_name) + f.lit(c).alias(var_name), f.col(c).cast(t.FloatType()).alias(value_name) ) for c in value_vars ) @@ -265,19 +267,19 @@ def neglog_pvalue_to_mantissa_and_exponent(p_value: Column) -> tuple[Column, Col ... .select('negLogPv',*neglog_pvalue_to_mantissa_and_exponent(f.col('negLogPv'))) ... .show() ... ) - +--------+------------------+--------------+ - |negLogPv| pValueMantissa|pValueExponent| - +--------+------------------+--------------+ - | 4.56| 3.63078054770101| -5| - | 2109.23|1.6982436524618154| -2110| - +--------+------------------+--------------+ + +--------+--------------+--------------+ + |negLogPv|pValueMantissa|pValueExponent| + +--------+--------------+--------------+ + | 4.56| 2.7542286| -5| + | 2109.23| 5.8884363| -2110| + +--------+--------------+--------------+ """ exponent: Column = f.ceil(p_value) - mantissa: Column = f.pow(f.lit(10), (p_value - exponent + f.lit(1))) + mantissa: Column = f.pow(f.lit(10), (exponent - p_value)) return ( - mantissa.cast(t.DoubleType()).alias("pValueMantissa"), + mantissa.cast(t.FloatType()).alias("pValueMantissa"), (-1 * exponent).cast(t.IntegerType()).alias("pValueExponent"), ) @@ -363,6 +365,7 @@ def order_array_of_structs_by_field(column_name: str, field_name: str) -> Column array_sort( {column_name}, (left, right) -> case + when left.{field_name} is null and right.{field_name} is null then 0 when left.{field_name} is null then 1 when right.{field_name} is null then -1 when left.{field_name} < right.{field_name} then 1 @@ -373,6 +376,111 @@ def order_array_of_structs_by_field(column_name: str, field_name: str) -> Column ) +def order_array_of_structs_by_two_fields( + array_name: str, descending_column: str, ascending_column: str +) -> Column: + """Sort array of structs by a field in descending order and by an other field in an ascending order. + + This function doesn't deal with null values, assumes the sort columns are not nullable. + The sorting function compares the descending_column first, in case when two values from descending_column are equal + it compares the ascending_column. When values in both columns are equal, the rows order is preserved. + + Args: + array_name (str): Column name with array of structs + descending_column (str): Name of the first keys sorted in descending order + ascending_column (str): Name of the second keys sorted in ascending order + + Returns: + Column: Sorted column + + Examples: + >>> data = [(1.0, 45, 'First'), (0.5, 232, 'Third'), (0.5, 233, 'Fourth'), (1.0, 125, 'Second'),] + >>> ( + ... spark.createDataFrame(data, ['col1', 'col2', 'ranking']) + ... .groupBy(f.lit('c')) + ... .agg(f.collect_list(f.struct('col1','col2', 'ranking')).alias('list')) + ... .select(order_array_of_structs_by_two_fields('list', 'col1', 'col2').alias('sorted_list')) + ... .show(truncate=False) + ... ) + +-----------------------------------------------------------------------------+ + |sorted_list | + +-----------------------------------------------------------------------------+ + |[{1.0, 45, First}, {1.0, 125, Second}, {0.5, 232, Third}, {0.5, 233, Fourth}]| + +-----------------------------------------------------------------------------+ + + >>> data = [(1.0, 45, 'First'), (1.0, 45, 'Second'), (0.5, 233, 'Fourth'), (1.0, 125, 'Third'),] + >>> ( + ... spark.createDataFrame(data, ['col1', 'col2', 'ranking']) + ... .groupBy(f.lit('c')) + ... .agg(f.collect_list(f.struct('col1','col2', 'ranking')).alias('list')) + ... .select(order_array_of_structs_by_two_fields('list', 'col1', 'col2').alias('sorted_list')) + ... .show(truncate=False) + ... ) + +----------------------------------------------------------------------------+ + |sorted_list | + +----------------------------------------------------------------------------+ + |[{1.0, 45, First}, {1.0, 45, Second}, {1.0, 125, Third}, {0.5, 233, Fourth}]| + +----------------------------------------------------------------------------+ + + """ + return f.expr( + f""" + array_sort( + {array_name}, + (left, right) -> case + when left.{descending_column} is null and right.{descending_column} is null then 0 + when left.{ascending_column} is null and right.{ascending_column} is null then 0 + + when left.{descending_column} is null then 1 + when right.{descending_column} is null then -1 + + when left.{ascending_column} is null then 1 + when right.{ascending_column} is null then -1 + + when left.{descending_column} < right.{descending_column} then 1 + when left.{descending_column} > right.{descending_column} then -1 + when left.{descending_column} == right.{descending_column} and left.{ascending_column} > right.{ascending_column} then 1 + when left.{descending_column} == right.{descending_column} and left.{ascending_column} < right.{ascending_column} then -1 + when left.{ascending_column} == right.{ascending_column} and left.{descending_column} == right.{descending_column} then 0 + end) + """ + ) + + +def map_column_by_dictionary(col: Column, mapping_dict: dict[str, Any]) -> Column: + """Map column values to dictionary values by key. + + Missing consequence label will be converted to None, unmapped consequences will be mapped as None. + + Args: + col (Column): Column containing labels to map. + mapping_dict (dict[str, Any]): Dictionary with mapping key/value pairs. + + Returns: + Column: Column with mapped values. + + Examples: + >>> data = [('consequence_1',),('unmapped_consequence',),(None,)] + >>> m = {'consequence_1': 'SO:000000'} + >>> ( + ... spark.createDataFrame(data, ['label']) + ... .select('label',map_column_by_dictionary(f.col('label'),m).alias('id')) + ... .show() + ... ) + +--------------------+---------+ + | label| id| + +--------------------+---------+ + | consequence_1|SO:000000| + |unmapped_consequence| null| + | null| null| + +--------------------+---------+ + + """ + map_expr = f.create_map(*[f.lit(x) for x in chain(*mapping_dict.items())]) + + return map_expr[col] + + def pivot_df( df: DataFrame, pivot_col: str, @@ -431,3 +539,346 @@ def get_value_from_row(row: Row, column: str) -> Any: if column not in row: raise ValueError(f"Column {column} not found in row {row}") return row[column] + + +def enforce_schema( + expected_schema: t.ArrayType | t.StructType | Column | str, +) -> Callable[..., Any]: + """A function to enforce the schema of a function output follows expectation. + + Behaviour: + - Fields that are not present in the expected schema will be dropped. + - Expected but missing fields will be added with Null values. + - Fields with incorrect data types will be casted to the expected data type. + + This is a decorator function and expected to be used like this: + + @enforce_schema(spark_schema) + def my_function() -> t.StructType: + return ... + + Args: + expected_schema (t.ArrayType | t.StructType | Column | str): The expected schema of the output. + + Returns: + Callable[..., Any]: A decorator function. + """ + T = TypeVar("T", str, Column) + + def decorator(function: Callable[..., T]) -> Callable[..., T]: + """A decorator function to enforce the schema of a function output follows expectation. + + Args: + function (Callable[..., T]): The function to be decorated. + + Returns: + Callable[..., T]: The decorated function. + """ + + @wraps(function) + def wrapper(*args: str, **kwargs: str) -> Any: + return f.from_json(f.to_json(function(*args, **kwargs)), expected_schema) + + return wrapper + + return decorator + + +def rename_all_columns(df: DataFrame, prefix: str) -> DataFrame: + """Given a prefix, rename all columns of a DataFrame. + + Args: + df (DataFrame): The DataFrame to be processed. + prefix (str): The prefix to be added to the column names. + + Returns: + DataFrame: The DataFrame with all columns renamed. + + Examples: + >>> data = [('a', 1.2, True),('b', 0.0, False),('c', None, None),] + >>> prefix = 'prefix_' + >>> rename_all_columns(spark.createDataFrame(data, ['col1', 'col2', 'col3']), prefix).show() + +-----------+-----------+-----------+ + |prefix_col1|prefix_col2|prefix_col3| + +-----------+-----------+-----------+ + | a| 1.2| true| + | b| 0.0| false| + | c| null| null| + +-----------+-----------+-----------+ + + """ + return reduce( + lambda df, col: df.withColumnRenamed(col, f"{prefix}{col}"), + df.columns, + df, + ) + + +def safe_array_union( + a: Column, b: Column, fields_order: list[str] | None = None +) -> Column: + """Merge the content of two optional columns. + + The function assumes the array columns have the same schema. + If the `fields_order` is passed, the function assumes that it deals with array of structs and sorts the nested + struct fields by the provided `fields_order` before conducting array_merge. + If the `fields_order` is not passed and both columns are > type then function assumes struct fields have the same order, + otherwise the function will raise an AnalysisException. + + Args: + a (Column): One optional array column. + b (Column): The other optional array column. + fields_order (list[str] | None): The order of the fields in the struct. Defaults to None. + + Returns: + Column: array column with merged content. + + Examples: + >>> data = [(['a'], ['b']), (['c'], None), (None, ['d']), (None, None)] + >>> ( + ... spark.createDataFrame(data, ['col1', 'col2']) + ... .select( + ... safe_array_union(f.col('col1'), f.col('col2')).alias('merged') + ... ) + ... .show() + ... ) + +------+ + |merged| + +------+ + |[a, b]| + | [c]| + | [d]| + | null| + +------+ + + >>> schema="arr2: array>, arr: array>" + >>> data = [([(1,"a",), (2, "c")],[("a", 1,)]),] + >>> df = spark.createDataFrame(data=data, schema=schema) + >>> df.select(safe_array_union(f.col("arr"), f.col("arr2"), fields_order=["a", "b"]).alias("merged")).show() + +----------------+ + | merged| + +----------------+ + |[{a, 1}, {c, 2}]| + +----------------+ + + >>> schema="arr2: array>, arr: array>" + >>> data = [([(1,"a",), (2, "c")],[("a", 1,)]),] + >>> df = spark.createDataFrame(data=data, schema=schema) + >>> df.select(safe_array_union(f.col("arr"), f.col("arr2")).alias("merged")).show() # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + pyspark.sql.utils.AnalysisException: ... + """ + if fields_order: + # sort the nested struct fields by the provided order + a = sort_array_struct_by_columns(a, fields_order) + b = sort_array_struct_by_columns(b, fields_order) + return f.when(a.isNotNull() & b.isNotNull(), f.array_union(a, b)).otherwise( + f.coalesce(a, b) + ) + + +def sort_array_struct_by_columns(column: Column, fields_order: list[str]) -> Column: + """Sort nested struct fields by provided fields order. + + Args: + column (Column): Column with array of structs. + fields_order (list[str]): List of field names to sort by. + + Returns: + Column: Sorted column. + + Examples: + >>> schema="arr: array>" + >>> data = [([(1,"a",), (2, "c")],)] + >>> fields_order = ["a", "b"] + >>> df = spark.createDataFrame(data=data, schema=schema) + >>> df.select(sort_array_struct_by_columns(f.col("arr"), fields_order).alias("sorted")).show() + +----------------+ + | sorted| + +----------------+ + |[{c, 2}, {a, 1}]| + +----------------+ + + """ + column_name = extract_column_name(column) + fields_order_expr = ", ".join([f"x.{field}" for field in fields_order]) + return f.expr( + f"sort_array(transform({column_name}, x -> struct({fields_order_expr})), False)" + ).alias(column_name) + + +def extract_column_name(column: Column) -> str: + """Extract column name from a column expression. + + Args: + column (Column): Column expression. + + Returns: + str: Column name. + + Raises: + ValueError: If the column name cannot be extracted. + + Examples: + >>> extract_column_name(f.col('col1')) + 'col1' + >>> extract_column_name(f.sort_array(f.col('col1'))) + 'sort_array(col1, true)' + """ + pattern = re.compile("^Column<'(?P.*)'>?") + + _match = pattern.search(str(column)) + if not _match: + raise ValueError(f"Cannot extract column name from {column}") + return _match.group("name") + + +def create_empty_column_if_not_exists( + col_name: str, col_schema: t.DataType = t.NullType() +) -> Column: + """Create a column if it does not exist in the DataFrame. + + Args: + col_name (str): The name of the column to be created. + col_schema (t.DataType): The schema of the column to be created. Defaults to NullType. + + Returns: + Column: The expression to create the column. + + Examples: + >>> df = spark.createDataFrame([(1, 2),], ['col1', 'col2']) + >>> df.select("*", create_empty_column_if_not_exists('col3', t.IntegerType())).show() + +----+----+----+ + |col1|col2|col3| + +----+----+----+ + | 1| 2|null| + +----+----+----+ + + """ + return f.lit(None).cast(col_schema).alias(col_name) + + +def get_standard_error_from_confidence_interval(lower: Column, upper: Column) -> Column: + """Compute the standard error from the confidence interval. + + Args: + lower (Column): The lower bound of the confidence interval. + upper (Column): The upper bound of the confidence interval. + + Returns: + Column: The standard error. + + Examples: + >>> data = [(0.5, 1.5), (None, 2.5), (None, None)] + >>> ( + ... spark.createDataFrame(data, ['lower', 'upper']) + ... .select( + ... get_standard_error_from_confidence_interval(f.col('lower'), f.col('upper')).alias('standard_error') + ... ) + ... .show() + ... ) + +-------------------+ + | standard_error| + +-------------------+ + |0.25510204081632654| + | null| + | null| + +-------------------+ + + """ + return (upper - lower) / (2 * 1.96) + + +def get_nested_struct_schema(dtype: t.DataType) -> t.StructType: + """Get the bottom StructType from a nested ArrayType type. + + Args: + dtype (t.DataType): The nested data structure. + + Returns: + t.StructType: The nested struct schema. + + Raises: + TypeError: If the input data type is not a nested struct. + + Examples: + >>> get_nested_struct_schema(t.ArrayType(t.StructType([t.StructField('a', t.StringType())]))) + StructType([StructField('a', StringType(), True)]) + + >>> get_nested_struct_schema(t.ArrayType(t.ArrayType(t.StructType([t.StructField("a", t.StringType())])))) + StructType([StructField('a', StringType(), True)]) + """ + if isinstance(dtype, t.StructField): + dtype = dtype.dataType + + match dtype: + case t.StructType(fields=_): + return dtype + case t.ArrayType(elementType=dtype): + return get_nested_struct_schema(dtype) + case _: + raise TypeError("The input data type must be a nested struct.") + + +def get_struct_field_schema(schema: t.StructType, name: str) -> t.DataType: + """Get schema for underlying struct field. + + Args: + schema (t.StructType): Provided schema where the name should be looked in. + name (str): Name of the field to look in the schema + + Returns: + t.DataType: Data type of the StructField with provided name + + Raises: + ValueError: If provided name is not present in the input schema + + Examples: + >>> get_struct_field_schema(t.StructType([t.StructField("a", t.StringType())]), "a") + StringType() + + >>> get_struct_field_schema(t.StructType([t.StructField("a", t.StringType())]), "b") # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: Provided name b is not present in the schema + + """ + matching_fields = [f for f in schema.fields if f.name == name] + if not matching_fields: + raise ValueError("Provided name %s is not present in the schema.", name) + return matching_fields[0].dataType + +def calculate_harmonic_sum(input_array: Column) -> Column: + """Calculate the harmonic sum of an array. + + Args: + input_array (Column): input array of doubles + + Returns: + Column: column of harmonic sums + + Examples: + >>> from pyspark.sql import Row + >>> df = spark.createDataFrame([ + ... Row([0.3, 0.8, 1.0]), + ... Row([0.7, 0.2, 0.9]), + ... ], ["input_array"] + ... ) + >>> df.select("*", calculate_harmonic_sum(f.col("input_array")).alias("harmonic_sum")).show() + +---------------+------------------+ + | input_array| harmonic_sum| + +---------------+------------------+ + |[0.3, 0.8, 1.0]|0.7502326177269538| + |[0.7, 0.2, 0.9]|0.6674366756805108| + +---------------+------------------+ + + """ + return f.aggregate( + f.arrays_zip( + f.sort_array(input_array, False).alias("score"), + f.sequence(f.lit(1), f.size(input_array)).alias("pos") + ), + f.lit(0.0), + lambda acc, x: acc + + x["score"]/f.pow(x["pos"], 2)/f.lit(sum(1 / ((i + 1)**2) for i in range(1000))) + ) diff --git a/src/gentropy/common/types.py b/src/gentropy/common/types.py new file mode 100644 index 000000000..7adbad9c4 --- /dev/null +++ b/src/gentropy/common/types.py @@ -0,0 +1,18 @@ +"""Types and type aliases used in the package.""" + +from typing import Literal + +LD_Population = Literal["afr", "amr", "asj", "eas", "est", "fin", "nfe", "nwe", "seu"] + +VariantPopulation = Literal[ + "afr", "amr", "ami", "asj", "eas", "fin", "nfe", "mid", "sas", "remaining" +] +DataSourceType = Literal[ + "gnomad", + "finngen", + "gwas_catalog", + "eqtl_catalog", + "ukbiobank", + "open_targets", + "intervals", +] diff --git a/src/gentropy/common/utils.py b/src/gentropy/common/utils.py index 05704a299..ca6e8e7f2 100644 --- a/src/gentropy/common/utils.py +++ b/src/gentropy/common/utils.py @@ -1,11 +1,13 @@ """Common functions in the Genetics datasets.""" + from __future__ import annotations import sys from math import floor, log10 -from typing import TYPE_CHECKING, Tuple +from typing import TYPE_CHECKING import hail as hl +import numpy as np from pyspark.sql import functions as f from pyspark.sql import types as t @@ -13,49 +15,10 @@ if TYPE_CHECKING: from hail.table import Table + from numpy.typing import NDArray from pyspark.sql import Column -def parse_region(region: str) -> Tuple[str, int, int]: - """Parse region string to chr:start-end. - - Args: - region (str): Genomic region expected to follow chr##:#,###-#,### format or ##:####-#####. - - Returns: - Tuple[str, int, int]: Chromosome, start position, end position - - Raises: - ValueError: If the end and start positions cannot be casted to integer or not all three values value error is raised. - - Examples: - >>> parse_region('chr6:28,510,120-33,480,577') - ('6', 28510120, 33480577) - >>> parse_region('6:28510120-33480577') - ('6', 28510120, 33480577) - >>> parse_region('6:28510120') - Traceback (most recent call last): - ... - ValueError: Genomic region should follow a ##:####-#### format. - >>> parse_region('6:28510120-foo') - Traceback (most recent call last): - ... - ValueError: Start and the end position of the region has to be integer. - """ - region = region.replace(":", "-").replace(",", "") - try: - (chromosome, start_position, end_position) = region.split("-") - except ValueError as err: - raise ValueError("Genomic region should follow a ##:####-#### format.") from err - - try: - return (chromosome.replace("chr", ""), int(start_position), int(end_position)) - except ValueError as err: - raise ValueError( - "Start and the end position of the region has to be integer." - ) from err - - def calculate_confidence_interval( pvalue_mantissa: Column, pvalue_exponent: Column, @@ -206,41 +169,6 @@ def parse_pvalue(pv: Column) -> list[Column]: ] -def convert_gnomad_position_to_ensembl( - position: Column, reference: Column, alternate: Column -) -> Column: - """Convert GnomAD variant position to Ensembl variant position. - - For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, - the position is unchanged. More info about the problem: https://www.biostars.org/p/84686/ - - Args: - position (Column): Position of the variant in GnomAD's coordinates system. - reference (Column): The reference allele in GnomAD's coordinates system. - alternate (Column): The alternate allele in GnomAD's coordinates system. - - Returns: - Column: The position of the variant in the Ensembl genome. - - Examples: - >>> d = [(1, "A", "C"), (2, "AA", "C"), (3, "A", "AA")] - >>> df = spark.createDataFrame(d).toDF("position", "reference", "alternate") - >>> df.withColumn("new_position", convert_gnomad_position_to_ensembl(f.col("position"), f.col("reference"), f.col("alternate"))).show() - +--------+---------+---------+------------+ - |position|reference|alternate|new_position| - +--------+---------+---------+------------+ - | 1| A| C| 1| - | 2| AA| C| 3| - | 3| A| AA| 4| - +--------+---------+---------+------------+ - - - """ - return f.when( - (f.length(reference) > 1) | (f.length(alternate) > 1), position + 1 - ).otherwise(position) - - def _liftover_loci( variant_index: Table, chain_path: str, dest_reference_genome: str ) -> Table: @@ -325,3 +253,65 @@ def parse_efos(efo_uri: Column) -> Column: """ colname = efo_uri._jc.toString() return f.array_sort(f.expr(f"regexp_extract_all(`{colname}`, '([A-Z]+_[0-9]+)')")) + + +def get_logsum(arr: NDArray[np.float64]) -> float: + """Calculates logarithm of the sum of exponentials of a vector. The max is extracted to ensure that the sum is not Inf. + + This function emulates scipy's logsumexp expression. + + Args: + arr (NDArray[np.float64]): input array + + Returns: + float: logsumexp of the input array + + Example: + >>> l = [0.2, 0.1, 0.05, 0] + >>> round(get_logsum(l), 6) + 1.476557 + """ + themax = np.max(arr) + result = themax + np.log(np.sum(np.exp(arr - themax))) + return float(result) + + +def access_gcp_secret(secret_id: str, project_id: str) -> str: + """Access GCP secret manager to get the secret value. + + Args: + secret_id (str): ID of the secret + project_id (str): ID of the GCP project + + Returns: + str: secret value + """ + from google.cloud import secretmanager + + client = secretmanager.SecretManagerServiceClient() + name = f"projects/{project_id}/secrets/{secret_id}/versions/latest" + response = client.access_secret_version(name=name) + return response.payload.data.decode("UTF-8") + + +def copy_to_gcs(source_path: str, destination_blob: str) -> None: + """Copy a file to a Google Cloud Storage bucket. + + Args: + source_path (str): Path to the local file to copy + destination_blob (str): GS path to the destination blob in the GCS bucket + + Raises: + ValueError: If the path is a directory + """ + import os + from urllib.parse import urlparse + + from google.cloud import storage + + if os.path.isdir(source_path): + raise ValueError("Path should be a file, not a directory.") + client = storage.Client() + bucket = client.bucket(bucket_name=urlparse(destination_blob).hostname) + blob = bucket.blob(blob_name=urlparse(destination_blob).path.lstrip("/")) + blob.upload_from_filename(source_path) diff --git a/src/gentropy/common/version_engine.py b/src/gentropy/common/version_engine.py new file mode 100644 index 000000000..d852d8f5d --- /dev/null +++ b/src/gentropy/common/version_engine.py @@ -0,0 +1,158 @@ +"""Mechanism to seek version from specific datasource.""" + +from __future__ import annotations + +import re +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Callable + +from gentropy.common.types import DataSourceType + + +class VersionEngine: + """Seek version from the datasource.""" + + def __init__(self, datasource: DataSourceType) -> None: + """Initialize VersionEngine. + + Args: + datasource (DataSourceType): datasource to seek the version from + """ + self.datasource = datasource + + @staticmethod + def version_seekers() -> dict[DataSourceType, DatasourceVersionSeeker]: + """List version seekers. + + Returns: + dict[DataSourceType, DatasourceVersionSeeker]: list of available data sources. + """ + return { + "gnomad": GnomADVersionSeeker(), + } + + def seek(self, text: str | Path) -> str: + """Interface for inferring the version from text by using registered data source version iner method. + + Args: + text (str | Path): text to seek version from + + Returns: + str: inferred version + + Raises: + TypeError: if version can not be found in the text + + Examples: + >>> VersionEngine("gnomad").seek("gs://gcp-public-data--gnomad/release/2.1.1/vcf/genomes/gnomad.genomes.r2.1.1.sites.vcf.bgz") + '2.1.1' + """ + match text: + case Path() | str(): + text = str(text) + case _: + msg = f"Can not find version in {text}" + raise TypeError(msg) + infer_method = self._get_version_seek_method() + return infer_method(text) + + def _get_version_seek_method(self) -> Callable[[str], str]: + """Method that gets the version seeker for the datasource. + + Returns: + Callable[[str], str]: Method to seek version based on the initialized datasource + + Raises: + ValueError: if datasource is not registered in the list of version seekers + """ + if self.datasource not in self.version_seekers(): + raise ValueError(f"Invalid datasource {self.datasource}") + return self.version_seekers()[self.datasource].seek_version + + def amend_version( + self, analysis_input_path: str | Path, analysis_output_path: str | Path + ) -> str: + """Amend version to the analysis output path if it is not already present. + + Path can be path to g3:// or Path object, absolute or relative. + The analysis_input_path has to contain the version number. + If the analysis_output_path contains the same version as inferred from input version already, + then it will not be appended. + + Args: + analysis_input_path (str | Path): step input path + analysis_output_path (str | Path): step output path + + Returns: + str: Path with the ammended version, does not return Path object! + + Examples: + >>> VersionEngine("gnomad").amend_version("gs://gcp-public-data--gnomad/release/2.1.1/vcf/genomes/gnomad.genomes.r2.1.1.sites.vcf.bgz", "/some/path/without/version") + '/some/path/without/version/2.1.1' + """ + version = self.seek(analysis_input_path) + output_path = str(analysis_output_path) + if version in output_path: + return output_path + if output_path.endswith("/"): + return f"{analysis_output_path}{version}" + return f"{analysis_output_path}/{version}" + + +class DatasourceVersionSeeker(ABC): + """Interface for datasource version seeker. + + Raises: + NotImplementedError: if method is not implemented in the subclass + """ + + @staticmethod + @abstractmethod + def seek_version(text: str) -> str: + """Seek version from text. Implement this method in the subclass. + + Args: + text (str): text to seek version from + + Returns: + str: seeked version + + Raises: + NotImplementedError: if method is not implemented in the subclass + + """ + raise NotImplementedError + + +class GnomADVersionSeeker(DatasourceVersionSeeker): + """Seek version from GnomAD datasource.""" + + @staticmethod + def seek_version(text: str) -> str: + """Seek GnomAD version from provided text by using regex. + + Up to 3 digits are allowed in the version number. + Historically gnomAD version numbers have been in the format + 2.1.1, 3.1, etc. as of 2024-05. GnomAD versions can be found by + running `"gs://gcp-public-data--gnomad/release/*/*/*"` + + Args: + text (str): text to seek version from + + Raises: + ValueError: if version can not be seeked + + Returns: + str: seeked version + + Examples: + >>> GnomADVersionSeeker.seek_version("gs://gcp-public-data--gnomad/release/2.1.1/vcf/genomes/gnomad.genomes.r2.1.1.sites.vcf.bgz") + '2.1.1' + """ + result = re.search(r"v?((\d+){1}\.(\d+){1}\.?(\d+)?)", text) + match result: + case None: + raise ValueError(f"No GnomAD version found in provided text: {text}") + case _: + return result.group(1) diff --git a/src/gentropy/config.py b/src/gentropy/config.py index 552c50d1d..82ead9ed0 100644 --- a/src/gentropy/config.py +++ b/src/gentropy/config.py @@ -1,7 +1,8 @@ """Interface for application configuration.""" + import os from dataclasses import dataclass, field -from typing import Any, Dict, List +from typing import Any, ClassVar, List, TypedDict from hail import __file__ as hail_location from hydra.core.config_store import ConfigStore @@ -16,7 +17,7 @@ class SessionConfig: write_mode: str = "errorifexists" spark_uri: str = "local[*]" hail_home: str = os.path.dirname(hail_location) - extended_spark_conf: dict[str, str] | None = None + extended_spark_conf: dict[str, str] | None = field(default_factory=dict[str, str]) _target_: str = "gentropy.common.session.Session" @@ -35,8 +36,9 @@ class ColocalisationConfig(StepConfig): """Colocalisation step configuration.""" credible_set_path: str = MISSING - study_index_path: str = MISSING coloc_path: str = MISSING + colocalisation_method: str = MISSING + colocalisation_method_params: dict[str, Any] = field(default_factory=dict[str, Any]) _target_: str = "gentropy.colocalisation.ColocalisationStep" @@ -49,50 +51,53 @@ class GeneIndexConfig(StepConfig): _target_: str = "gentropy.gene_index.GeneIndexStep" +@dataclass +class BiosampleIndexConfig(StepConfig): + """Biosample index step configuration.""" + + cell_ontology_input_path: str = MISSING + uberon_input_path: str = MISSING + efo_input_path: str = MISSING + biosample_index_path: str = MISSING + _target_: str = "gentropy.biosample_index.BiosampleIndexStep" + + @dataclass class GWASCatalogStudyCurationConfig(StepConfig): """GWAS Catalog study curation step configuration.""" catalog_study_files: list[str] = MISSING catalog_ancestry_files: list[str] = MISSING - catalog_sumstats_lut: str = MISSING gwas_catalog_study_curation_out: str = MISSING gwas_catalog_study_curation_file: str = MISSING _target_: str = "gentropy.gwas_catalog_study_curation.GWASCatalogStudyCurationStep" @dataclass -class GWASCatalogStudyInclusionConfig(StepConfig): - """GWAS Catalog study inclusion step configuration.""" +class GWASCatalogStudyIndexGenerationStep(StepConfig): + """GWAS Catalog study index generation.""" catalog_study_files: list[str] = MISSING catalog_ancestry_files: list[str] = MISSING - catalog_associations_file: str = MISSING - gwas_catalog_study_curation_file: str = MISSING - variant_annotation_path: str = MISSING - harmonised_study_file: str = MISSING - criteria: str = MISSING - inclusion_list_path: str = MISSING - exclusion_list_path: str = MISSING + study_index_path: str = MISSING + gwas_catalog_study_curation_file: str | None = None + sumstats_qc_path: str | None = None _target_: str = ( - "gentropy.gwas_catalog_study_inclusion.GWASCatalogStudyInclusionGenerator" + "gentropy.gwas_catalog_study_index.GWASCatalogStudyIndexGenerationStep" ) @dataclass -class GWASCatalogIngestionConfig(StepConfig): +class GWASCatalogTopHitIngestionConfig(StepConfig): """GWAS Catalog ingestion step configuration.""" catalog_study_files: list[str] = MISSING catalog_ancestry_files: list[str] = MISSING - catalog_sumstats_lut: str = MISSING catalog_associations_file: str = MISSING variant_annotation_path: str = MISSING catalog_studies_out: str = MISSING catalog_associations_out: str = MISSING - gwas_catalog_study_curation_file: str | None = None - inclusion_list_path: str | None = None - _target_: str = "gentropy.gwas_catalog_ingestion.GWASCatalogIngestionStep" + _target_: str = "gentropy.gwas_catalog_top_hits.GWASCatalogTopHitIngestionStep" @dataclass @@ -110,9 +115,16 @@ class GWASCatalogSumstatsPreprocessConfig(StepConfig): class EqtlCatalogueConfig(StepConfig): """eQTL Catalogue step configuration.""" + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) eqtl_catalogue_paths_imported: str = MISSING eqtl_catalogue_study_index_out: str = MISSING - eqtl_catalogue_summary_stats_out: str = MISSING + eqtl_catalogue_credible_sets_out: str = MISSING + mqtl_quantification_methods_blacklist: list[str] = field(default_factory=lambda: []) + eqtl_lead_pvalue_threshold: float = 1e-3 _target_: str = "gentropy.eqtl_catalogue.EqtlCatalogueStep" @@ -120,27 +132,41 @@ class EqtlCatalogueConfig(StepConfig): class FinngenStudiesConfig(StepConfig): """FinnGen study index step configuration.""" + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) finngen_study_index_out: str = MISSING + finngen_phenotype_table_url: str = "https://r11.finngen.fi/api/phenos" + finngen_release_prefix: str = "FINNGEN_R11_" + finngen_summary_stats_url_prefix: str = ( + "gs://finngen-public-data-r11/summary_stats/finngen_R11_" + ) + finngen_summary_stats_url_suffix: str = ".gz" + efo_curation_mapping_url: str = "https://raw.githubusercontent.com/opentargets/curation/24.09.1/mappings/disease/manual_string.tsv" + sample_size: int = 453733 # https://www.finngen.fi/en/access_results#:~:text=Total%20sample%20size%3A%C2%A0453%2C733%C2%A0(254%2C618%C2%A0females%20and%C2%A0199%2C115%20males) _target_: str = "gentropy.finngen_studies.FinnGenStudiesStep" -@dataclass -class FinngenSumstatPreprocessConfig(StepConfig): - """FinnGen study index step configuration.""" - - raw_sumstats_path: str = MISSING - out_sumstats_path: str = MISSING - _target_: str = "gentropy.finngen_sumstat_preprocess.FinnGenSumstatPreprocessStep" - - @dataclass class FinngenFinemappingConfig(StepConfig): """FinnGen fine mapping ingestion step configuration.""" - finngen_finemapping_results_path: str = MISSING - finngen_finemapping_summaries_path: str = MISSING - finngen_release_prefix: str = MISSING + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) + finngen_susie_finemapping_snp_files: str = ( + "gs://finngen-public-data-r11/finemap/full/susie/*.snp.bgz" + ) + finngen_susie_finemapping_cs_summary_files: str = ( + "gs://finngen-public-data-r11/finemap/summary/*SUSIE.cred.summary.tsv" + ) finngen_finemapping_out: str = MISSING + finngen_finemapping_lead_pvalue_threshold: float = 1e-5 + finngen_release_prefix: str = "FINNGEN_R11" _target_: str = ( "gentropy.finngen_finemapping_ingestion.FinnGenFinemappingIngestionStep" ) @@ -155,9 +181,25 @@ class LDIndexConfig(StepConfig): "start_hail": True, } ) - min_r2: float = 0.5 ld_index_out: str = MISSING - _target_: str = "gentropy.ld_index.LDIndexStep" + min_r2: float = 0.5 + ld_matrix_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm" + ld_index_raw_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht" + liftover_ht_path: str = "gs://gcp-public-data--gnomad/release/2.1.1/liftover_grch38/ht/genomes/gnomad.genomes.r2.1.1.sites.liftover_grch38.ht" + grch37_to_grch38_chain_path: str = ( + "gs://hail-common/references/grch37_to_grch38.over.chain.gz" + ) + ld_populations: list[str] = field( + default_factory=lambda: [ + "afr", # African-American + "amr", # American Admixed/Latino + "eas", # East Asian + "fin", # Finnish + "nfe", # Non-Finnish European + ] + ) + use_version_from_input: bool = False + _target_: str = "gentropy.gnomad_ingestion.LDIndexStep" @dataclass @@ -175,75 +217,129 @@ class LDBasedClumpingConfig(StepConfig): class LocusToGeneConfig(StepConfig): """Locus to gene step configuration.""" - session: Any = field( - default_factory=lambda: { - "extended_spark_conf": { - "spark.dynamicAllocation.enabled": "false", - "spark.driver.memory": "48g", - "spark.executor.memory": "48g", - } - } - ) run_mode: str = MISSING - model_path: str = MISSING - predictions_path: str = MISSING credible_set_path: str = MISSING - variant_gene_path: str = MISSING - colocalisation_path: str = MISSING - study_index_path: str = MISSING + feature_matrix_path: str = MISSING + predictions_path: str | None = None + variant_index_path: str | None = None + model_path: str | None = None gold_standard_curation_path: str | None = None gene_interactions_path: str | None = None features_list: list[str] = field( default_factory=lambda: [ - # average distance of all tagging variants to gene TSS + # max CLPP for each (study, locus, gene) aggregating over a specific qtl type + "eQtlColocClppMaximum", + "pQtlColocClppMaximum", + "sQtlColocClppMaximum", + # max H4 for each (study, locus, gene) aggregating over a specific qtl type + "eQtlColocH4Maximum", + "pQtlColocH4Maximum", + "sQtlColocH4Maximum", + # max CLPP for each (study, locus, gene) aggregating over a specific qtl type and in relation with the mean in the vicinity + "eQtlColocClppMaximumNeighbourhood", + "pQtlColocClppMaximumNeighbourhood", + "sQtlColocClppMaximumNeighbourhood", + # max H4 for each (study, locus, gene) aggregating over a specific qtl type and in relation with the mean in the vicinity + "eQtlColocH4MaximumNeighbourhood", + "pQtlColocH4MaximumNeighbourhood", + "sQtlColocH4MaximumNeighbourhood", + # distance to gene footprint + "distanceSentinelFootprint", + "distanceSentinelFootprintNeighbourhood", + "distanceFootprintMean", + "distanceFootprintMeanNeighbourhood", + # distance to gene tss "distanceTssMean", - # minimum distance of all tagging variants to gene TSS - "distanceTssMinimum", - # maximum vep consequence score of the locus 95% credible set among all genes in the vicinity - "vepMaximumNeighborhood", - # maximum vep consequence score of the locus 95% credible set split by gene + "distanceTssMeanNeighbourhood", + "distanceSentinelTss", + "distanceSentinelTssNeighbourhood", + # vep "vepMaximum", - # mean vep consequence score of the locus 95% credible set among all genes in the vicinity - "vepMeanNeighborhood", - # mean vep consequence score of the locus 95% credible set split by gene + "vepMaximumNeighbourhood", "vepMean", - # max clpp for each (study, locus, gene) aggregating over all eQTLs - "eqtlColocClppMaximum", - # max clpp for each (study, locus) aggregating over all eQTLs - "eqtlColocClppMaximumNeighborhood", - # max clpp for each (study, locus, gene) aggregating over all pQTLs - # "pqtlColocClppMaximum", - # max clpp for each (study, locus) aggregating over all pQTLs - # "pqtlColocClppMaximumNeighborhood", - # max clpp for each (study, locus, gene) aggregating over all sQTLs - # "sqtlColocClppMaximum", - # max clpp for each (study, locus) aggregating over all sQTLs - # "sqtlColocClppMaximumNeighborhood", - # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all eQTLs - # "eqtlColocLlrLocalMaximum", - # # max log-likelihood ratio value for each (study, locus) aggregating over all eQTLs - # "eqtlColocLlpMaximumNeighborhood", - # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all pQTLs - # "pqtlColocLlrLocalMaximum", - # # max log-likelihood ratio value for each (study, locus) aggregating over all pQTLs - # "pqtlColocLlpMaximumNeighborhood", - # # max log-likelihood ratio value for each (study, locus, gene) aggregating over all sQTLs - # "sqtlColocLlrLocalMaximum", - # # max log-likelihood ratio value for each (study, locus) aggregating over all sQTLs - # "sqtlColocLlpMaximumNeighborhood", + "vepMeanNeighbourhood", + # other + "geneCount500kb", + "proteinGeneCount500kb", + "credibleSetConfidence", + "isProteinCoding", ] ) hyperparameters: dict[str, Any] = field( default_factory=lambda: { + "n_estimators": 100, "max_depth": 5, - "loss_function": "binary:logistic", + "loss": "log_loss", } ) wandb_run_name: str | None = None - perform_cross_validation: bool = False + hf_hub_repo_id: str | None = "opentargets/locus_to_gene" + download_from_hub: bool = True _target_: str = "gentropy.l2g.LocusToGeneStep" +@dataclass +class LocusToGeneFeatureMatrixConfig(StepConfig): + """Locus to gene feature matrix step configuration.""" + + session: Any = field( + default_factory=lambda: { + "extended_spark_conf": { + "spark.driver.memory": "48g", + "spark.executor.memory": "48g", + "spark.sql.shuffle.partitions": "800", + } + } + ) + credible_set_path: str = MISSING + variant_index_path: str | None = None + colocalisation_path: str | None = None + study_index_path: str | None = None + gene_index_path: str | None = None + feature_matrix_path: str = MISSING + features_list: list[str] = field( + default_factory=lambda: [ + # max CLPP for each (study, locus, gene) aggregating over a specific qtl type + "eQtlColocClppMaximum", + "pQtlColocClppMaximum", + "sQtlColocClppMaximum", + # max H4 for each (study, locus, gene) aggregating over a specific qtl type + "eQtlColocH4Maximum", + "pQtlColocH4Maximum", + "sQtlColocH4Maximum", + # max CLPP for each (study, locus, gene) aggregating over a specific qtl type and in relation with the mean in the vicinity + "eQtlColocClppMaximumNeighbourhood", + "pQtlColocClppMaximumNeighbourhood", + "sQtlColocClppMaximumNeighbourhood", + # max H4 for each (study, locus, gene) aggregating over a specific qtl type and in relation with the mean in the vicinity + "eQtlColocH4MaximumNeighbourhood", + "pQtlColocH4MaximumNeighbourhood", + "sQtlColocH4MaximumNeighbourhood", + # distance to gene footprint + "distanceSentinelFootprint", + "distanceSentinelFootprintNeighbourhood", + "distanceFootprintMean", + "distanceFootprintMeanNeighbourhood", + # distance to gene tss + "distanceTssMean", + "distanceTssMeanNeighbourhood", + "distanceSentinelTss", + "distanceSentinelTssNeighbourhood", + # vep + "vepMaximum", + "vepMaximumNeighbourhood", + "vepMean", + "vepMeanNeighbourhood", + # other + "geneCount500kb", + "proteinGeneCount500kb", + "credibleSetConfidence", + "isProteinCoding", + ] + ) + _target_: str = "gentropy.l2g.LocusToGeneFeatureMatrixStep" + + @dataclass class PICSConfig(StepConfig): """PICS step configuration.""" @@ -254,8 +350,34 @@ class PICSConfig(StepConfig): @dataclass -class VariantAnnotationConfig(StepConfig): - """Variant annotation step configuration.""" +class UkbPppEurConfig(StepConfig): + """UKB PPP (EUR) ingestion step configuration.""" + + raw_study_index_path_from_tsv: str = MISSING + raw_summary_stats_path: str = MISSING + tmp_variant_annotation_path: str = MISSING + variant_annotation_path: str = MISSING + study_index_output_path: str = MISSING + summary_stats_output_path: str = MISSING + _target_: str = "gentropy.ukb_ppp_eur_sumstat_preprocess.UkbPppEurStep" + + +@dataclass +class FinngenUkbMetaConfig(StepConfig): + """FinnGen UKB meta-analysis ingestion step configuration.""" + + raw_study_index_path_from_tsv: str = MISSING + raw_summary_stats_path: str = MISSING + tmp_variant_annotation_path: str = MISSING + variant_annotation_path: str = MISSING + study_index_output_path: str = MISSING + summary_stats_output_path: str = MISSING + _target_: str = "gentropy.finngen_ukb_meta.FinngenUkbMetaIngestionStep" + + +@dataclass +class GnomadVariantConfig(StepConfig): + """Gnomad variant ingestion step configuration.""" session: Any = field( default_factory=lambda: { @@ -263,64 +385,279 @@ class VariantAnnotationConfig(StepConfig): } ) variant_annotation_path: str = MISSING - _target_: str = "gentropytropy.variant_annotation.VariantAnnotationStep" + gnomad_genomes_path: str = "gs://gcp-public-data--gnomad/release/4.0/ht/genomes/gnomad.genomes.v4.0.sites.ht/" + gnomad_variant_populations: list[str] = field( + default_factory=lambda: [ + "afr", # African-American + "amr", # American Admixed/Latino + "ami", # Amish ancestry + "asj", # Ashkenazi Jewish + "eas", # East Asian + "fin", # Finnish + "nfe", # Non-Finnish European + "mid", # Middle Eastern + "sas", # South Asian + "remaining", # Other + ] + ) + use_version_from_input: bool = False + _target_: str = "gentropy.gnomad_ingestion.GnomadVariantIndexStep" + + +@dataclass +class PanUKBBConfig(StepConfig): + """Pan UKB variant ingestion step configuration.""" + + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) + pan_ukbb_ht_path: str = "gs://panukbb-ld-matrixes/ukb-diverse-pops-public-build-38/UKBB.{POP}.ldadj.variant.b38" + pan_ukbb_bm_path: str = "gs://panukbb-ld-matrixes/UKBB.{POP}.ldadj" + ukbb_annotation_path: str = "gs://panukbb-ld-matrixes/UKBB.{POP}.aligned.parquet" + pan_ukbb_pops: list[str] = field( + default_factory=lambda: [ + "AFR", # African + "CSA", # Central/South Asian + "EUR", # European + ] + ) + use_version_from_input: bool = False + _target_: str = "gentropy.pan_ukb_ingestion.PanUKBBVariantIndexStep" @dataclass class VariantIndexConfig(StepConfig): """Variant index step configuration.""" - variant_annotation_path: str = MISSING - credible_set_path: str = MISSING + class _ConsequenceToPathogenicityScoreMap(TypedDict): + """Typing definition for CONSEQUENCE_TO_PATHOGENICITY_SCORE.""" + + id: str + label: str + score: float + + session: SessionConfig = SessionConfig() + vep_output_json_path: str = MISSING variant_index_path: str = MISSING + gnomad_variant_annotations_path: str | None = None + hash_threshold: int = 300 + consequence_to_pathogenicity_score: ClassVar[ + list[_ConsequenceToPathogenicityScoreMap] + ] = [ + {"id": "SO_0001575", "label": "splice_donor_variant", "score": 1.0}, + {"id": "SO_0001589", "label": "frameshift_variant", "score": 1.0}, + {"id": "SO_0001574", "label": "splice_acceptor_variant", "score": 1.0}, + {"id": "SO_0001587", "label": "stop_gained", "score": 1.0}, + {"id": "SO_0002012", "label": "start_lost", "score": 1.0}, + {"id": "SO_0001578", "label": "stop_lost", "score": 1.0}, + {"id": "SO_0001893", "label": "transcript_ablation", "score": 1.0}, + {"id": "SO_0001822", "label": "inframe_deletion", "score": 0.66}, + { + "id": "SO_0001818", + "label": "protein_altering_variant", + "score": 0.66, + }, + {"id": "SO_0001821", "label": "inframe_insertion", "score": 0.66}, + { + "id": "SO_0001787", + "label": "splice_donor_5th_base_variant", + "score": 0.66, + }, + {"id": "SO_0001583", "label": "missense_variant", "score": 0.66}, + {"id": "SO_0001567", "label": "stop_retained_variant", "score": 0.33}, + {"id": "SO_0001630", "label": "splice_region_variant", "score": 0.33}, + {"id": "SO_0002019", "label": "start_retained_variant", "score": 0.33}, + { + "id": "SO_0002169", + "label": "splice_polypyrimidine_tract_variant", + "score": 0.33, + }, + {"id": "SO_0001819", "label": "synonymous_variant", "score": 0.33}, + { + "id": "SO_0002170", + "label": "splice_donor_region_variant", + "score": 0.33, + }, + {"id": "SO_0001624", "label": "3_prime_UTR_variant", "score": 0.1}, + {"id": "SO_0001623", "label": "5_prime_UTR_variant", "score": 0.1}, + {"id": "SO_0001627", "label": "intron_variant", "score": 0.1}, + { + "id": "SO_0001619", + "label": "non_coding_transcript_variant", + "score": 0.0, + }, + {"id": "SO_0001580", "label": "coding_sequence_variant", "score": 0.0}, + {"id": "SO_0001632", "label": "downstream_gene_variant", "score": 0.0}, + {"id": "SO_0001631", "label": "upstream_gene_variant", "score": 0.0}, + { + "id": "SO_0001792", + "label": "non_coding_transcript_exon_variant", + "score": 0.0, + }, + {"id": "SO_0001620", "label": "mature_miRNA_variant", "score": 0.0}, + ] + _target_: str = "gentropy.variant_index.VariantIndexStep" @dataclass -class VariantToGeneConfig(StepConfig): - """V2G step configuration.""" +class ConvertToVcfStepConfig(StepConfig): + """Variant to VCF step configuration.""" - variant_index_path: str = MISSING - variant_annotation_path: str = MISSING - gene_index_path: str = MISSING - vep_consequences_path: str = MISSING - liftover_chain_file_path: str = MISSING - liftover_max_length_difference: int = 100 - max_distance: int = 500_000 - approved_biotypes: List[str] = field( - default_factory=lambda: [ - "protein_coding", - "3prime_overlapping_ncRNA", - "antisense", - "bidirectional_promoter_lncRNA", - "IG_C_gene", - "IG_D_gene", - "IG_J_gene", - "IG_V_gene", - "lincRNA", - "macro_lncRNA", - "non_coding", - "sense_intronic", - "sense_overlapping", - ] - ) - interval_sources: Dict[str, str] = field(default_factory=dict) - v2g_path: str = MISSING - _target_: str = "gentropy.v2g.V2GStep" + source_paths: list[str] = MISSING + source_formats: list[str] = MISSING + output_path: str = MISSING + partition_size: int = 2000 + _target_: str = "gentropy.variant_index.ConvertToVcfStep" + + +@dataclass +class LocusBreakerClumpingConfig(StepConfig): + """Locus breaker clumping step configuration.""" + + summary_statistics_input_path: str = MISSING + clumped_study_locus_output_path: str = MISSING + lbc_baseline_pvalue: float = 1e-5 + lbc_distance_cutoff: int = 250_000 + lbc_pvalue_threshold: float = 1e-8 + lbc_flanking_distance: int = 100_000 + large_loci_size: int = 1_500_000 + wbc_clump_distance: int = 500_000 + wbc_pvalue_threshold: float = MISSING + collect_locus: bool = False + remove_mhc: bool = True + _target_: str = "gentropy.locus_breaker_clumping.LocusBreakerClumpingStep" @dataclass -class WindowBasedClumpingStep(StepConfig): +class WindowBasedClumpingStepConfig(StepConfig): """Window-based clumping step configuration.""" + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) summary_statistics_input_path: str = MISSING study_locus_output_path: str = MISSING + gwas_significance: float = 1e-8 + distance: int = 500_000 + collect_locus: bool = False + collect_locus_distance: int = 500_000 inclusion_list_path: str | None = None - locus_collect_distance: str | None = None - _target_: str = "gentropy.window_based_clumping.WindowBasedClumpingStep" +@dataclass +class FinemapperConfig(StepConfig): + """SuSiE fine-mapper step configuration.""" + + session: Any = field( + default_factory=lambda: { + "start_hail": True, + } + ) + study_index_path: str = MISSING + study_locus_manifest_path: str = MISSING + study_locus_index: int = MISSING + max_causal_snps: int = MISSING + lead_pval_threshold: float = MISSING + purity_mean_r2_threshold: float = MISSING + purity_min_r2_threshold: float = MISSING + cs_lbf_thr: float = MISSING + sum_pips: float = MISSING + susie_est_tausq: bool = MISSING + run_carma: bool = MISSING + carma_tau: float = MISSING + run_sumstat_imputation: bool = MISSING + carma_time_limit: int = MISSING + imputed_r2_threshold: float = MISSING + ld_score_threshold: float = MISSING + ld_min_r2: float = MISSING + _target_: str = "gentropy.susie_finemapper.SusieFineMapperStep" + + +@dataclass +class SummaryStatisticsQCStepConfig(StepConfig): + """GWAS QC step configuration.""" + + gwas_path: str = MISSING + output_path: str = MISSING + pval_threshold: float = MISSING + _target_: str = "gentropy.sumstat_qc_step.SummaryStatisticsQCStep" + + +@dataclass +class CredibleSetQCStepConfig(StepConfig): + """Credible set quality control step configuration.""" + + credible_sets_path: str = MISSING + output_path: str = MISSING + p_value_threshold: float = 1e-5 + purity_min_r2: float = 0.01 + clump: bool = False + ld_index_path: str | None = None + study_index_path: str | None = None + ld_min_r2: float | None = 0.8 + n_partitions: int | None = 200 + _target_: str = "gentropy.credible_set_qc.CredibleSetQCStep" + + +@dataclass +class StudyValidationStepConfig(StepConfig): + """Configuration of the study index validation step. + + The study indices are read from multiple location, therefore we are expecting a list of paths. + """ + + study_index_path: list[str] = MISSING + target_index_path: str = MISSING + disease_index_path: str = MISSING + biosample_index_path: str = MISSING + valid_study_index_path: str = MISSING + invalid_study_index_path: str = MISSING + invalid_qc_reasons: list[str] = MISSING + _target_: str = "gentropy.study_validation.StudyValidationStep" + + +@dataclass +class LocusToGeneEvidenceStepConfig(StepConfig): + """Configuration of the locus to gene evidence step.""" + + locus_to_gene_predictions_path: str = MISSING + credible_set_path: str = MISSING + study_index_path: str = MISSING + evidence_output_path: str = MISSING + locus_to_gene_threshold: float = 0.05 + _target_: str = "gentropy.l2g.LocusToGeneEvidenceStep" + +@dataclass +class LocusToGeneAssociationsStepConfig(StepConfig): + """Configuration of the locus to gene association step.""" + + evidence_input_path: str = MISSING + disease_index_path: str = MISSING + direct_associations_output_path: str = MISSING + indirect_associations_output_path: str = MISSING + _target_: str = "gentropy.l2g.LocusToGeneAssociationsStep" + +@dataclass +class StudyLocusValidationStepConfig(StepConfig): + """Configuration of the study index validation step. + + The study locus datasets are read from multiple location, therefore we are expecting a list of paths. + """ + + study_index_path: str = MISSING + study_locus_path: list[str] = MISSING + valid_study_locus_path: str = MISSING + invalid_study_locus_path: str = MISSING + invalid_qc_reasons: list[str] = MISSING + _target_: str = "gentropy.study_locus_validation.StudyLocusValidationStep" + + @dataclass class Config: """Application configuration.""" @@ -339,6 +676,7 @@ def register_config() -> None: cs.store(group="step", name="colocalisation", node=ColocalisationConfig) cs.store(group="step", name="eqtl_catalogue", node=EqtlCatalogueConfig) cs.store(group="step", name="gene_index", node=GeneIndexConfig) + cs.store(group="step", name="biosample_index", node=BiosampleIndexConfig) cs.store( group="step", name="gwas_catalog_study_curation", @@ -346,26 +684,28 @@ def register_config() -> None: ) cs.store( group="step", - name="gwas_catalog_study_inclusion", - node=GWASCatalogStudyInclusionConfig, - ) - cs.store( - group="step", name="gwas_catalog_ingestion", node=GWASCatalogIngestionConfig + name="gwas_catalog_study_index", + node=GWASCatalogStudyIndexGenerationStep, ) cs.store( group="step", name="gwas_catalog_sumstat_preprocess", node=GWASCatalogSumstatsPreprocessConfig, ) + cs.store( + group="step", + name="gwas_catalog_top_hit_ingestion", + node=GWASCatalogTopHitIngestionConfig, + ) cs.store(group="step", name="ld_based_clumping", node=LDBasedClumpingConfig) cs.store(group="step", name="ld_index", node=LDIndexConfig) cs.store(group="step", name="locus_to_gene", node=LocusToGeneConfig) - cs.store(group="step", name="finngen_studies", node=FinngenStudiesConfig) cs.store( group="step", - name="finngen_sumstat_preprocess", - node=FinngenSumstatPreprocessConfig, + name="locus_to_gene_feature_matrix", + node=LocusToGeneFeatureMatrixConfig, ) + cs.store(group="step", name="finngen_studies", node=FinngenStudiesConfig) cs.store( group="step", @@ -374,7 +714,39 @@ def register_config() -> None: ) cs.store(group="step", name="pics", node=PICSConfig) - cs.store(group="step", name="variant_annotation", node=VariantAnnotationConfig) + cs.store(group="step", name="gnomad_variants", node=GnomadVariantConfig) + cs.store(group="step", name="ukb_ppp_eur_sumstat_preprocess", node=UkbPppEurConfig) cs.store(group="step", name="variant_index", node=VariantIndexConfig) - cs.store(group="step", name="variant_to_gene", node=VariantToGeneConfig) - cs.store(group="step", name="window_based_clumping", node=WindowBasedClumpingStep) + cs.store(group="step", name="variant_to_vcf", node=ConvertToVcfStepConfig) + cs.store( + group="step", name="window_based_clumping", node=WindowBasedClumpingStepConfig + ) + cs.store(group="step", name="susie_finemapping", node=FinemapperConfig) + cs.store( + group="step", name="summary_statistics_qc", node=SummaryStatisticsQCStepConfig + ) + cs.store( + group="step", name="locus_breaker_clumping", node=LocusBreakerClumpingConfig + ) + cs.store( + group="step", + name="credible_set_validation", + node=StudyLocusValidationStepConfig, + ) + cs.store( + group="step", + name="study_validation", + node=StudyValidationStepConfig, + ) + cs.store( + group="step", + name="locus_to_gene_evidence", + node=LocusToGeneEvidenceStepConfig, + ) + cs.store( + group="step", + name="locus_to_gene_associations", + node=LocusToGeneAssociationsStepConfig, + ) + cs.store(group="step", name="finngen_ukb_meta_ingestion", node=FinngenUkbMetaConfig) + cs.store(group="step", name="credible_set_qc", node=CredibleSetQCStepConfig) diff --git a/src/gentropy/credible_set_qc.py b/src/gentropy/credible_set_qc.py new file mode 100644 index 000000000..5b89faf59 --- /dev/null +++ b/src/gentropy/credible_set_qc.py @@ -0,0 +1,77 @@ +"""Step to run credible set quality control on finemapping output StudyLoci.""" + +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.dataset.ld_index import LDIndex +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus +from gentropy.method.susie_inf import SUSIE_inf + + +class CredibleSetQCStep: + """Credible set quality control step for fine mapped StudyLoci.""" + + def __init__( + self, + session: Session, + credible_sets_path: str, + output_path: str, + p_value_threshold: float, + purity_min_r2: float, + clump: bool, + ld_index_path: str | None, + study_index_path: str | None, + ld_min_r2: float | None, + n_partitions: int | None, + ) -> None: + """Run credible set quality control step. + + Check defaults used by steps in hydra configuration `gentropy.config.CredibleSetQCStepConfig` + + Due to the large number of partitions at the input credible_set_path after finemapping, the + best strategy it is to repartition and save the dataset after deduplication. + + The `clump` mode will perform additional LD based clumping on the input credible sets. + Enabling `clump` mode requires providing `ld_index_path`, `study_index_path` and `ld_min_r2`. + + Args: + session (Session): Session object. + credible_sets_path (str): Path to credible sets file. + output_path (str): Path to write the output file. + p_value_threshold (float): P-value threshold for credible set quality control. + purity_min_r2 (float): Minimum R2 for purity estimation. + clump (bool): Whether to clump the credible sets by LD. + ld_index_path (str | None): Path to LD index file. + study_index_path (str | None): Path to study index file. + ld_min_r2 (float | None): Minimum R2 for LD estimation. + n_partitions (int | None): Number of partitions to coalesce the dataset after reading. Defaults to 200 + """ + n_partitions = n_partitions or 200 + + ld_index = ( + LDIndex.from_parquet(session, ld_index_path) if ld_index_path else None + ) + study_index = ( + StudyIndex.from_parquet(session, study_index_path) + if study_index_path + else None + ) + + cred_sets = StudyLocus.from_parquet( + session, credible_sets_path, recursiveFileLookup=True + ).coalesce(n_partitions) + + cred_sets_clean = SUSIE_inf.credible_set_qc( + cred_sets, + p_value_threshold, + purity_min_r2, + clump, + ld_index, + study_index, + ld_min_r2, + ) + # ensure the saved object is still a valid StudyLocus + StudyLocus( + _df=cred_sets_clean.df, _schema=StudyLocus.get_schema() + ).df.write.mode(session.write_mode).parquet(output_path) diff --git a/src/gentropy/dataset/biosample_index.py b/src/gentropy/dataset/biosample_index.py new file mode 100644 index 000000000..bae3c0a4f --- /dev/null +++ b/src/gentropy/dataset/biosample_index.py @@ -0,0 +1,94 @@ +"""Biosample index dataset.""" + +from __future__ import annotations + +from dataclasses import dataclass +from functools import reduce +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +from pyspark.sql import DataFrame +from pyspark.sql.types import ArrayType, StringType + +from gentropy.common.schemas import parse_spark_schema +from gentropy.dataset.dataset import Dataset + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + +@dataclass +class BiosampleIndex(Dataset): + """Biosample index dataset. + + A Biosample index dataset captures the metadata of the biosamples (e.g. tissues, cell types, cell lines, etc) such as alternate names and relationships with other biosamples. + """ + + @classmethod + def get_schema(cls: type[BiosampleIndex]) -> StructType: + """Provide the schema for the BiosampleIndex dataset. + + Returns: + StructType: The schema of the BiosampleIndex dataset. + """ + return parse_spark_schema("biosample_index.json") + + def merge_indices( + self: BiosampleIndex, + biosample_indices : list[BiosampleIndex] + ) -> BiosampleIndex: + """Merge a list of biosample indices into a single biosample index. + + Where there are conflicts, in single values - the first value is taken. In list values, the union of all values is taken. + + Args: + biosample_indices (list[BiosampleIndex]): Biosample indices to merge. + + Returns: + BiosampleIndex: Merged biosample index. + """ + # Extract the DataFrames from the BiosampleIndex objects + biosample_dfs = [biosample_index.df for biosample_index in biosample_indices] + [self.df] + + # Merge the DataFrames + merged_df = reduce(DataFrame.unionAll, biosample_dfs) + + # Determine aggregation functions for each column + # Currently this will take the first value for single values and merge lists for list values + agg_funcs = [] + for field in merged_df.schema.fields: + if field.name != "biosampleId": # Skip the grouping column + if field.dataType == ArrayType(StringType()): + agg_funcs.append(f.array_distinct(f.flatten(f.collect_list(field.name))).alias(field.name)) + else: + agg_funcs.append(f.first(f.col(field.name), ignorenulls=True).alias(field.name)) + + # Perform aggregation + aggregated_df = merged_df.groupBy("biosampleId").agg(*agg_funcs) + + return BiosampleIndex( + _df=aggregated_df, + _schema=BiosampleIndex.get_schema() + ) + + def retain_rows_with_ancestor_id( + self: BiosampleIndex, + ancestor_ids : list[str] + ) -> BiosampleIndex: + """Filter the biosample index to retain only rows with the given ancestor IDs. + + Args: + ancestor_ids (list[str]): Ancestor IDs to filter on. + + Returns: + BiosampleIndex: Filtered biosample index. + """ + # Create a Spark array of ancestor IDs prior to filtering + ancestor_ids_array = f.array(*[f.lit(id) for id in ancestor_ids]) + + return BiosampleIndex( + _df=self.df.filter( + f.size(f.array_intersect(f.col("ancestors"), ancestor_ids_array)) > 0 + ), + _schema=BiosampleIndex.get_schema() + ) diff --git a/src/gentropy/dataset/colocalisation.py b/src/gentropy/dataset/colocalisation.py index e72543cb2..db0040652 100644 --- a/src/gentropy/dataset/colocalisation.py +++ b/src/gentropy/dataset/colocalisation.py @@ -1,15 +1,27 @@ """Colocalisation dataset.""" + from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING +import pyspark.sql.functions as f + from gentropy.common.schemas import parse_spark_schema +from gentropy.common.spark_helpers import get_record_with_maximum_value from gentropy.dataset.dataset import Dataset +from gentropy.dataset.study_locus import StudyLocus +from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex if TYPE_CHECKING: + from pyspark.sql import DataFrame from pyspark.sql.types import StructType + from gentropy.dataset.study_index import StudyIndex + from gentropy.dataset.study_locus import StudyLocus + +from functools import reduce + @dataclass class Colocalisation(Dataset): @@ -23,3 +35,143 @@ def get_schema(cls: type[Colocalisation]) -> StructType: StructType: Schema for the Colocalisation dataset """ return parse_spark_schema("colocalisation.json") + + def extract_maximum_coloc_probability_per_region_and_gene( + self: Colocalisation, + study_locus: StudyLocus, + study_index: StudyIndex, + *, + filter_by_colocalisation_method: str, + filter_by_qtls: str | list[str] | None = None, + ) -> DataFrame: + """Get maximum colocalisation probability for a (studyLocus, gene) window. + + Args: + study_locus (StudyLocus): Dataset containing study loci to filter the colocalisation dataset on and the geneId linked to the region + study_index (StudyIndex): Study index to use to get study metadata + filter_by_colocalisation_method (str): optional filter to apply on the colocalisation dataset + filter_by_qtls (str | list[str] | None): optional filter to apply on the colocalisation dataset + + Returns: + DataFrame: table with the maximum colocalisation scores for the provided study loci + + Raises: + ValueError: if filter_by_qtl is not in the list of valid QTL types or is not in the list of valid colocalisation methods + """ + from gentropy.colocalisation import ColocalisationStep + + valid_qtls = list( + set(EqtlCatalogueStudyIndex.method_to_study_type_mapping.values()) + ) + [ + f"sc{qtl}" + for qtl in set( + EqtlCatalogueStudyIndex.method_to_study_type_mapping.values() + ) + ] + + if filter_by_qtls: + filter_by_qtls = ( + list(map(str.lower, [filter_by_qtls])) + if isinstance(filter_by_qtls, str) + else list(map(str.lower, filter_by_qtls)) + ) + if any(qtl not in valid_qtls for qtl in filter_by_qtls): + raise ValueError(f"There are no studies with QTL type {filter_by_qtls}") + + if filter_by_colocalisation_method not in [ + "ECaviar", + "Coloc", + ]: # TODO: Write helper class to retrieve coloc method names + raise ValueError( + f"Colocalisation method {filter_by_colocalisation_method} is not supported." + ) + + method_colocalisation_metric = ColocalisationStep._get_colocalisation_class( + filter_by_colocalisation_method + ).METHOD_METRIC + + coloc_filtering_expr = [ + f.col("rightGeneId").isNotNull(), + f.lower("colocalisationMethod") == filter_by_colocalisation_method.lower(), + ] + if filter_by_qtls: + coloc_filtering_expr.append(f.lower("rightStudyType").isin(filter_by_qtls)) + + filtered_colocalisation = ( + # Bring rightStudyType and rightGeneId and filter by rows where the gene is null, + # which is equivalent to filtering studyloci from gwas on the right side + self.append_study_metadata( + study_locus, + study_index, + metadata_cols=["geneId", "studyType"], + colocalisation_side="right", + ) + # it also filters based on method and qtl type + .filter(reduce(lambda a, b: a & b, coloc_filtering_expr)) + # and filters colocalisation results to only include the subset of studylocus that contains gwas studylocusid + .join( + study_locus.df.selectExpr("studyLocusId as leftStudyLocusId"), + "leftStudyLocusId", + ) + ) + + return get_record_with_maximum_value( + filtered_colocalisation.withColumnRenamed( + "leftStudyLocusId", "studyLocusId" + ).withColumnRenamed("rightGeneId", "geneId"), + ["studyLocusId", "geneId"], + method_colocalisation_metric, + ) + + def append_study_metadata( + self: Colocalisation, + study_locus: StudyLocus, + study_index: StudyIndex, + *, + metadata_cols: list[str], + colocalisation_side: str = "right", + ) -> DataFrame: + """Appends metadata from the study to the requested side of the colocalisation dataset. + + Args: + study_locus (StudyLocus): Dataset containing study loci that links the colocalisation dataset and the study index via the studyId + study_index (StudyIndex): Dataset containing study index that contains the metadata + metadata_cols (list[str]): List of study columns to append + colocalisation_side (str): Which side of the colocalisation dataset to append metadata to. Must be either 'right' or 'left' + + Returns: + DataFrame: Colocalisation dataset with appended metadata of the study from the requested side + + Raises: + ValueError: if colocalisation_side is not 'right' or 'left' + """ + metadata_cols = ["studyId", *metadata_cols] + if colocalisation_side not in ["right", "left"]: + raise ValueError( + f"colocalisation_side must be either 'right' or 'left', got {colocalisation_side}" + ) + + study_loci_w_metadata = ( + study_locus.df.select("studyLocusId", "studyId") + .join( + f.broadcast(study_index.df.select("studyId", *metadata_cols)), + "studyId", + ) + .distinct() + ) + coloc_df = ( + # drop `rightStudyType` in case it is requested + self.df.drop("rightStudyType") + if "studyType" in metadata_cols and colocalisation_side == "right" + else self.df + ) + return ( + # Append that to the respective side of the colocalisation dataset + study_loci_w_metadata.selectExpr( + f"studyLocusId as {colocalisation_side}StudyLocusId", + *[ + f"{col} as {colocalisation_side}{col[0].upper() + col[1:]}" + for col in metadata_cols + ], + ).join(coloc_df, f"{colocalisation_side}StudyLocusId", "right") + ) diff --git a/src/gentropy/dataset/dataset.py b/src/gentropy/dataset/dataset.py index 856357afe..67fe05eaf 100644 --- a/src/gentropy/dataset/dataset.py +++ b/src/gentropy/dataset/dataset.py @@ -1,15 +1,23 @@ """Dataset class for gentropy.""" + from __future__ import annotations from abc import ABC, abstractmethod from dataclasses import dataclass +from enum import Enum +from functools import reduce from typing import TYPE_CHECKING, Any +import pyspark.sql.functions as f +from pyspark.sql.types import DoubleType +from pyspark.sql.window import Window from typing_extensions import Self -from gentropy.common.schemas import flatten_schema +from gentropy.common.schemas import SchemaValidationError, compare_struct_schemas if TYPE_CHECKING: + from enum import Enum + from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType @@ -58,6 +66,30 @@ def schema(self: Dataset) -> StructType: """ return self._schema + @classmethod + def _process_class_params( + cls, params: dict[str, Any] + ) -> tuple[dict[str, Any], dict[str, Any]]: + """Separate class initialization parameters from spark session parameters. + + Args: + params (dict[str, Any]): Combined parameters dictionary + + Returns: + tuple[dict[str, Any], dict[str, Any]]: (class_params, spark_params) + """ + # Get all field names from the class (including parent classes) + class_field_names = { + field.name + for cls_ in cls.__mro__ + if hasattr(cls_, "__dataclass_fields__") + for field in cls_.__dataclass_fields__.values() + } + # Separate parameters + class_params = {k: v for k, v in params.items() if k in class_field_names} + spark_params = {k: v for k, v in params.items() if k not in class_field_names} + return class_params, spark_params + @classmethod @abstractmethod def get_schema(cls: type[Self]) -> StructType: @@ -65,8 +97,31 @@ def get_schema(cls: type[Self]) -> StructType: Returns: StructType: Schema for the Dataset + + Raises: + NotImplementedError: Must be implemented in the child classes + """ + raise NotImplementedError("Must be implemented in the child classes") + + @classmethod + def get_QC_column_name(cls: type[Self]) -> str | None: + """Abstract method to get the QC column name. Assumes None unless overriden by child classes. + + Returns: + str | None: Column name + """ + return None + + @classmethod + def get_QC_mappings(cls: type[Self]) -> dict[str, str]: + """Method to get the mapping between QC flag and corresponding QC category value. + + Returns empty dict unless overriden by child classes. + + Returns: + dict[str, str]: Mapping between flag name and QC column category value. """ - pass + return {} @classmethod def from_parquet( @@ -89,10 +144,14 @@ def from_parquet( ValueError: Parquet file is empty """ schema = cls.get_schema() - df = session.read_parquet(path, schema=schema, **kwargs) + + # Separate class params from spark params + class_params, spark_params = cls._process_class_params(kwargs) + + df = session.load_data(path, format="parquet", schema=schema, **spark_params) if df.isEmpty(): raise ValueError(f"Parquet file is empty: {path}") - return cls(_df=df, _schema=schema) + return cls(_df=df, _schema=schema, **class_params) def filter(self: Self, condition: Column) -> Self: """Creates a new instance of a Dataset with the DataFrame filtered by the condition. @@ -111,58 +170,87 @@ def validate_schema(self: Dataset) -> None: """Validate DataFrame schema against expected class schema. Raises: - ValueError: DataFrame schema is not valid + SchemaValidationError: If the DataFrame schema does not match the expected schema """ expected_schema = self._schema - expected_fields = flatten_schema(expected_schema) observed_schema = self._df.schema - observed_fields = flatten_schema(observed_schema) # Unexpected fields in dataset - if unexpected_field_names := [ - x.name - for x in observed_fields - if x.name not in [y.name for y in expected_fields] - ]: - raise ValueError( - f"The {unexpected_field_names} fields are not included in DataFrame schema: {expected_fields}" + if discrepancies := compare_struct_schemas(observed_schema, expected_schema): + raise SchemaValidationError( + f"Schema validation failed for {type(self).__name__}", discrepancies ) - # Required fields not in dataset - required_fields = [x.name for x in expected_schema if not x.nullable] - if missing_required_fields := [ - req - for req in required_fields - if not any(field.name == req for field in observed_fields) - ]: - raise ValueError( - f"The {missing_required_fields} fields are required but missing: {required_fields}" - ) + def valid_rows(self: Self, invalid_flags: list[str], invalid: bool = False) -> Self: + """Filters `Dataset` according to a list of quality control flags. Only `Dataset` classes with a QC column can be validated. - # Fields with duplicated names - if duplicated_fields := [ - x for x in set(observed_fields) if observed_fields.count(x) > 1 - ]: - raise ValueError( - f"The following fields are duplicated in DataFrame schema: {duplicated_fields}" - ) + This method checks do following steps: + - Check if the Dataset contains a QC column. + - Check if the invalid_flags exist in the QC mappings flags. + - Filter the Dataset according to the invalid_flags and invalid parameters. - # Fields with different datatype - observed_field_types = { - field.name: type(field.dataType) for field in observed_fields - } - expected_field_types = { - field.name: type(field.dataType) for field in expected_fields - } - if fields_with_different_observed_datatype := [ - name - for name, observed_type in observed_field_types.items() - if name in expected_field_types - and observed_type != expected_field_types[name] - ]: + Args: + invalid_flags (list[str]): List of quality control flags to be excluded. + invalid (bool): If True returns the invalid rows, instead of the valid. Defaults to False. + + Returns: + Self: filtered dataset. + + Raises: + ValueError: If the Dataset does not contain a QC column or if the invalid_flags elements do not exist in QC mappings flags. + """ + # If the invalid flags are not valid quality checks (enum) for this Dataset we raise an error: + invalid_reasons = [] + for flag in invalid_flags: + if flag not in self.get_QC_mappings(): + raise ValueError( + f"{flag} is not a valid QC flag for {type(self).__name__} ({self.get_QC_mappings()})." + ) + reason = self.get_QC_mappings()[flag] + invalid_reasons.append(reason) + + qc_column_name = self.get_QC_column_name() + # If Dataset (class) does not contain QC column we raise an error: + if not qc_column_name: raise ValueError( - f"The following fields present differences in their datatypes: {fields_with_different_observed_datatype}." + f"{type(self).__name__} objects do not contain a QC column to filter by." ) + else: + column: str = qc_column_name + # If QC column (nullable) is not available in the dataframe we create an empty array: + qc = f.when(f.col(column).isNull(), f.array()).otherwise(f.col(column)) + + filterCondition = ~f.arrays_overlap( + f.array([f.lit(i) for i in invalid_reasons]), qc + ) + # Returning the filtered dataset: + if invalid: + return self.filter(~filterCondition) + else: + return self.filter(filterCondition) + + def drop_infinity_values(self: Self, *cols: str) -> Self: + """Drop infinity values from Double typed column. + + Infinity type reference - https://spark.apache.org/docs/latest/sql-ref-datatypes.html#floating-point-special-values + The implementation comes from https://stackoverflow.com/questions/34432998/how-to-replace-infinity-in-pyspark-dataframe + + Args: + *cols (str): names of the columns to check for infinite values, these should be of DoubleType only! + + Returns: + Self: Dataset after removing infinite values + """ + if len(cols) == 0: + return self + inf_strings = ("Inf", "+Inf", "-Inf", "Infinity", "+Infinity", "-Infinity") + inf_values = [f.lit(v).cast(DoubleType()) for v in inf_strings] + conditions = [f.col(c).isin(inf_values) for c in cols] + # reduce individual filter expressions with or statement + # to col("beta").isin([lit(Inf)]) | col("beta").isin([lit(Inf)])... + condition = reduce(lambda a, b: a | b, conditions) + self.df = self._df.filter(~condition) + return self def persist(self: Self) -> Self: """Persist in memory the DataFrame included in the Dataset. @@ -211,3 +299,57 @@ def repartition(self: Self, num_partitions: int, **kwargs: Any) -> Self: """ self.df = self._df.repartition(num_partitions, **kwargs) return self + + @staticmethod + def update_quality_flag( + qc: Column, flag_condition: Column, flag_text: Enum + ) -> Column: + """Update the provided quality control list with a new flag if condition is met. + + Args: + qc (Column): Array column with the current list of qc flags. + flag_condition (Column): This is a column of booleans, signing which row should be flagged + flag_text (Enum): Text for the new quality control flag + + Returns: + Column: Array column with the updated list of qc flags. + """ + qc = f.when(qc.isNull(), f.array()).otherwise(qc) + return f.when( + flag_condition, + f.array_union(qc, f.array(f.lit(flag_text.value))), + ).otherwise(qc) + + @staticmethod + def flag_duplicates(test_column: Column) -> Column: + """Return True for rows, where the value was already seen in column. + + This implementation allows keeping the first occurrence of the value. + + Args: + test_column (Column): Column to check for duplicates + + Returns: + Column: Column with a boolean flag for duplicates + """ + return ( + f.row_number().over(Window.partitionBy(test_column).orderBy(f.rand())) > 1 + ) + + @staticmethod + def generate_identifier(uniqueness_defining_columns: list[str]) -> Column: + """Hashes the provided columns to generate a unique identifier. + + Args: + uniqueness_defining_columns (list[str]): list of columns defining uniqueness + + Returns: + Column: column with a unique identifier + """ + hashable_columns = [ + f.when(f.col(column).cast("string").isNull(), f.lit("None")).otherwise( + f.col(column).cast("string") + ) + for column in uniqueness_defining_columns + ] + return f.md5(f.concat(*hashable_columns)) diff --git a/src/gentropy/dataset/intervals.py b/src/gentropy/dataset/intervals.py index c3b9136c9..37158810b 100644 --- a/src/gentropy/dataset/intervals.py +++ b/src/gentropy/dataset/intervals.py @@ -1,22 +1,19 @@ """Interval dataset.""" + from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING -import pyspark.sql.functions as f - from gentropy.common.Liftover import LiftOverSpark from gentropy.common.schemas import parse_spark_schema from gentropy.dataset.dataset import Dataset from gentropy.dataset.gene_index import GeneIndex -from gentropy.dataset.v2g import V2G if TYPE_CHECKING: from pyspark.sql import SparkSession from pyspark.sql.types import StructType - from gentropy.dataset.variant_index import VariantIndex @dataclass @@ -74,32 +71,3 @@ def from_source( source_class = source_to_class[source_name] data = source_class.read(spark, source_path) # type: ignore return source_class.parse(data, gene_index, lift) # type: ignore - - def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: - """Convert intervals into V2G by intersecting with a variant index. - - Args: - variant_index (VariantIndex): Variant index dataset - - Returns: - V2G: Variant-to-gene evidence dataset - """ - return V2G( - _df=( - self.df.alias("interval") - .join( - variant_index.df.selectExpr( - "chromosome as vi_chromosome", "variantId", "position" - ).alias("vi"), - on=[ - f.col("vi.vi_chromosome") == f.col("interval.chromosome"), - f.col("vi.position").between( - f.col("interval.start"), f.col("interval.end") - ), - ], - how="inner", - ) - .drop("start", "end", "vi_chromosome", "position") - ), - _schema=V2G.get_schema(), - ) diff --git a/src/gentropy/dataset/l2g_feature.py b/src/gentropy/dataset/l2g_feature.py deleted file mode 100644 index 2e9f19d61..000000000 --- a/src/gentropy/dataset/l2g_feature.py +++ /dev/null @@ -1,25 +0,0 @@ -"""L2G Feature Dataset.""" -from __future__ import annotations - -from dataclasses import dataclass -from typing import TYPE_CHECKING - -from gentropy.common.schemas import parse_spark_schema -from gentropy.dataset.dataset import Dataset - -if TYPE_CHECKING: - from pyspark.sql.types import StructType - - -@dataclass -class L2GFeature(Dataset): - """Locus-to-gene feature dataset.""" - - @classmethod - def get_schema(cls: type[L2GFeature]) -> StructType: - """Provides the schema for the L2GFeature dataset. - - Returns: - StructType: Schema for the L2GFeature dataset - """ - return parse_spark_schema("l2g_feature.json") diff --git a/src/gentropy/dataset/l2g_feature_matrix.py b/src/gentropy/dataset/l2g_feature_matrix.py index fa84499dc..f59e1e725 100644 --- a/src/gentropy/dataset/l2g_feature_matrix.py +++ b/src/gentropy/dataset/l2g_feature_matrix.py @@ -1,98 +1,109 @@ """Feature matrix of study locus pairs annotated with their functional genomics features.""" + from __future__ import annotations -from dataclasses import dataclass from functools import reduce from typing import TYPE_CHECKING, Type -from gentropy.common.schemas import parse_spark_schema +import pyspark.sql.functions as f +from pyspark.sql import Window +from typing_extensions import Self + from gentropy.common.spark_helpers import convert_from_long_to_wide -from gentropy.dataset.dataset import Dataset -from gentropy.method.l2g.feature_factory import ColocalisationFactory, StudyLocusFactory +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.method.l2g.feature_factory import FeatureFactory, L2GFeatureInputLoader if TYPE_CHECKING: - from pyspark.sql.types import StructType + from pyspark.sql import DataFrame - from gentropy.dataset.colocalisation import Colocalisation - from gentropy.dataset.study_index import StudyIndex from gentropy.dataset.study_locus import StudyLocus - from gentropy.dataset.v2g import V2G -@dataclass -class L2GFeatureMatrix(Dataset): - """Dataset with features for Locus to Gene prediction. +class L2GFeatureMatrix: + """Dataset with features for Locus to Gene prediction.""" - Attributes: - features_list (list[str] | None): List of features to use. If None, all possible features are used. - """ + def __init__( + self, + _df: DataFrame, + features_list: list[str] | None = None, + with_gold_standard: bool = False, + ) -> None: + """Post-initialisation to set the features list. If not provided, all columns except the fixed ones are used. - features_list: list[str] | None = None + Args: + _df (DataFrame): Feature matrix dataset + features_list (list[str] | None): List of features to use. If None, all possible features are used. + with_gold_standard (bool): Whether to include the gold standard set in the feature matrix. + """ + self.with_gold_standard = with_gold_standard + self.fixed_cols = ["studyLocusId", "geneId"] + if self.with_gold_standard: + self.fixed_cols.append("goldStandardSet") - def __post_init__(self: L2GFeatureMatrix) -> None: - """Post-initialisation to set the features list. If not provided, all columns except the fixed ones are used.""" - fixed_cols = ["studyLocusId", "geneId", "goldStandardSet"] - self.features_list = self.features_list or [ - col for col in self._df.columns if col not in fixed_cols + self.features_list = features_list or [ + col for col in _df.columns if col not in self.fixed_cols ] + self._df = _df.selectExpr( + self.fixed_cols + + [ + f"CAST({feature} AS FLOAT) AS {feature}" + for feature in self.features_list + ] + ) @classmethod - def generate_features( + def from_features_list( cls: Type[L2GFeatureMatrix], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, features_list: list[str], - study_locus: StudyLocus, - study_index: StudyIndex, - variant_gene: V2G, - colocalisation: Colocalisation, + features_input_loader: L2GFeatureInputLoader, ) -> L2GFeatureMatrix: - """Generate features from the gentropy datasets. + """Generate features from the gentropy datasets by calling the feature factory that will instantiate the corresponding features. Args: - features_list (list[str]): List of features to generate - study_locus (StudyLocus): Study locus dataset - study_index (StudyIndex): Study index dataset - variant_gene (V2G): Variant to gene dataset - colocalisation (Colocalisation): Colocalisation dataset + study_loci_to_annotate (StudyLocus | L2GGoldStandard): Study locus pairs to annotate + features_list (list[str]): List of feature names to be computed. + features_input_loader (L2GFeatureInputLoader): Object that contais features input. Returns: L2GFeatureMatrix: L2G feature matrix dataset - - Raises: - ValueError: If the feature matrix is empty """ - if features_dfs := [ - # Extract features - ColocalisationFactory._get_coloc_features( - study_locus, study_index, colocalisation - ).df, - StudyLocusFactory._get_tss_distance_features(study_locus, variant_gene).df, - StudyLocusFactory._get_vep_features(study_locus, variant_gene).df, - ]: - fm = reduce( - lambda x, y: x.unionByName(y), - features_dfs, + features_long_df = reduce( + lambda x, y: x.unionByName(y, allowMissingColumns=True), + [ + # Compute all features and merge them into a single dataframe + feature.df + for feature in FeatureFactory( + study_loci_to_annotate, features_list + ).generate_features(features_input_loader) + ], + ) + if isinstance(study_loci_to_annotate, L2GGoldStandard): + return cls( + _df=convert_from_long_to_wide( + # Add gold standard set to the feature matrix + features_long_df.join( + study_loci_to_annotate.df.select( + "studyLocusId", "geneId", "goldStandardSet" + ), + ["studyLocusId", "geneId"], + ), + ["studyLocusId", "geneId", "goldStandardSet"], + "featureName", + "featureValue", + ), + with_gold_standard=True, ) - else: - raise ValueError("No features found") - - # raise error if the feature matrix is empty return cls( _df=convert_from_long_to_wide( - fm, ["studyLocusId", "geneId"], "featureName", "featureValue" + features_long_df, + ["studyLocusId", "geneId"], + "featureName", + "featureValue", ), - _schema=cls.get_schema(), - features_list=features_list, + with_gold_standard=False, ) - @classmethod - def get_schema(cls: type[L2GFeatureMatrix]) -> StructType: - """Provides the schema for the L2gFeatureMatrix dataset. - - Returns: - StructType: Schema for the L2gFeatureMatrix dataset - """ - return parse_spark_schema("l2g_feature_matrix.json") - def calculate_feature_missingness_rate( self: L2GFeatureMatrix, ) -> dict[str, float]: @@ -119,51 +130,72 @@ def calculate_feature_missingness_rate( } def fill_na( - self: L2GFeatureMatrix, value: float = 0.0, subset: list[str] | None = None + self: L2GFeatureMatrix, na_value: float = 0.0, subset: list[str] | None = None ) -> L2GFeatureMatrix: """Fill missing values in a column with a given value. + For features that correspond to gene attributes, missing values are imputed using the mean of the column. + Args: - value (float): Value to replace missing values with. Defaults to 0.0. + na_value (float): Value to replace missing values with. Defaults to 0.0. subset (list[str] | None): Subset of columns to consider. Defaults to None. Returns: L2GFeatureMatrix: L2G feature matrix dataset """ - self.df = self._df.fillna(value, subset=subset) + cols_to_impute = [ + "proteinGeneCount500kb", + "geneCount500kb", + ] + for col in cols_to_impute: + if col not in self._df.columns: + continue + else: + self._df = self._df.withColumn( + col, + f.when( + f.col(col).isNull(), + f.mean(f.col(col)).over(Window.partitionBy("studyLocusId")), + ).otherwise(f.col(col)), + ) + self._df = self._df.fillna(na_value, subset=subset) return self def select_features( - self: L2GFeatureMatrix, features_list: list[str] | None + self: L2GFeatureMatrix, + features_list: list[str] | None, ) -> L2GFeatureMatrix: - """Select a subset of features from the feature matrix. + """Returns a new object with a subset of features from the original feature matrix. Args: features_list (list[str] | None): List of features to select Returns: L2GFeatureMatrix: L2G feature matrix dataset - """ - features_list = features_list or self.features_list - fixed_cols = ["studyLocusId", "geneId", "goldStandardSet"] - self.df = self._df.select(fixed_cols + features_list) # type: ignore - return self - def train_test_split( - self: L2GFeatureMatrix, fraction: float - ) -> tuple[L2GFeatureMatrix, L2GFeatureMatrix]: - """Split the dataset into training and test sets. + Raises: + ValueError: If no features have been selected. + """ + if features_list := features_list or self.features_list: + # cast to float every feature in the features_list + return L2GFeatureMatrix( + _df=self._df.selectExpr( + self.fixed_cols + + [ + f"CAST({feature} AS FLOAT) AS {feature}" + for feature in features_list + ] + ), + features_list=features_list, + with_gold_standard=self.with_gold_standard, + ) + raise ValueError("features_list cannot be None") - Args: - fraction (float): Fraction of the dataset to use for training + def persist(self: Self) -> Self: + """Persist the feature matrix in memory. Returns: - tuple[L2GFeatureMatrix, L2GFeatureMatrix]: Training and test datasets + Self: Persisted Dataset """ - train, test = self._df.randomSplit([fraction, 1 - fraction], seed=42) - return ( - L2GFeatureMatrix( - _df=train, _schema=L2GFeatureMatrix.get_schema() - ).persist(), - L2GFeatureMatrix(_df=test, _schema=L2GFeatureMatrix.get_schema()).persist(), - ) + self._df = self._df.persist() + return self diff --git a/src/gentropy/dataset/l2g_features/__init__.py b/src/gentropy/dataset/l2g_features/__init__.py new file mode 100644 index 000000000..ce15cedfe --- /dev/null +++ b/src/gentropy/dataset/l2g_features/__init__.py @@ -0,0 +1,3 @@ +"""Feature factories for L2G.""" + +from __future__ import annotations diff --git a/src/gentropy/dataset/l2g_features/colocalisation.py b/src/gentropy/dataset/l2g_features/colocalisation.py new file mode 100644 index 000000000..fdbf3ed18 --- /dev/null +++ b/src/gentropy/dataset/l2g_features/colocalisation.py @@ -0,0 +1,730 @@ +"""Collection of methods that extract features from the colocalisation datasets.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f + +from gentropy.common.spark_helpers import convert_from_wide_to_long +from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.variant_index import VariantIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +def common_colocalisation_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + colocalisation_method: str, + colocalisation_metric: str, + feature_name: str, + qtl_types: list[str] | str, + *, + colocalisation: Colocalisation, + study_index: StudyIndex, + study_locus: StudyLocus, +) -> DataFrame: + """Wrapper to call the logic that creates a type of colocalisation features. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + colocalisation_method (str): The colocalisation method to filter the data by + colocalisation_metric (str): The colocalisation metric to use + feature_name (str): The name of the feature to create + qtl_types (list[str] | str): The types of QTL to filter the data by + colocalisation (Colocalisation): Dataset with the colocalisation results + study_index (StudyIndex): Study index to fetch study type and gene + study_locus (StudyLocus): Study locus to traverse between colocalisation and study index + + Returns: + DataFrame: Feature annotation in long format with the columns: studyLocusId, geneId, featureName, featureValue + """ + joining_cols = ( + ["studyLocusId", "geneId"] + if isinstance(study_loci_to_annotate, L2GGoldStandard) + else ["studyLocusId"] + ) + return ( + study_loci_to_annotate.df.join( + colocalisation.extract_maximum_coloc_probability_per_region_and_gene( + study_locus, + study_index, + filter_by_colocalisation_method=colocalisation_method, + filter_by_qtls=qtl_types, + ), + on=joining_cols, + ) + .selectExpr( + "studyLocusId", + "geneId", + f"{colocalisation_metric} as {feature_name}", + ) + .distinct() + ) + + +def extend_missing_colocalisation_to_neighbourhood_genes( + feature_name: str, + local_features: DataFrame, + variant_index: VariantIndex, + gene_index: GeneIndex, + study_locus: StudyLocus, +) -> DataFrame: + """This function creates an artificial dataset of features that represents the missing colocalisation to the neighbourhood genes. + + Args: + feature_name (str): The name of the feature to extend + local_features (DataFrame): The dataframe of features to extend + variant_index (VariantIndex): Variant index containing all variant/gene relationships + gene_index (GeneIndex): Gene index to fetch the gene information + study_locus (StudyLocus): Study locus to traverse between colocalisation and variant index + + Returns: + DataFrame: Dataframe of features that include genes in the neighbourhood not present in the colocalisation results. For these genes, the feature value is set to 0. + """ + coding_variant_gene_lut = ( + variant_index.df.select( + "variantId", f.explode("transcriptConsequences").alias("tc") + ) + .select(f.col("tc.targetId").alias("geneId"), "variantId") + .join(gene_index.df.select("geneId", "biotype"), "geneId", "left") + .filter(f.col("biotype") == "protein_coding") + .drop("biotype") + .distinct() + ) + local_features_w_variant = local_features.join( + study_locus.df.select("studyLocusId", "variantId"), "studyLocusId" + ) + return ( + # Get the genes that are not present in the colocalisation results + coding_variant_gene_lut.join( + local_features_w_variant, ["variantId", "geneId"], "left_anti" + ) + # We now link the missing variant/gene to the study locus from the original dataframe + .join( + local_features_w_variant.select("studyLocusId", "variantId").distinct(), + "variantId", + ) + .drop("variantId") + # Fill the information for missing genes with 0 + .withColumn(feature_name, f.lit(0.0)) + ) + + +def common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + colocalisation_method: str, + colocalisation_metric: str, + feature_name: str, + qtl_types: list[str] | str, + *, + colocalisation: Colocalisation, + study_index: StudyIndex, + gene_index: GeneIndex, + study_locus: StudyLocus, + variant_index: VariantIndex, +) -> DataFrame: + """Wrapper to call the logic that creates a type of colocalisation features. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + colocalisation_method (str): The colocalisation method to filter the data by + colocalisation_metric (str): The colocalisation metric to use + feature_name (str): The name of the feature to create + qtl_types (list[str] | str): The types of QTL to filter the data by + colocalisation (Colocalisation): Dataset with the colocalisation results + study_index (StudyIndex): Study index to fetch study type and gene + gene_index (GeneIndex): Gene index to add gene type + study_locus (StudyLocus): Study locus to traverse between colocalisation and study index + variant_index (VariantIndex): Variant index to annotate all overlapping genes + + Returns: + DataFrame: Feature annotation in long format with the columns: studyLocusId, geneId, featureName, featureValue + """ + # First maximum colocalisation score for each studylocus, gene + local_feature_name = feature_name.replace("Neighbourhood", "") + local_max = common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + local_feature_name, + qtl_types, + colocalisation=colocalisation, + study_index=study_index, + study_locus=study_locus, + ) + extended_local_max = local_max.unionByName( + extend_missing_colocalisation_to_neighbourhood_genes( + local_feature_name, + local_max, + variant_index, + gene_index, + study_locus, + ) + ) + # Compute average score in the vicinity (feature will be the same for any gene associated with a studyLocus) + # (non protein coding genes in the vicinity are excluded see #3552) + regional_mean_per_study_locus = ( + extended_local_max.join( + gene_index.df.select("geneId", "biotype"), "geneId", "left" + ) + .filter(f.col("biotype") == "protein_coding") + .groupBy("studyLocusId") + .agg(f.mean(local_feature_name).alias("regional_mean")) + ) + return ( + local_max.join(regional_mean_per_study_locus, "studyLocusId", "left") + .withColumn( + feature_name, + f.col(local_feature_name) - f.coalesce(f.col("regional_mean"), f.lit(0.0)), + ) + .drop("regional_mean", local_feature_name) + ) + + +class EQtlColocClppMaximumFeature(L2GFeature): + """Max CLPP for each (study, locus, gene) aggregating over all eQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "eQtlColocClppMaximum" + + @classmethod + def compute( + cls: type[EQtlColocClppMaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> EQtlColocClppMaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dictionary with the dependencies required. They are passed as keyword arguments. + + Returns: + EQtlColocClppMaximumFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_type = ["eqtl", "sceqtl"] + + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class EQtlColocClppMaximumNeighbourhoodFeature(L2GFeature): + """Max CLPP for each (study, locus) aggregating over all eQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "eQtlColocClppMaximumNeighbourhood" + + @classmethod + def compute( + cls: type[EQtlColocClppMaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> EQtlColocClppMaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dictionary with the dependencies required. They are passed as keyword arguments. + + Returns: + EQtlColocClppMaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_type = ["eqtl", "sceqtl"] + + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class PQtlColocClppMaximumFeature(L2GFeature): + """Max CLPP for each (study, locus, gene) aggregating over all pQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "pQtlColocClppMaximum" + + @classmethod + def compute( + cls: type[PQtlColocClppMaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> PQtlColocClppMaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + PQtlColocClppMaximumFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_type = "pqtl" + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class PQtlColocClppMaximumNeighbourhoodFeature(L2GFeature): + """Max CLPP for each (study, locus, gene) aggregating over all pQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "pQtlColocClppMaximumNeighbourhood" + + @classmethod + def compute( + cls: type[PQtlColocClppMaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> PQtlColocClppMaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + PQtlColocClppMaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_type = "pqtl" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class SQtlColocClppMaximumFeature(L2GFeature): + """Max CLPP for each (study, locus, gene) aggregating over all sQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "sQtlColocClppMaximum" + + @classmethod + def compute( + cls: type[SQtlColocClppMaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> SQtlColocClppMaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + SQtlColocClppMaximumFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_types = ["sqtl", "tuqtl", "scsqtl", "sctuqtl"] + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_types, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class SQtlColocClppMaximumNeighbourhoodFeature(L2GFeature): + """Max CLPP for each (study, locus, gene) aggregating over all sQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "sQtlColocClppMaximumNeighbourhood" + + @classmethod + def compute( + cls: type[SQtlColocClppMaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> SQtlColocClppMaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + SQtlColocClppMaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "ECaviar" + colocalisation_metric = "clpp" + qtl_types = ["sqtl", "tuqtl", "scsqtl", "sctuqtl"] + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_types, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class EQtlColocH4MaximumFeature(L2GFeature): + """Max H4 for each (study, locus, gene) aggregating over all eQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "eQtlColocH4Maximum" + + @classmethod + def compute( + cls: type[EQtlColocH4MaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> EQtlColocH4MaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + EQtlColocH4MaximumFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_type = ["eqtl", "sceqtl"] + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class EQtlColocH4MaximumNeighbourhoodFeature(L2GFeature): + """Max H4 for each (study, locus) aggregating over all eQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "eQtlColocH4MaximumNeighbourhood" + + @classmethod + def compute( + cls: type[EQtlColocH4MaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> EQtlColocH4MaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + EQtlColocH4MaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_type = ["eqtl", "sceqtl"] + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class PQtlColocH4MaximumFeature(L2GFeature): + """Max H4 for each (study, locus, gene) aggregating over all pQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "pQtlColocH4Maximum" + + @classmethod + def compute( + cls: type[PQtlColocH4MaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> PQtlColocH4MaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + PQtlColocH4MaximumFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_type = "pqtl" + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class PQtlColocH4MaximumNeighbourhoodFeature(L2GFeature): + """Max H4 for each (study, locus) aggregating over all pQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "pQtlColocH4MaximumNeighbourhood" + + @classmethod + def compute( + cls: type[PQtlColocH4MaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> PQtlColocH4MaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + PQtlColocH4MaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_type = "pqtl" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class SQtlColocH4MaximumFeature(L2GFeature): + """Max H4 for each (study, locus, gene) aggregating over all sQTLs.""" + + feature_dependency_type = [Colocalisation, StudyIndex, StudyLocus] + feature_name = "sQtlColocH4Maximum" + + @classmethod + def compute( + cls: type[SQtlColocH4MaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> SQtlColocH4MaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + SQtlColocH4MaximumFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_types = ["sqtl", "tuqtl", "scsqtl", "sctuqtl"] + return cls( + _df=convert_from_wide_to_long( + common_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_types, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class SQtlColocH4MaximumNeighbourhoodFeature(L2GFeature): + """Max H4 for each (study, locus) aggregating over all sQTLs.""" + + feature_dependency_type = [ + Colocalisation, + StudyIndex, + GeneIndex, + StudyLocus, + VariantIndex, + ] + feature_name = "sQtlColocH4MaximumNeighbourhood" + + @classmethod + def compute( + cls: type[SQtlColocH4MaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> SQtlColocH4MaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset with the colocalisation results + + Returns: + SQtlColocH4MaximumNeighbourhoodFeature: Feature dataset + """ + colocalisation_method = "Coloc" + colocalisation_metric = "h4" + qtl_types = ["sqtl", "tuqtl", "scsqtl", "sctuqtl"] + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_colocalisation_feature_logic( + study_loci_to_annotate, + colocalisation_method, + colocalisation_metric, + cls.feature_name, + qtl_types, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) diff --git a/src/gentropy/dataset/l2g_features/distance.py b/src/gentropy/dataset/l2g_features/distance.py new file mode 100644 index 000000000..08ffc7c5e --- /dev/null +++ b/src/gentropy/dataset/l2g_features/distance.py @@ -0,0 +1,436 @@ +"""Collection of methods that extract distance features from the variant index dataset.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f +from pyspark.sql import Window + +from gentropy.common.spark_helpers import convert_from_wide_to_long +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.variant_index import VariantIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +def common_distance_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + *, + variant_index: VariantIndex, + feature_name: str, + distance_type: str, + genomic_window: int = 500_000, +) -> DataFrame: + """Calculate the distance feature that correlates a variant in a credible set with a gene. + + The distance is weighted by the posterior probability of the variant to factor in its contribution to the trait when we look at the average distance score for all variants in the credible set. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + variant_index (VariantIndex): The dataset containing distance to gene information + feature_name (str): The name of the feature + distance_type (str): The type of distance to gene + genomic_window (int): The maximum window size to consider + + Returns: + DataFrame: Feature dataset + """ + distances_dataset = variant_index.get_distance_to_gene(distance_type=distance_type) + if "Mean" in feature_name: + # Weighting by the SNP contribution is only applied when we are averaging all distances + df = study_loci_to_annotate.df.withColumn( + "variantInLocus", f.explode_outer("locus") + ).select( + "studyLocusId", + f.col("variantInLocus.variantId").alias("variantId"), + f.col("variantInLocus.posteriorProbability").alias("posteriorProbability"), + ) + distance_score_expr = ( + f.lit(genomic_window) - f.col(distance_type) + f.lit(1) + ) * f.col("posteriorProbability") + agg_expr = f.sum(f.col("distance_score")) + elif "Sentinel" in feature_name: + df = study_loci_to_annotate.df.select("studyLocusId", "variantId") + # For minimum distances we calculate the unweighted distance between the sentinel (lead) and the gene. This + distance_score_expr = f.lit(genomic_window) - f.col(distance_type) + f.lit(1) + agg_expr = f.first(f.col("distance_score")) + return ( + df.join( + distances_dataset.withColumnRenamed("targetId", "geneId"), + on="variantId", + how="inner", + ) + .withColumn( + "distance_score", + distance_score_expr, + ) + .groupBy("studyLocusId", "geneId") + .agg(agg_expr.alias("distance_score_agg")) + .withColumn( + feature_name, + f.log10(f.col("distance_score_agg")) / f.log10(f.lit(genomic_window + 1)), + ) + .drop("distance_score_agg") + ) + + +def common_neighbourhood_distance_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + *, + variant_index: VariantIndex, + feature_name: str, + distance_type: str, + genomic_window: int = 500_000, +) -> DataFrame: + """Calculate the distance feature that correlates any variant in a credible set with any gene nearby the locus. The distance is weighted by the posterior probability of the variant to factor in its contribution to the trait. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + variant_index (VariantIndex): The dataset containing distance to gene information + feature_name (str): The name of the feature + distance_type (str): The type of distance to gene + genomic_window (int): The maximum window size to consider + + Returns: + DataFrame: Feature dataset + """ + local_feature_name = feature_name.replace("Neighbourhood", "") + # First compute mean distances to a gene + local_metric = common_distance_feature_logic( + study_loci_to_annotate, + feature_name=local_feature_name, + distance_type=distance_type, + variant_index=variant_index, + genomic_window=genomic_window, + ) + return ( + # Then compute mean distance in the vicinity (feature will be the same for any gene associated with a studyLocus) + local_metric.withColumn( + "regional_metric", + f.mean(f.col(local_feature_name)).over(Window.partitionBy("studyLocusId")), + ) + .withColumn( + feature_name, + (f.col(local_feature_name) - f.col("regional_metric")) + / f.log10(f.lit(genomic_window + 1)), + ) + .drop("regional_metric", local_feature_name) + ) + + +class DistanceTssMeanFeature(L2GFeature): + """Average distance of all tagging variants to gene TSS.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceTssMean" + + @classmethod + def compute( + cls: type[DistanceTssMeanFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceTssMeanFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceTssMeanFeature: Feature dataset + """ + distance_type = "distanceFromTss" + return cls( + _df=convert_from_wide_to_long( + common_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ).withColumn( + cls.feature_name, + f.when(f.col(cls.feature_name) < 0, f.lit(0.0)).otherwise( + f.col(cls.feature_name) + ), + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceTssMeanNeighbourhoodFeature(L2GFeature): + """Minimum mean distance to TSS for all genes in the vicinity of a studyLocus.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceTssMeanNeighbourhood" + + @classmethod + def compute( + cls: type[DistanceTssMeanNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceTssMeanNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceTssMeanNeighbourhoodFeature: Feature dataset + """ + distance_type = "distanceFromTss" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceSentinelTssFeature(L2GFeature): + """Distance of the sentinel variant to gene TSS. This is not weighted by the causal probability.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceSentinelTss" + + @classmethod + def compute( + cls: type[DistanceSentinelTssFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceSentinelTssFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceSentinelTssFeature: Feature dataset + """ + distance_type = "distanceFromTss" + return cls( + _df=convert_from_wide_to_long( + common_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceSentinelTssNeighbourhoodFeature(L2GFeature): + """Distance between the sentinel variant and a gene TSS as a relation of the distnace with all the genes in the vicinity of a studyLocus. This is not weighted by the causal probability.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceSentinelTssNeighbourhood" + + @classmethod + def compute( + cls: type[DistanceSentinelTssNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceSentinelTssNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceSentinelTssNeighbourhoodFeature: Feature dataset + """ + distance_type = "distanceFromTss" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceFootprintMeanFeature(L2GFeature): + """Average distance of all tagging variants to the footprint of a gene.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceFootprintMean" + + @classmethod + def compute( + cls: type[DistanceFootprintMeanFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceFootprintMeanFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceFootprintMeanFeature: Feature dataset + """ + distance_type = "distanceFromFootprint" + return cls( + _df=convert_from_wide_to_long( + common_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ).withColumn( + cls.feature_name, + f.when(f.col(cls.feature_name) < 0, f.lit(0.0)).otherwise( + f.col(cls.feature_name) + ), + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceFootprintMeanNeighbourhoodFeature(L2GFeature): + """Minimum mean distance to footprint for all genes in the vicinity of a studyLocus.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceFootprintMeanNeighbourhood" + + @classmethod + def compute( + cls: type[DistanceFootprintMeanNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceFootprintMeanNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceFootprintMeanNeighbourhoodFeature: Feature dataset + """ + distance_type = "distanceFromFootprint" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceSentinelFootprintFeature(L2GFeature): + """Distance between the sentinel variant and the footprint of a gene.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceSentinelFootprint" + + @classmethod + def compute( + cls: type[DistanceSentinelFootprintFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceSentinelFootprintFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceSentinelFootprintFeature: Feature dataset + """ + distance_type = "distanceFromFootprint" + return cls( + _df=convert_from_wide_to_long( + common_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class DistanceSentinelFootprintNeighbourhoodFeature(L2GFeature): + """Distance between the sentinel variant and a gene footprint as a relation of the distnace with all the genes in the vicinity of a studyLocus. This is not weighted by the causal probability.""" + + feature_dependency_type = VariantIndex + feature_name = "distanceSentinelFootprintNeighbourhood" + + @classmethod + def compute( + cls: type[DistanceSentinelFootprintNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> DistanceSentinelFootprintNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + DistanceSentinelFootprintNeighbourhoodFeature: Feature dataset + """ + distance_type = "distanceFromFootprint" + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_distance_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + distance_type=distance_type, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) diff --git a/src/gentropy/dataset/l2g_features/l2g_feature.py b/src/gentropy/dataset/l2g_features/l2g_feature.py new file mode 100644 index 000000000..7073ca758 --- /dev/null +++ b/src/gentropy/dataset/l2g_features/l2g_feature.py @@ -0,0 +1,65 @@ +"""L2G Feature Dataset with a collection of methods that extract features from the gentropy datasets to be fed in L2G.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any + +from gentropy.common.schemas import parse_spark_schema +from gentropy.dataset.dataset import Dataset + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + from gentropy.dataset.l2g_gold_standard import L2GGoldStandard + from gentropy.dataset.study_locus import StudyLocus + + +@dataclass +class L2GFeature(Dataset, ABC): + """Locus-to-gene feature dataset that serves as template to generate each of the features that inform about locus to gene assignments.""" + + def __post_init__( + self: L2GFeature, + feature_dependency_type: Any = None, + credible_set: StudyLocus | None = None, + ) -> None: + """Initializes a L2GFeature dataset. Any child class of L2GFeature must implement the `compute` method. + + Args: + feature_dependency_type (Any): The dependency that the L2GFeature dataset depends on. Defaults to None. + credible_set (StudyLocus | None): The credible set that the L2GFeature dataset is based on. Defaults to None. + """ + super().__post_init__() + self.feature_dependency_type = feature_dependency_type + self.credible_set = credible_set + + @classmethod + def get_schema(cls: type[L2GFeature]) -> StructType: + """Provides the schema for the L2GFeature dataset. + + Returns: + StructType: Schema for the L2GFeature dataset + """ + return parse_spark_schema("l2g_feature.json") + + @classmethod + @abstractmethod + def compute( + cls: type[L2GFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: Any, + ) -> L2GFeature: + """Computes the L2GFeature dataset. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (Any): The dependency that the L2GFeature class needs to compute the feature + Returns: + L2GFeature: a L2GFeature dataset + + Raises: + NotImplementedError: This method must be implemented in the child classes + """ + raise NotImplementedError("Must be implemented in the child classes") diff --git a/src/gentropy/dataset/l2g_features/other.py b/src/gentropy/dataset/l2g_features/other.py new file mode 100644 index 000000000..2fc32592b --- /dev/null +++ b/src/gentropy/dataset/l2g_features/other.py @@ -0,0 +1,345 @@ +"""Methods to generate features which are not obviously categorised.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f + +from gentropy.common.spark_helpers import convert_from_wide_to_long +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_locus import CredibleSetConfidenceClasses, StudyLocus +from gentropy.dataset.variant_index import VariantIndex + +if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame + + +def common_genecount_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + *, + gene_index: GeneIndex, + feature_name: str, + genomic_window: int, + protein_coding_only: bool = False, +) -> DataFrame: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci + that will be used for annotation + gene_index (GeneIndex): Dataset containing information related to all genes in release. + feature_name (str): The name of the feature + genomic_window (int): The maximum window size to consider + protein_coding_only (bool): Whether to only consider protein coding genes in calculation. + + Returns: + DataFrame: Feature dataset + """ + study_loci_window = ( + study_loci_to_annotate.df.withColumn( + "window_start", f.col("position") - (genomic_window / 2) + ) + .withColumn("window_end", f.col("position") + (genomic_window / 2)) + .withColumnRenamed("chromosome", "SL_chromosome") + ) + gene_index_filter = gene_index.df + + if protein_coding_only: + gene_index_filter = gene_index_filter.filter( + f.col("biotype") == "protein_coding" + ) + + distinct_gene_counts = ( + study_loci_window.join( + gene_index_filter.alias("genes"), + on=( + (f.col("SL_chromosome") == f.col("genes.chromosome")) + & (f.col("genes.tss") >= f.col("window_start")) + & (f.col("genes.tss") <= f.col("window_end")) + ), + how="inner", + ) + .groupBy("studyLocusId") + .agg(f.approx_count_distinct("geneId").alias(feature_name)) + ) + + return ( + study_loci_window.join( + gene_index_filter.alias("genes"), + on=( + (f.col("SL_chromosome") == f.col("genes.chromosome")) + & (f.col("genes.tss") >= f.col("window_start")) + & (f.col("genes.tss") <= f.col("window_end")) + ), + how="inner", + ) + .join(distinct_gene_counts, on="studyLocusId", how="inner") + .select("studyLocusId", "geneId", feature_name) + .distinct() + ) + + +def is_protein_coding_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + *, + gene_index: GeneIndex, + feature_name: str, + genomic_window: int, +) -> DataFrame: + """Computes the feature to indicate if a gene is protein-coding or not. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci + that will be used for annotation + gene_index (GeneIndex): Dataset containing information related to all genes in release. + feature_name (str): The name of the feature + genomic_window (int): The maximum window size to consider + + Returns: + DataFrame: Feature dataset, with 1 if the gene is protein-coding, 0 if not. + """ + study_loci_window = ( + study_loci_to_annotate.df.withColumn( + "window_start", f.col("position") - (genomic_window / 2) + ) + .withColumn("window_end", f.col("position") + (genomic_window / 2)) + .withColumnRenamed("chromosome", "SL_chromosome") + ) + return ( + study_loci_window.join( + gene_index.df.alias("genes"), + on=( + (f.col("SL_chromosome") == f.col("genes.chromosome")) + & (f.col("genes.tss") >= f.col("window_start")) + & (f.col("genes.tss") <= f.col("window_end")) + ), + how="inner", + ) + .withColumn( + feature_name, + f.when(f.col("biotype") == "protein_coding", f.lit(1)).otherwise(f.lit(0)), + ) + .select("studyLocusId", "geneId", feature_name) + .distinct() + ) + + +class GeneCountFeature(L2GFeature): + """Counts the number of genes within a specified window size from the study locus.""" + + feature_dependency_type = GeneIndex + feature_name = "geneCount500kb" + + @classmethod + def compute( + cls: type[GeneCountFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> GeneCountFeature: + """Computes the gene count feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dictionary containing dependencies, with gene index and window size + + Returns: + GeneCountFeature: Feature dataset + """ + genomic_window = 500000 + gene_count_df = common_genecount_feature_logic( + study_loci_to_annotate=study_loci_to_annotate, + feature_name=cls.feature_name, + genomic_window=genomic_window, + **feature_dependency, + ) + + return cls( + _df=convert_from_wide_to_long( + gene_count_df, + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class ProteinGeneCountFeature(L2GFeature): + """Counts the number of protein coding genes within a specified window size from the study locus.""" + + feature_dependency_type = GeneIndex + feature_name = "proteinGeneCount500kb" + + @classmethod + def compute( + cls: type[ProteinGeneCountFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> ProteinGeneCountFeature: + """Computes the gene count feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dictionary containing dependencies, with gene index and window size + + Returns: + ProteinGeneCountFeature: Feature dataset + """ + genomic_window = 500000 + gene_count_df = common_genecount_feature_logic( + study_loci_to_annotate=study_loci_to_annotate, + feature_name=cls.feature_name, + genomic_window=genomic_window, + protein_coding_only=True, + **feature_dependency, + ) + + return cls( + _df=convert_from_wide_to_long( + gene_count_df, + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class ProteinCodingFeature(L2GFeature): + """Indicates whether a gene is protein-coding within a specified window size from the study locus.""" + + feature_dependency_type = GeneIndex + feature_name = "isProteinCoding" + + @classmethod + def compute( + cls: type[ProteinCodingFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> ProteinCodingFeature: + """Computes the protein coding feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dictionary containing dependencies, including gene index + + Returns: + ProteinCodingFeature: Feature dataset with 1 if the gene is protein-coding, 0 otherwise + """ + genomic_window = 1000000 + protein_coding_df = is_protein_coding_feature_logic( + study_loci_to_annotate=study_loci_to_annotate, + feature_name=cls.feature_name, + genomic_window=genomic_window, + **feature_dependency, + ) + + return cls( + _df=convert_from_wide_to_long( + protein_coding_df, + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class CredibleSetConfidenceFeature(L2GFeature): + """Distance of the sentinel variant to gene TSS. This is not weighted by the causal probability.""" + + feature_dependency_type = [StudyLocus, VariantIndex] + feature_name = "credibleSetConfidence" + + @classmethod + def compute( + cls: type[CredibleSetConfidenceFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> CredibleSetConfidenceFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the distance information + + Returns: + CredibleSetConfidenceFeature: Feature dataset + """ + full_credible_set = feature_dependency["study_locus"].df.select( + "studyLocusId", + "studyId", + f.explode("locus.variantId").alias("variantId"), + cls.score_credible_set_confidence(f.col("confidence")).alias( + cls.feature_name + ), + ) + + return cls( + _df=convert_from_wide_to_long( + ( + study_loci_to_annotate.df.drop("studyLocusId") + # Annotate genes + .join( + feature_dependency["variant_index"].df.select( + "variantId", + f.explode("transcriptConsequences.targetId").alias( + "geneId" + ), + ), + on="variantId", + how="inner", + ) + # Annotate credible set confidence + .join(full_credible_set, ["variantId", "studyId"]) + .select("studyLocusId", "geneId", cls.feature_name) + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + @classmethod + def score_credible_set_confidence( + cls: type[CredibleSetConfidenceFeature], + confidence_column: Column, + ) -> Column: + """Expression that assigns a score to the credible set confidence. + + Args: + confidence_column (Column): Confidence column in the StudyLocus object + + Returns: + Column: A confidence score between 0 and 1 + """ + return ( + f.when( + f.col("confidence") + == CredibleSetConfidenceClasses.FINEMAPPED_IN_SAMPLE_LD.value, + f.lit(1.0), + ) + .when( + f.col("confidence") + == CredibleSetConfidenceClasses.FINEMAPPED_OUT_OF_SAMPLE_LD.value, + f.lit(0.75), + ) + .when( + f.col("confidence") + == CredibleSetConfidenceClasses.PICSED_SUMMARY_STATS.value, + f.lit(0.5), + ) + .when( + f.col("confidence") + == CredibleSetConfidenceClasses.PICSED_TOP_HIT.value, + f.lit(0.25), + ) + .when( + f.col("confidence") == CredibleSetConfidenceClasses.UNKNOWN.value, + f.lit(0.0), + ) + ) diff --git a/src/gentropy/dataset/l2g_features/vep.py b/src/gentropy/dataset/l2g_features/vep.py new file mode 100644 index 000000000..91b03d57b --- /dev/null +++ b/src/gentropy/dataset/l2g_features/vep.py @@ -0,0 +1,268 @@ +"""Collection of methods that extract distance features from the variant index dataset.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f + +from gentropy.common.spark_helpers import convert_from_wide_to_long +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.variant_index import VariantIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +def common_vep_feature_logic( + study_loci_to_annotate: L2GGoldStandard | StudyLocus, + *, + variant_index: VariantIndex, + feature_name: str, +) -> DataFrame: + """Extracts variant severity score computed from VEP. + + Args: + study_loci_to_annotate (L2GGoldStandard | StudyLocus): The dataset containing study loci that will be used for annotation + variant_index (VariantIndex): The dataset containing functional consequence information + feature_name (str): The name of the feature + + Returns: + DataFrame: Feature dataset + """ + # Variant/Target/Severity dataframe + consequences_dataset = variant_index.df.withColumn( + "transcriptConsequence", f.explode("transcriptConsequences") + ).select( + "variantId", + f.col("transcriptConsequence.targetId").alias("geneId"), + f.col("transcriptConsequence.consequenceScore").alias("severityScore"), + ) + if isinstance(study_loci_to_annotate, StudyLocus): + variants_df = ( + study_loci_to_annotate.df.withColumn( + "variantInLocus", f.explode_outer("locus") + ) + .select( + "studyLocusId", + f.col("variantInLocus.variantId").alias("variantId"), + f.col("variantInLocus.posteriorProbability").alias( + "posteriorProbability" + ), + ) + .join(consequences_dataset, "variantId") + ) + elif isinstance(study_loci_to_annotate, L2GGoldStandard): + variants_df = study_loci_to_annotate.df.select( + "studyLocusId", "variantId", f.lit(1.0).alias("posteriorProbability") + ).join(consequences_dataset, "variantId") + + if "Maximum" in feature_name: + agg_expr = f.max("severityScore") + elif "Mean" in feature_name: + variants_df = variants_df.withColumn( + "weightedScore", f.col("severityScore") * f.col("posteriorProbability") + ) + agg_expr = f.mean("weightedScore") + return variants_df.groupBy("studyLocusId", "geneId").agg( + agg_expr.alias(feature_name) + ) + + +def common_neighbourhood_vep_feature_logic( + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + *, + variant_index: VariantIndex, + gene_index: GeneIndex, + feature_name: str, +) -> DataFrame: + """Extracts variant severity score computed from VEP for any gene, based on what is the mean score for protein coding genes that are nearby the locus. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + variant_index (VariantIndex): The dataset containing functional consequence information + gene_index (GeneIndex): The dataset containing the gene biotype + feature_name (str): The name of the feature + + Returns: + DataFrame: Feature dataset + """ + local_feature_name = feature_name.replace("Neighbourhood", "") + local_metric = common_vep_feature_logic( + study_loci_to_annotate, + feature_name=local_feature_name, + variant_index=variant_index, + ).join( + # Bring gene classification + gene_index.df.select("geneId", "biotype"), + "geneId", + "inner", + ) + # Compute average score in the vicinity (feature will be the same for any gene associated with a studyLocus) + # (non protein coding genes in the vicinity are excluded see #3552) + regional_mean_per_study_locus = ( + local_metric.filter(f.col("biotype") == "protein_coding") + .groupBy("studyLocusId") + .agg(f.mean(local_feature_name).alias("regional_mean")) + ) + return ( + local_metric.join(regional_mean_per_study_locus, "studyLocusId", "left") + .withColumn( + feature_name, + f.col(local_feature_name) - f.coalesce(f.col("regional_mean"), f.lit(0.0)), + ) + .drop("regional_mean", local_feature_name, "biotype") + ) + + +class VepMaximumFeature(L2GFeature): + """Maximum functional consequence score among all variants in a credible set for a studyLocus/gene.""" + + feature_dependency_type = VariantIndex + feature_name = "vepMaximum" + + @classmethod + def compute( + cls: type[VepMaximumFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> VepMaximumFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the functional consequence information + + Returns: + VepMaximumFeature: Feature dataset + """ + return cls( + _df=convert_from_wide_to_long( + common_vep_feature_logic( + study_loci_to_annotate=study_loci_to_annotate, + feature_name=cls.feature_name, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class VepMaximumNeighbourhoodFeature(L2GFeature): + """Maximum functional consequence score among all variants in a credible set for a studyLocus/gene relative to the mean VEP score across all protein coding genes in the vicinity.""" + + feature_dependency_type = [VariantIndex, GeneIndex] + feature_name = "vepMaximumNeighbourhood" + + @classmethod + def compute( + cls: type[VepMaximumNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> VepMaximumNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the functional consequence information + + Returns: + VepMaximumNeighbourhoodFeature: Feature dataset + """ + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_vep_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class VepMeanFeature(L2GFeature): + """Average functional consequence score among all variants in a credible set for a studyLocus/gene. + + The mean severity score is weighted by the posterior probability of each variant. + """ + + feature_dependency_type = VariantIndex + feature_name = "vepMean" + + @classmethod + def compute( + cls: type[VepMeanFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> VepMeanFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the functional consequence information + + Returns: + VepMeanFeature: Feature dataset + """ + return cls( + _df=convert_from_wide_to_long( + common_vep_feature_logic( + study_loci_to_annotate=study_loci_to_annotate, + feature_name=cls.feature_name, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) + + +class VepMeanNeighbourhoodFeature(L2GFeature): + """Mean functional consequence score among all variants in a credible set for a studyLocus/gene relative to the mean VEP score across all protein coding genes in the vicinity. + + The mean severity score is weighted by the posterior probability of each variant. + """ + + feature_dependency_type = [VariantIndex, GeneIndex] + feature_name = "vepMeanNeighbourhood" + + @classmethod + def compute( + cls: type[VepMeanNeighbourhoodFeature], + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + feature_dependency: dict[str, Any], + ) -> VepMeanNeighbourhoodFeature: + """Computes the feature. + + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + feature_dependency (dict[str, Any]): Dataset that contains the functional consequence information + + Returns: + VepMeanNeighbourhoodFeature: Feature dataset + """ + return cls( + _df=convert_from_wide_to_long( + common_neighbourhood_vep_feature_logic( + study_loci_to_annotate, + feature_name=cls.feature_name, + **feature_dependency, + ), + id_vars=("studyLocusId", "geneId"), + var_name="featureName", + value_name="featureValue", + ), + _schema=cls.get_schema(), + ) diff --git a/src/gentropy/dataset/l2g_gold_standard.py b/src/gentropy/dataset/l2g_gold_standard.py index 5bc48413c..ec99f7141 100644 --- a/src/gentropy/dataset/l2g_gold_standard.py +++ b/src/gentropy/dataset/l2g_gold_standard.py @@ -1,4 +1,5 @@ """L2G gold standard dataset.""" + from __future__ import annotations from dataclasses import dataclass @@ -10,13 +11,15 @@ from gentropy.common.schemas import parse_spark_schema from gentropy.common.spark_helpers import get_record_with_maximum_value from gentropy.dataset.dataset import Dataset +from gentropy.dataset.study_locus import StudyLocus if TYPE_CHECKING: from pyspark.sql import DataFrame from pyspark.sql.types import StructType + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.study_locus_overlap import StudyLocusOverlap - from gentropy.dataset.v2g import V2G + from gentropy.dataset.variant_index import VariantIndex @dataclass @@ -31,16 +34,16 @@ class L2GGoldStandard(Dataset): def from_otg_curation( cls: type[L2GGoldStandard], gold_standard_curation: DataFrame, - v2g: V2G, study_locus_overlap: StudyLocusOverlap, + variant_index: VariantIndex, interactions: DataFrame, ) -> L2GGoldStandard: """Initialise L2GGoldStandard from source dataset. Args: gold_standard_curation (DataFrame): Gold standard curation dataframe, extracted from - v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS study_locus_overlap (StudyLocusOverlap): Study locus overlap dataset to remove duplicated loci + variant_index (VariantIndex): Dataset to bring distance between a variant and a gene's footprint interactions (DataFrame): Gene-gene interactions dataset to remove negative cases where the gene interacts with a positive gene Returns: @@ -53,8 +56,10 @@ def from_otg_curation( interactions_df = cls.process_gene_interactions(interactions) return ( - OpenTargetsL2GGoldStandard.as_l2g_gold_standard(gold_standard_curation, v2g) - # .filter_unique_associations(study_locus_overlap) + OpenTargetsL2GGoldStandard.as_l2g_gold_standard( + gold_standard_curation, variant_index + ) + .filter_unique_associations(study_locus_overlap) .remove_false_negatives(interactions_df) ) @@ -100,6 +105,38 @@ def process_gene_interactions( "scoring as score", ) + def build_feature_matrix( + self: L2GGoldStandard, + full_feature_matrix: L2GFeatureMatrix, + credible_set: StudyLocus, + ) -> L2GFeatureMatrix: + """Return a feature matrix for study loci in the gold standard. + + Args: + full_feature_matrix (L2GFeatureMatrix): Feature matrix for all study loci to join on + credible_set (StudyLocus): Full credible sets to annotate the feature matrix with variant and study IDs and perform the join + + Returns: + L2GFeatureMatrix: Feature matrix for study loci in the gold standard + """ + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix + + return L2GFeatureMatrix( + _df=full_feature_matrix._df.join( + credible_set.df.select("studyLocusId", "variantId", "studyId"), + "studyLocusId", + "left", + ) + .join( + f.broadcast(self.df.drop("studyLocusId", "sources")), + on=["studyId", "variantId", "geneId"], + how="inner", + ) + .drop("studyId", "variantId") + .distinct(), + with_gold_standard=True, + ).fill_na() + def filter_unique_associations( self: L2GGoldStandard, study_locus_overlap: StudyLocusOverlap, diff --git a/src/gentropy/dataset/l2g_prediction.py b/src/gentropy/dataset/l2g_prediction.py index e24688da3..64ce964c7 100644 --- a/src/gentropy/dataset/l2g_prediction.py +++ b/src/gentropy/dataset/l2g_prediction.py @@ -6,15 +6,14 @@ from typing import TYPE_CHECKING, Type import pyspark.sql.functions as f -from pyspark.ml.functions import vector_to_array +from pyspark.sql import DataFrame from gentropy.common.schemas import parse_spark_schema -from gentropy.dataset.colocalisation import Colocalisation +from gentropy.common.session import Session from gentropy.dataset.dataset import Dataset from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.study_index import StudyIndex from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.v2g import V2G from gentropy.method.l2g.model import LocusToGeneModel if TYPE_CHECKING: @@ -42,58 +41,139 @@ def get_schema(cls: type[L2GPrediction]) -> StructType: @classmethod def from_credible_set( cls: Type[L2GPrediction], - model_path: str, + session: Session, + credible_set: StudyLocus, + feature_matrix: L2GFeatureMatrix, features_list: list[str], - study_locus: StudyLocus, - study_index: StudyIndex, - v2g: V2G, - coloc: Colocalisation, + model_path: str | None, + hf_token: str | None = None, + download_from_hub: bool = True, ) -> L2GPrediction: """Extract L2G predictions for a set of credible sets derived from GWAS. Args: - model_path (str): Path to the fitted model + session (Session): Session object that contains the Spark session + credible_set (StudyLocus): Dataset containing credible sets from GWAS only + feature_matrix (L2GFeatureMatrix): Dataset containing all credible sets and their annotations features_list (list[str]): List of features to use for the model + model_path (str | None): Path to the model file. It can be either in the filesystem or the name on the Hugging Face Hub (in the form of username/repo_name). + hf_token (str | None): Hugging Face token to download the model from the Hub. Only required if the model is private. + download_from_hub (bool): Whether to download the model from the Hugging Face Hub. Defaults to True. + + Returns: + L2GPrediction: L2G scores for a set of credible sets. + """ + # Load the model + if download_from_hub: + # Model ID defaults to "opentargets/locus_to_gene" and it assumes the name of the classifier is "classifier.skops". + model_id = model_path or "opentargets/locus_to_gene" + l2g_model = LocusToGeneModel.load_from_hub(model_id, hf_token) + elif model_path: + l2g_model = LocusToGeneModel.load_from_disk(model_path) + + # Prepare data + fm = ( + L2GFeatureMatrix( + _df=( + credible_set.df.filter(f.col("studyType") == "gwas") + .select("studyLocusId") + .join(feature_matrix._df, "studyLocusId") + ) + ) + .fill_na() + .select_features(features_list) + ) + + return l2g_model.predict(fm, session) + + def to_disease_target_evidence( + self: L2GPrediction, + study_locus: StudyLocus, + study_index: StudyIndex, + l2g_threshold: float = 0.05, + ) -> DataFrame: + """Convert locus to gene predictions to disease target evidence. + + Args: study_locus (StudyLocus): Study locus dataset study_index (StudyIndex): Study index dataset - v2g (V2G): Variant to gene dataset - coloc (Colocalisation): Colocalisation dataset + l2g_threshold (float): Threshold to consider a gene as a target. Defaults to 0.05. Returns: - L2GPrediction: L2G dataset + DataFrame: Disease target evidence """ - fm = L2GFeatureMatrix.generate_features( - features_list=features_list, - study_locus=study_locus, - study_index=study_index, - variant_gene=v2g, - colocalisation=coloc, - ).fill_na() - - gwas_fm = L2GFeatureMatrix( - _df=( - fm.df.join( - study_locus.filter_by_study_type("gwas", study_index).df, - on="studyLocusId", - ) - ), - _schema=cls.get_schema(), + datasource_id = "gwas_credible_sets" + datatype_id = "genetic_association" + + return ( + self.df.filter(f.col("score") >= l2g_threshold) + .join( + study_locus.df.select("studyLocusId", "studyId"), + on="studyLocusId", + how="inner", + ) + .join( + study_index.df.select("studyId", "diseaseIds"), + on="studyId", + how="inner", + ) + .select( + f.lit(datatype_id).alias("datatypeId"), + f.lit(datasource_id).alias("datasourceId"), + f.col("geneId").alias("targetFromSourceId"), + f.explode(f.col("diseaseIds")).alias("diseaseFromSourceMappedId"), + f.col("score").alias("resourceScore"), + "studyLocusId", + ) + ) + + def add_locus_to_gene_features( + self: L2GPrediction, feature_matrix: L2GFeatureMatrix + ) -> L2GPrediction: + """Add features to the L2G predictions. + + Args: + feature_matrix (L2GFeatureMatrix): Feature matrix dataset + + Returns: + L2GPrediction: L2G predictions with additional features + """ + # Testing if `locusToGeneFeatures` column already exists: + if "locusToGeneFeatures" in self.df.columns: + self.df = self.df.drop("locusToGeneFeatures") + + # Columns identifying a studyLocus/gene pair + prediction_id_columns = ["studyLocusId", "geneId"] + + # L2G matrix columns to build the map: + columns_to_map = [ + column + for column in feature_matrix._df.columns + if column not in prediction_id_columns + ] + + # Aggregating all features into a single map column: + aggregated_features = ( + feature_matrix._df.withColumn( + "locusToGeneFeatures", + f.create_map( + *sum( + [ + (f.lit(colname), f.col(colname)) + for colname in columns_to_map + ], + (), + ) + ), + ) + # from the freshly created map, we filter out the null values + .withColumn( + "locusToGeneFeatures", + f.expr("map_filter(locusToGeneFeatures, (k, v) -> v is not null)"), + ) + .drop(*columns_to_map) ) return L2GPrediction( - # Load and apply fitted model - _df=( - LocusToGeneModel.load_from_disk( - model_path, - features_list=features_list, - ) - .predict(gwas_fm) - # the probability of the positive class is the second element inside the probability array - # - this is selected as the L2G probability - .select( - "studyLocusId", - "geneId", - vector_to_array(f.col("probability"))[1].alias("score"), - ) - ), - _schema=cls.get_schema(), + _df=self.df.join(aggregated_features, on=prediction_id_columns, how="left"), + _schema=self.get_schema(), ) diff --git a/src/gentropy/dataset/pairwise_ld.py b/src/gentropy/dataset/pairwise_ld.py new file mode 100644 index 000000000..b64592094 --- /dev/null +++ b/src/gentropy/dataset/pairwise_ld.py @@ -0,0 +1,106 @@ +"""Pairwise LD dataset.""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from math import sqrt +from typing import TYPE_CHECKING + +import numpy as np +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.common.schemas import parse_spark_schema +from gentropy.dataset.dataset import Dataset + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + +@dataclass +class PairwiseLD(Dataset): + """Pairwise variant correlation dataset. + + This class captures logic applied on pairwise linkage data + by validation ensuring data quality. + """ + + dimension: tuple[int, int] = field(init=False) + + def __post_init__(self: PairwiseLD) -> None: + """Validating the dataset upon creation. + + - Besides the schema, a pairwise LD table is expected have rows being a square number. + """ + row_count = self.df.count() + + assert ( + int(sqrt(row_count)) == sqrt(row_count) + ), f"The number of rows in a pairwise LD table has to be square. Got: {row_count}" + + self.dimension = (int(sqrt(row_count)), int(sqrt(row_count))) + self.validate_schema() + + @classmethod + def get_schema(cls: type[PairwiseLD]) -> StructType: + """Provide the schema for the StudyIndex dataset. + + Returns: + StructType: The schema of the StudyIndex dataset. + """ + return parse_spark_schema("pairwise_ld.json") + + def overlap_with_locus(self: PairwiseLD, locus_variants: list[str]) -> PairwiseLD: + """Subset pairwise LD table with locus. + + Args: + locus_variants (list[str]): List of variants found in the locus. + + Returns: + PairwiseLD: _description_ + """ + return PairwiseLD( + _df=( + self.df.filter( + f.col("variantIdI").isin(locus_variants) + & f.col("variantIdJ").isin(locus_variants) + ) + ), + _schema=PairwiseLD.get_schema(), + ) + + def r_to_numpy_matrix(self) -> np.ndarray: + """Convert pairwise LD to a numpy square matrix. + + Returns: + np.ndarray: 2D square matrix with r values. + """ + return np.array( + self.df.select( + f.split("variantIdI", "_")[1].cast(t.IntegerType()).alias("position_i"), + f.split("variantIdJ", "_")[1].cast(t.IntegerType()).alias("position_j"), + "r", + ) + .orderBy(f.col("position_i").asc(), f.col("position_j").asc()) + .select("r") + .collect() + ).reshape(self.dimension) + + def get_variant_list(self) -> list[str]: + """Return a list of unique variants from the dataset. + + Returns: + list[str]: list of variant identifiers sorted by position. + """ + return [ + row["variantId"] + for row in ( + self.df.select( + f.col("variantIdI").alias("variantId"), + f.split(f.col("variantIdI"), "_")[1] + .cast(t.IntegerType()) + .alias("position"), + ) + .orderBy(f.col("position").asc()) + .collect() + ) + ] diff --git a/src/gentropy/dataset/study_index.py b/src/gentropy/dataset/study_index.py index d048157d6..da310f6f1 100644 --- a/src/gentropy/dataset/study_index.py +++ b/src/gentropy/dataset/study_index.py @@ -1,22 +1,64 @@ """Study index dataset.""" + from __future__ import annotations import importlib.resources as pkg_resources import json from dataclasses import dataclass +from enum import Enum from itertools import chain from typing import TYPE_CHECKING from pyspark.sql import functions as f +from pyspark.sql.types import ArrayType, StringType, StructType +from pyspark.sql.window import Window from gentropy.assets import data from gentropy.common.schemas import parse_spark_schema +from gentropy.common.spark_helpers import convert_from_wide_to_long from gentropy.dataset.dataset import Dataset if TYPE_CHECKING: from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType + from gentropy.dataset.biosample_index import BiosampleIndex + from gentropy.dataset.gene_index import GeneIndex + + +class StudyQualityCheck(Enum): + """Study quality control options listing concerns on the quality of the study. + + Attributes: + UNRESOLVED_TARGET (str): Target/gene identifier could not match to reference - Labelling failing target. + UNRESOLVED_DISEASE (str): Disease identifier could not match to referece or retired identifier - labelling failing disease + UNKNOWN_STUDY_TYPE (str): Indicating the provided type of study is not supported. + UNKNOWN_BIOSAMPLE (str): Flagging if a biosample identifier is not found in the reference. + DUPLICATED_STUDY (str): Flagging if a study identifier is not unique. + SUMSTATS_NOT_AVAILABLE (str): Flagging if harmonized summary statistics are not available or empty. + NO_OT_CURATION (str): Flagging if a study has not been curated by Open Targets. + FAILED_MEAN_BETA_CHECK (str): Flagging if the mean beta QC check value is not within the expected range. + FAILED_PZ_CHECK (str): Flagging if the PZ QC check values are not within the expected range. + FAILED_GC_LAMBDA_CHECK (str): Flagging if the GC lambda value is not within the expected range. + SMALL_NUMBER_OF_SNPS (str): Flagging if the number of SNPs in the study is below the expected threshold. + """ + + UNRESOLVED_TARGET = "Target/gene identifier could not match to reference" + UNRESOLVED_DISEASE = "No valid disease identifier found" + UNKNOWN_STUDY_TYPE = "This type of study is not supported" + UNKNOWN_BIOSAMPLE = "Biosample identifier was not found in the reference" + DUPLICATED_STUDY = "The identifier of this study is not unique" + SUMSTATS_NOT_AVAILABLE = "Harmonized summary statistics are not available or empty" + NO_OT_CURATION = "GWAS Catalog study has not been curated by Open Targets" + FAILED_MEAN_BETA_CHECK = ( + "The mean beta QC check value is not within the expected range" + ) + FAILED_PZ_CHECK = "The PZ QC check values are not within the expected range" + FAILED_GC_LAMBDA_CHECK = "The GC lambda value is not within the expected range" + SMALL_NUMBER_OF_SNPS = ( + "The number of SNPs in the study is below the expected threshold" + ) + @dataclass class StudyIndex(Dataset): @@ -86,6 +128,24 @@ def get_schema(cls: type[StudyIndex]) -> StructType: """ return parse_spark_schema("study_index.json") + @classmethod + def get_QC_column_name(cls: type[StudyIndex]) -> str: + """Return the name of the quality control column. + + Returns: + str: The name of the quality control column. + """ + return "qualityControls" + + @classmethod + def get_QC_mappings(cls: type[StudyIndex]) -> dict[str, str]: + """Quality control flag to QC column category mappings. + + Returns: + dict[str, str]: Mapping between flag name and QC column category value. + """ + return {member.name: member.value for member in StudyQualityCheck} + @classmethod def aggregate_and_map_ancestries( cls: type[StudyIndex], discovery_samples: Column @@ -174,7 +234,7 @@ def is_quality_flagged(self: StudyIndex) -> Column: if "qualityControls" not in self.df.columns: return f.lit(False) else: - return f.size(self.df.qualityControls) != 0 + return f.size(self.df["qualityControls"]) != 0 def has_summarystats(self: StudyIndex) -> Column: """Return a boolean column indicating if a study has harmonized summary statistics. @@ -183,3 +243,507 @@ def has_summarystats(self: StudyIndex) -> Column: Column: True if the study has harmonized summary statistics. """ return self.df.hasSumstats + + def validate_unique_study_id(self: StudyIndex) -> StudyIndex: + """Validating the uniqueness of study identifiers and flagging duplicated studies. + + Returns: + StudyIndex: with flagged duplicated studies. + """ + return StudyIndex( + _df=self.df.withColumn( + "qualityControls", + self.update_quality_flag( + f.col("qualityControls"), + self.flag_duplicates(f.col("studyId")), + StudyQualityCheck.DUPLICATED_STUDY, + ), + ), + _schema=StudyIndex.get_schema(), + ) + + def _normalise_disease( + self: StudyIndex, + source_disease_column_name: str, + disease_column_name: str, + disease_map: DataFrame, + ) -> DataFrame: + """Normalising diseases in the study index. + + Given a reference disease map (containing all potential EFO ids with the corresponding reference disease ids), + this function maps all EFO ids in the study index to the reference disease ids. + + Args: + source_disease_column_name (str): The column name of the disease column to validate. + disease_column_name (str): The resulting disease column name that contains the validated ids. + disease_map (DataFrame): Reference dataframe with diseases + + Returns: + DataFrame: where the newly added diseaseIds column will contain the validated EFO identifiers. + """ + return ( + self.df + # Only validating studies with diseases: + .filter(f.size(f.col(source_disease_column_name)) > 0) + # Explode disease column: + .select( + "studyId", + "studyType", + f.explode_outer(source_disease_column_name).alias("efo"), + ) + # Join disease map: + .join(disease_map, on="efo", how="left") + .groupBy("studyId") + .agg( + f.collect_set(f.col("diseaseId")).alias(disease_column_name), + ) + ) + + def validate_disease(self: StudyIndex, disease_map: DataFrame) -> StudyIndex: + """Validate diseases in the study index dataset. + + Args: + disease_map (DataFrame): a dataframe with two columns (efo, diseaseId). + + Returns: + StudyIndex: where gwas studies are flagged where no valid disease id could be found. + """ + # Because the disease ids are not mandatory fields of the schema, we skip vaildation if these columns are not present: + if ("traitFromSourceMappedIds" not in self.df.columns) or ( + "backgroundTraitFromSourceMappedIds" not in self.df.columns + ): + return self + + # Disease Column names: + foreground_disease_column = "diseaseIds" + background_disease_column = "backgroundDiseaseIds" + + # If diseaseId in schema, we need to drop it: + drop_columns = [ + column + for column in self.df.columns + if column in [foreground_disease_column, background_disease_column] + ] + + if len(drop_columns) > 0: + self.df = self.df.drop(*drop_columns) + + # Normalise disease: + normalised_disease = self._normalise_disease( + "traitFromSourceMappedIds", foreground_disease_column, disease_map + ) + normalised_background_disease = self._normalise_disease( + "backgroundTraitFromSourceMappedIds", background_disease_column, disease_map + ) + + return StudyIndex( + _df=( + self.df.join(normalised_disease, on="studyId", how="left") + .join(normalised_background_disease, on="studyId", how="left") + # Updating disease columns: + .withColumn( + foreground_disease_column, + f.when( + f.col(foreground_disease_column).isNull(), f.array() + ).otherwise(f.col(foreground_disease_column)), + ) + .withColumn( + background_disease_column, + f.when( + f.col(background_disease_column).isNull(), f.array() + ).otherwise(f.col(background_disease_column)), + ) + # Flagging gwas studies where no valid disease is avilable: + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + # Flagging all gwas studies with no normalised disease: + (f.size(f.col(foreground_disease_column)) == 0) + & (f.col("studyType") == "gwas"), + StudyQualityCheck.UNRESOLVED_DISEASE, + ), + ) + ), + _schema=StudyIndex.get_schema(), + ) + + def validate_study_type(self: StudyIndex) -> StudyIndex: + """Validating study type and flag unsupported types. + + Returns: + StudyIndex: with flagged studies with unsupported type. + """ + validated_df = ( + self.df + # Flagging unsupported study types: + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + f.when( + (f.col("studyType") == "gwas") + | f.col("studyType").endswith("qtl"), + False, + ).otherwise(True), + StudyQualityCheck.UNKNOWN_STUDY_TYPE, + ), + ) + ) + return StudyIndex(_df=validated_df, _schema=StudyIndex.get_schema()) + + def validate_target(self: StudyIndex, target_index: GeneIndex) -> StudyIndex: + """Validating gene identifiers in the study index against the provided target index. + + Args: + target_index (GeneIndex): gene index containing the reference gene identifiers (Ensembl gene identifiers). + + Returns: + StudyIndex: with flagged studies if geneId could not be validated. + """ + gene_set = target_index.df.select("geneId", f.lit(True).alias("isIdFound")) + + # As the geneId is not a mandatory field of study index, we return if the column is not there: + if "geneId" not in self.df.columns: + return self + + validated_df = ( + self.df.join(gene_set, on="geneId", how="left") + .withColumn( + "isIdFound", + f.when( + (f.col("studyType") != "gwas") & f.col("isIdFound").isNull(), + f.lit(False), + ).otherwise(f.lit(True)), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~f.col("isIdFound"), + StudyQualityCheck.UNRESOLVED_TARGET, + ), + ) + .drop("isIdFound") + ) + + return StudyIndex(_df=validated_df, _schema=StudyIndex.get_schema()) + + def validate_biosample( + self: StudyIndex, biosample_index: BiosampleIndex + ) -> StudyIndex: + """Validating biosample identifiers in the study index against the provided biosample index. + + Args: + biosample_index (BiosampleIndex): Biosample index containing a reference of biosample identifiers e.g. cell types, tissues, cell lines, etc. + + Returns: + StudyIndex: where non-gwas studies are flagged if biosampleIndex could not be validated. + """ + biosample_set = biosample_index.df.select( + "biosampleId", f.lit(True).alias("isIdFound") + ) + + # If biosampleId in df, we need to drop it: + if "biosampleId" in self.df.columns: + self.df = self.df.drop("biosampleId") + + # As the biosampleFromSourceId is not a mandatory field of study index, we return if the column is not there: + if "biosampleFromSourceId" not in self.df.columns: + return self + + validated_df = ( + self.df.join( + biosample_set, + self.df.biosampleFromSourceId == biosample_set.biosampleId, + how="left", + ) + .withColumn( + "isIdFound", + f.when( + (f.col("studyType") != "gwas") & (f.col("isIdFound").isNull()), + f.lit(False), + ).otherwise(f.lit(True)), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~f.col("isIdFound"), + StudyQualityCheck.UNKNOWN_BIOSAMPLE, + ), + ) + .drop("isIdFound") + ) + + return StudyIndex(_df=validated_df, _schema=StudyIndex.get_schema()) + + def annotate_sumstats_qc( + self: StudyIndex, + sumstats_qc: DataFrame, + threshold_mean_beta: float = 0.05, + threshold_mean_diff_pz: float = 0.05, + threshold_se_diff_pz: float = 0.05, + threshold_min_gc_lambda: float = 0.7, + threshold_max_gc_lambda: float = 2.5, + threshold_min_n_variants: int = 2_000_000, + ) -> StudyIndex: + """Annotate summary stats QC information. + + Args: + sumstats_qc (DataFrame): containing summary statistics-based quality controls. + threshold_mean_beta (float): Threshold for mean beta check. Defaults to 0.05. + threshold_mean_diff_pz (float): Threshold for mean diff PZ check. Defaults to 0.05. + threshold_se_diff_pz (float): Threshold for SE diff PZ check. Defaults to 0.05. + threshold_min_gc_lambda (float): Minimum threshold for GC lambda check. Defaults to 0.7. + threshold_max_gc_lambda (float): Maximum threshold for GC lambda check. Defaults to 2.5. + threshold_min_n_variants (int): Minimum number of variants for SuSiE check. Defaults to 2_000_000. + + Returns: + StudyIndex: Updated study index with QC information + """ + # convert all columns in sumstats_qc dataframe in array of structs grouped by studyId + cols = [c for c in sumstats_qc.columns if c != "studyId"] + + studies = self.df + + melted_df = convert_from_wide_to_long( + sumstats_qc, + id_vars=["studyId"], + value_vars=cols, + var_name="QCCheckName", + value_name="QCCheckValue", + ) + + qc_df = ( + melted_df.groupBy("studyId") + .agg( + f.map_from_entries( + f.collect_list( + f.struct(f.col("QCCheckName"), f.col("QCCheckValue")) + ) + ).alias("sumStatQCValues") + ) + .select("studyId", "sumstatQCValues") + ) + + df = ( + studies.drop("sumStatQCValues", "hasSumstats") + .join( + qc_df.withColumn("hasSumstats", f.lit(True)), how="left", on="studyId" + ) + .withColumn("hasSumstats", f.coalesce(f.col("hasSumstats"), f.lit(False))) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~f.col("hasSumstats"), + StudyQualityCheck.SUMSTATS_NOT_AVAILABLE, + ), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~(f.abs(f.col("sumstatQCValues.mean_beta")) <= threshold_mean_beta), + StudyQualityCheck.FAILED_MEAN_BETA_CHECK, + ), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~( + ( + f.abs(f.col("sumstatQCValues.mean_diff_pz")) + <= threshold_mean_diff_pz + ) + & (f.col("sumstatQCValues.se_diff_pz") <= threshold_se_diff_pz) + ), + StudyQualityCheck.FAILED_PZ_CHECK, + ), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~( + (f.col("sumstatQCValues.gc_lambda") <= threshold_max_gc_lambda) + & ( + f.col("sumstatQCValues.gc_lambda") + >= threshold_min_gc_lambda + ) + ), + StudyQualityCheck.FAILED_GC_LAMBDA_CHECK, + ), + ) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + (f.col("sumstatQCValues.n_variants") < threshold_min_n_variants), + StudyQualityCheck.SMALL_NUMBER_OF_SNPS, + ), + ) + ) + + # Annotate study index with QC information: + return StudyIndex( + _df=df, + _schema=StudyIndex.get_schema(), + ) + + def deconvolute_studies(self: StudyIndex) -> StudyIndex: + """Deconvolute the study index dataset. + + When ingesting the study index dataset, the same studyId might be ingested from more than one source. + In such cases, the data needs to be merged and the quality control flags need to be combined. + + Returns: + StudyIndex: Deconvoluted study index dataset. + """ + # Windowing by study ID assume random order, but this is OK, because we are not selecting rows by a specific order. + study_id_window = Window.partitionBy("studyId").orderBy(f.rand()) + + # For certain aggregation, the full window is needed to be considered: + full_study_id_window = study_id_window.orderBy("studyId").rangeBetween( + Window.unboundedPreceding, Window.unboundedFollowing + ) + + # Temporary columns to drop at the end: + columns_to_drop = ["keepTopHit", "mostGranular", "rank"] + + return StudyIndex( + _df=( + self.df + # Initialising quality controls column, if not present: + .withColumn( + "qualityControls", + f.when( + f.col("qualityControls").isNull(), + f.array().cast(ArrayType(StringType())), + ).otherwise(f.col("qualityControls")), + ) + # Keeping top hit studies unless the same study is available from a summmary statistics source: + # This value will be set for all rows for the same `studyId`: + .withColumn( + "keepTopHit", + f.when( + f.array_contains( + f.collect_set(f.col("hasSumstats")).over( + full_study_id_window + ), + True, + ), + f.lit(False), + ).otherwise(True), + ) + # For studies without summary statistics, we remove the "Not curated by Open Targets" flag: + .withColumn( + "qualityControls", + f.when( + ~f.col("hasSumstats"), + f.array_remove( + f.col("qualityControls"), + StudyQualityCheck.NO_OT_CURATION.value, + ), + ).otherwise(f.col("qualityControls")), + ) + # If top hits are not kept, we remove the "sumstats not available" flag from all QC lists: + .withColumn( + "qualityControls", + f.when( + ~f.col("keepTopHit"), + f.array_remove( + f.col("qualityControls"), + StudyQualityCheck.SUMSTATS_NOT_AVAILABLE.value, + ), + ).otherwise(f.col("qualityControls")), + ) + # Then propagate quality checks for all sources of the same study: + .withColumn( + "qualityControls", + f.array_distinct( + f.flatten( + f.collect_set("qualityControls").over(full_study_id_window) + ) + ), + ) + # Propagating sumstatQCValues -> map, cannot be flatten: + .withColumn( + "sumstatQCValues", + f.first("sumstatQCValues", ignorenulls=True).over( + full_study_id_window + ), + ) + # Propagating analysisFlags: + .withColumn( + "analysisFlags", + f.flatten( + f.collect_list("analysisFlags").over(full_study_id_window) + ), + ) + # Propagating hasSumstatsFlag - if no flag, leave null: + .withColumn( + "hasSumstats", + f.when( + # There's a true: + f.array_contains( + f.collect_set("hasSumstats").over(full_study_id_window), + True, + ), + f.lit(True), + ).when( + # There's a false: + f.array_contains( + f.collect_set("hasSumstats").over(full_study_id_window), + False, + ), + f.lit(False), + ), + ) + # Propagating disease: when different sets of diseases available for the same study, + # we pick the shortest list, becasuse we assume, that is the most accurate disease assignment: + .withColumn( + "mostGranular", + f.size(f.col("traitFromSourceMappedIds")) + == f.min(f.size(f.col("traitFromSourceMappedIds"))).over( + full_study_id_window + ), + ) + # Remove less granular disease mappings: + .withColumn( + "traitFromSourceMappedIds", + f.when(f.col("mostGranular"), f.col("traitFromSourceMappedIds")), + ) + # Propagate mapped disease: + .withColumn( + "traitFromSourceMappedIds", + f.last(f.col("traitFromSourceMappedIds"), True).over( + full_study_id_window + ), + ) + # Repeating these steps for the `traitFromSource` column: + .withColumn( + "traitFromSource", + f.when(f.col("mostGranular"), f.col("traitFromSource")), + ) + # Propagate disease: + .withColumn( + "traitFromSource", + f.last(f.col("traitFromSource"), True).over(full_study_id_window), + ) + # Distinct study types are joined together into a string. So, if there's ambiguite, the study will be flagged when the study type is validated: + .withColumn( + "studyType", + f.concat_ws( + ",", f.collect_set("studyType").over(full_study_id_window) + ), + ) + # At this point, all studies in one window is expected to be identical. Let's just pick one: + .withColumn("rank", f.row_number().over(study_id_window)) + .filter(f.col("rank") == 1) + .drop(*columns_to_drop) + ), + _schema=StudyIndex.get_schema(), + ) diff --git a/src/gentropy/dataset/study_locus.py b/src/gentropy/dataset/study_locus.py index 1867dfa94..908c093b6 100644 --- a/src/gentropy/dataset/study_locus.py +++ b/src/gentropy/dataset/study_locus.py @@ -1,27 +1,62 @@ """Study locus dataset.""" + from __future__ import annotations from dataclasses import dataclass from enum import Enum from typing import TYPE_CHECKING +import numpy as np import pyspark.sql.functions as f +from pyspark.sql.types import ArrayType, FloatType, StringType +from gentropy.common.genomic_region import GenomicRegion, KnownGenomicRegions from gentropy.common.schemas import parse_spark_schema from gentropy.common.spark_helpers import ( calculate_neglog_pvalue, + create_empty_column_if_not_exists, + get_struct_field_schema, order_array_of_structs_by_field, ) +from gentropy.common.utils import get_logsum +from gentropy.config import WindowBasedClumpingStepConfig from gentropy.dataset.dataset import Dataset +from gentropy.dataset.study_index import StudyQualityCheck from gentropy.dataset.study_locus_overlap import StudyLocusOverlap +from gentropy.dataset.variant_index import VariantIndex from gentropy.method.clump import LDclumping if TYPE_CHECKING: from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.ld_index import LDIndex from gentropy.dataset.study_index import StudyIndex + from gentropy.dataset.summary_statistics import SummaryStatistics + from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader + + +class CredibleSetConfidenceClasses(Enum): + """Confidence assignments for credible sets, based on finemapping method and quality checks. + + List of confidence classes, from the highest to the lowest confidence level. + + Attributes: + FINEMAPPED_IN_SAMPLE_LD (str): SuSiE fine-mapped credible set with in-sample LD + FINEMAPPED_OUT_OF_SAMPLE_LD (str): SuSiE fine-mapped credible set with out-of-sample LD + PICSED_SUMMARY_STATS (str): PICS fine-mapped credible set extracted from summary statistics + PICSED_TOP_HIT (str): PICS fine-mapped credible set based on reported top hit + UNKNOWN (str): Unknown confidence, for credible sets which did not fit any of the above categories + """ + + FINEMAPPED_IN_SAMPLE_LD = "SuSiE fine-mapped credible set with in-sample LD" + FINEMAPPED_OUT_OF_SAMPLE_LD = "SuSiE fine-mapped credible set with out-of-sample LD" + PICSED_SUMMARY_STATS = ( + "PICS fine-mapped credible set extracted from summary statistics" + ) + PICSED_TOP_HIT = "PICS fine-mapped credible set based on reported top hit" + UNKNOWN = "Unknown confidence" class StudyLocusQualityCheck(Enum): @@ -36,9 +71,22 @@ class StudyLocusQualityCheck(Enum): PALINDROMIC_ALLELE_FLAG (str): Alleles are palindromic - cannot harmonize AMBIGUOUS_STUDY (str): Association with ambiguous study UNRESOLVED_LD (str): Variant not found in LD reference - LD_CLUMPED (str): Explained by a more significant variant in high LD (clumped) + LD_CLUMPED (str): Explained by a more significant variant in high LD + WINDOW_CLUMPED (str): Explained by a more significant variant in the same window NO_POPULATION (str): Study does not have population annotation to resolve LD NOT_QUALIFYING_LD_BLOCK (str): LD block does not contain variants at the required R^2 threshold + FLAGGED_STUDY (str): Study has quality control flag(s) + MISSING_STUDY (str): Flagging study loci if the study is not found in the study index as a reference + DUPLICATED_STUDYLOCUS_ID (str): Study-locus identifier is not unique + INVALID_VARIANT_IDENTIFIER (str): Flagging study loci where identifier of any tagging variant was not found in the variant index + TOP_HIT (str): Study locus from curated top hit + IN_MHC (str): Flagging study loci in the MHC region + REDUNDANT_PICS_TOP_HIT (str): Flagging study loci in studies with PICS results from summary statistics + EXPLAINED_BY_SUSIE (str): Study locus in region explained by a SuSiE credible set + ABNORMAL_PIPS (str): Flagging study loci with a sum of PIPs that are not in [0.99,1] + OUT_OF_SAMPLE_LD (str): Study locus finemapped without in-sample LD reference + INVALID_CHROMOSOME (str): Chromosome not in 1:22, X, Y, XY or MT + TOP_HIT_AND_SUMMARY_STATS (str): Curated top hit is flagged because summary statistics are available for study """ SUBSIGNIFICANT_FLAG = "Subsignificant p-value" @@ -49,11 +97,32 @@ class StudyLocusQualityCheck(Enum): PALINDROMIC_ALLELE_FLAG = "Palindrome alleles - cannot harmonize" AMBIGUOUS_STUDY = "Association with ambiguous study" UNRESOLVED_LD = "Variant not found in LD reference" - LD_CLUMPED = "Explained by a more significant variant in high LD (clumped)" + LD_CLUMPED = "Explained by a more significant variant in high LD" + WINDOW_CLUMPED = "Explained by a more significant variant in the same window" NO_POPULATION = "Study does not have population annotation to resolve LD" NOT_QUALIFYING_LD_BLOCK = ( "LD block does not contain variants at the required R^2 threshold" ) + FLAGGED_STUDY = "Study has quality control flag(s)" + MISSING_STUDY = "Study not found in the study index" + DUPLICATED_STUDYLOCUS_ID = "Non-unique study locus identifier" + INVALID_VARIANT_IDENTIFIER = ( + "Some variant identifiers of this locus were not found in variant index" + ) + IN_MHC = "MHC region" + REDUNDANT_PICS_TOP_HIT = ( + "PICS results from summary statistics available for this same study" + ) + TOP_HIT = "Study locus from curated top hit" + EXPLAINED_BY_SUSIE = "Study locus in region explained by a SuSiE credible set" + OUT_OF_SAMPLE_LD = "Study locus finemapped without in-sample LD reference" + ABNORMAL_PIPS = ( + "Study locus with a sum of PIPs that not in the expected range [0.99,1]" + ) + INVALID_CHROMOSOME = "Chromosome not in 1:22, X, Y, XY or MT" + TOP_HIT_AND_SUMMARY_STATS = ( + "Curated top hit is flagged because summary statistics are available for study" + ) class CredibleInterval(Enum): @@ -77,37 +146,385 @@ class StudyLocus(Dataset): This dataset captures associations between study/traits and a genetic loci as provided by finemapping methods. """ + def validate_study(self: StudyLocus, study_index: StudyIndex) -> StudyLocus: + """Flagging study loci if the corresponding study has issues. + + There are two different potential flags: + - flagged study: flagging locus if the study has quality control flags. + - study with summary statistics for top hit: flagging locus if the study has available summary statistics. + - missing study: flagging locus if the study was not found in the reference study index. + + Args: + study_index (StudyIndex): Study index to resolve study types. + + Returns: + StudyLocus: Updated study locus with quality control flags. + """ + # Quality controls is not a mandatory field in the study index schema, so we have to be ready to handle it: + qc_select_expression = ( + f.col("qualityControls") + if "qualityControls" in study_index.df.columns + else f.lit(None).cast(StringType()) + ) + + # The study Id of the study index needs to be kept, because we would not know which study was in the index after the left join: + study_flags = study_index.df.select( + f.col("studyId").alias("study_studyId"), + qc_select_expression.alias("study_qualityControls"), + ) + + return StudyLocus( + _df=( + self.df.join( + study_flags, f.col("studyId") == f.col("study_studyId"), "left" + ) + # Flagging loci with flagged studies - without propagating the actual flags: + .withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + f.size(f.col("study_qualityControls")) > 0, + StudyLocusQualityCheck.FLAGGED_STUDY, + ), + ) + # Flagging top-hits, where the study has available summary statistics: + .withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + # Condition is true, if the study has summary statistics available and the locus is a top hit: + f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.TOP_HIT.value, + ) + & ~f.array_contains( + f.col("study_qualityControls"), + StudyQualityCheck.SUMSTATS_NOT_AVAILABLE.value, + ), + StudyLocusQualityCheck.TOP_HIT_AND_SUMMARY_STATS, + ), + ) + # Flagging loci where no studies were found: + .withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + f.col("study_studyId").isNull(), + StudyLocusQualityCheck.MISSING_STUDY, + ), + ) + .drop("study_studyId", "study_qualityControls") + ), + _schema=self.get_schema(), + ) + + def annotate_study_type(self: StudyLocus, study_index: StudyIndex) -> StudyLocus: + """Gets study type from study index and adds it to study locus. + + Args: + study_index (StudyIndex): Study index to get study type. + + Returns: + StudyLocus: Updated study locus with study type. + """ + return StudyLocus( + _df=( + self.df.drop("studyType").join( + study_index.study_type_lut(), on="studyId", how="left" + ) + ), + _schema=self.get_schema(), + ) + + def validate_chromosome_label(self: StudyLocus) -> StudyLocus: + """Flagging study loci, where chromosome is coded not as 1:22, X, Y, Xy and MT. + + Returns: + StudyLocus: Updated study locus with quality control flags. + """ + # QC column might not be present in the variant index schema, so we have to be ready to handle it: + qc_select_expression = ( + f.col("qualityControls") + if "qualityControls" in self.df.columns + else f.lit(None).cast(ArrayType(StringType())) + ) + valid_chromosomes = [str(i) for i in range(1, 23)] + ["X", "Y", "XY", "MT"] + + return StudyLocus( + _df=( + self.df.withColumn( + "qualityControls", + self.update_quality_flag( + qc_select_expression, + ~f.col("chromosome").isin(valid_chromosomes), + StudyLocusQualityCheck.INVALID_CHROMOSOME, + ), + ) + ), + _schema=self.get_schema(), + ) + + def validate_variant_identifiers( + self: StudyLocus, variant_index: VariantIndex + ) -> StudyLocus: + """Flagging study loci, where tagging variant identifiers are not found in variant index. + + Args: + variant_index (VariantIndex): Variant index to resolve variant identifiers. + + Returns: + StudyLocus: Updated study locus with quality control flags. + """ + # QC column might not be present in the variant index schema, so we have to be ready to handle it: + qc_select_expression = ( + f.col("qualityControls") + if "qualityControls" in self.df.columns + else f.lit(None).cast(ArrayType(StringType())) + ) + + # Find out which study loci have variants not in the variant index: + flag = ( + self.df + # Exploding locus: + .select("studyLocusId", f.explode("locus").alias("locus")) + .select("studyLocusId", "locus.variantId") + # Join with variant index variants: + .join( + variant_index.df.select( + "variantId", f.lit(True).alias("inVariantIndex") + ), + on="variantId", + how="left", + ) + # Flagging variants not in the variant index: + .withColumn("inVariantIndex", f.col("inVariantIndex").isNotNull()) + # Flagging study loci with ANY variants not in the variant index: + .groupBy("studyLocusId") + .agg(f.collect_set("inVariantIndex").alias("inVariantIndex")) + .select( + "studyLocusId", + f.array_contains("inVariantIndex", False).alias("toFlag"), + ) + ) + + return StudyLocus( + _df=( + self.df.join(flag, on="studyLocusId", how="left") + .withColumn( + "qualityControls", + self.update_quality_flag( + qc_select_expression, + f.col("toFlag"), + StudyLocusQualityCheck.INVALID_VARIANT_IDENTIFIER, + ), + ) + .drop("toFlag") + ), + _schema=self.get_schema(), + ) + + def validate_lead_pvalue(self: StudyLocus, pvalue_cutoff: float) -> StudyLocus: + """Flag associations below significant threshold. + + Args: + pvalue_cutoff (float): association p-value cut-off + + Returns: + StudyLocus: Updated study locus with quality control flags. + """ + df = self.df + qc_colname = StudyLocus.get_QC_column_name() + if qc_colname not in self.df.columns: + df = self.df.withColumn( + qc_colname, + create_empty_column_if_not_exists( + qc_colname, + get_struct_field_schema(StudyLocus.get_schema(), qc_colname), + ), + ) + return StudyLocus( + _df=( + df.withColumn( + qc_colname, + # Because this QC might already run on the dataset, the unique set of flags is generated: + f.array_distinct( + self._qc_subsignificant_associations( + f.col("qualityControls"), + f.col("pValueMantissa"), + f.col("pValueExponent"), + pvalue_cutoff, + ) + ), + ) + ), + _schema=self.get_schema(), + ) + + def validate_unique_study_locus_id(self: StudyLocus) -> StudyLocus: + """Validating the uniqueness of study-locus identifiers and flagging duplicated studyloci. + + Returns: + StudyLocus: with flagged duplicated studies. + """ + return StudyLocus( + _df=self.df.withColumn( + "qualityControls", + self.update_quality_flag( + f.col("qualityControls"), + self.flag_duplicates(f.col("studyLocusId")), + StudyLocusQualityCheck.DUPLICATED_STUDYLOCUS_ID, + ), + ), + _schema=StudyLocus.get_schema(), + ) + @staticmethod - def _overlapping_peaks(credset_to_overlap: DataFrame) -> DataFrame: + def _qc_subsignificant_associations( + quality_controls_column: Column, + p_value_mantissa: Column, + p_value_exponent: Column, + pvalue_cutoff: float, + ) -> Column: + """Flag associations below significant threshold. + + Args: + quality_controls_column (Column): QC column + p_value_mantissa (Column): P-value mantissa column + p_value_exponent (Column): P-value exponent column + pvalue_cutoff (float): association p-value cut-off + + Returns: + Column: Updated QC column with flag. + + Examples: + >>> import pyspark.sql.types as t + >>> d = [{'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -7}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 5, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -9}] + >>> df = spark.createDataFrame(d, t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('p_value_mantissa', t.IntegerType()), t.StructField('p_value_exponent', t.IntegerType())])) + >>> df.withColumn('qc', StudyLocus._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) + +------------------------+----------------+----------------+ + |qc |p_value_mantissa|p_value_exponent| + +------------------------+----------------+----------------+ + |[Subsignificant p-value]|1 |-7 | + |[] |1 |-8 | + |[] |5 |-8 | + |[] |1 |-9 | + +------------------------+----------------+----------------+ + + + """ + return StudyLocus.update_quality_flag( + quality_controls_column, + calculate_neglog_pvalue(p_value_mantissa, p_value_exponent) + < f.lit(-np.log10(pvalue_cutoff)), + StudyLocusQualityCheck.SUBSIGNIFICANT_FLAG, + ) + + def qc_abnormal_pips( + self: StudyLocus, + sum_pips_lower_threshold: float = 0.99, + sum_pips_upper_threshold: float = 1.0001, # Set slightly above 1 to account for floating point errors + ) -> StudyLocus: + """Filter study-locus by sum of posterior inclusion probabilities to ensure that the sum of PIPs is within a given range. + + Args: + sum_pips_lower_threshold (float): Lower threshold for the sum of PIPs. + sum_pips_upper_threshold (float): Upper threshold for the sum of PIPs. + + Returns: + StudyLocus: Filtered study-locus dataset. + """ + # QC column might not be present so we have to be ready to handle it: + qc_select_expression = ( + f.col("qualityControls") + if "qualityControls" in self.df.columns + else f.lit(None).cast(ArrayType(StringType())) + ) + + flag = self.df.withColumn( + "sumPosteriorProbability", + f.aggregate( + f.col("locus"), + f.lit(0.0), + lambda acc, x: acc + x["posteriorProbability"], + ), + ).withColumn( + "pipOutOfRange", + f.when( + (f.col("sumPosteriorProbability") < sum_pips_lower_threshold) + | (f.col("sumPosteriorProbability") > sum_pips_upper_threshold), + True, + ).otherwise(False), + ) + + return StudyLocus( + _df=( + flag + # Flagging loci with failed studies: + .withColumn( + "qualityControls", + self.update_quality_flag( + qc_select_expression, + f.col("pipOutOfRange"), + StudyLocusQualityCheck.ABNORMAL_PIPS, + ), + ).drop("sumPosteriorProbability", "pipOutOfRange") + ), + _schema=self.get_schema(), + ) + + @staticmethod + def _overlapping_peaks( + credset_to_overlap: DataFrame, intra_study_overlap: bool = False + ) -> DataFrame: """Calculate overlapping signals (study-locus) between GWAS-GWAS and GWAS-Molecular trait. Args: credset_to_overlap (DataFrame): DataFrame containing at least `studyLocusId`, `studyType`, `chromosome` and `tagVariantId` columns. + intra_study_overlap (bool): When True, finds intra-study overlaps for credible set deduplication. Default is False. Returns: DataFrame: containing `leftStudyLocusId`, `rightStudyLocusId` and `chromosome` columns. """ # Reduce columns to the minimum to reduce the size of the dataframe credset_to_overlap = credset_to_overlap.select( - "studyLocusId", "studyType", "chromosome", "tagVariantId" + "studyLocusId", + "studyId", + "studyType", + "chromosome", + "region", + "tagVariantId", + ) + # Define join condition - if intra_study_overlap is True, finds overlaps within the same study. Otherwise finds gwas vs everything overlaps for coloc. + join_condition = ( + [ + f.col("left.studyId") == f.col("right.studyId"), + f.col("left.chromosome") == f.col("right.chromosome"), + f.col("left.tagVariantId") == f.col("right.tagVariantId"), + f.col("left.studyLocusId") > f.col("right.studyLocusId"), + f.col("left.region") != f.col("right.region"), + ] + if intra_study_overlap + else [ + f.col("left.chromosome") == f.col("right.chromosome"), + f.col("left.tagVariantId") == f.col("right.tagVariantId"), + (f.col("right.studyType") != "gwas") + | (f.col("left.studyLocusId") > f.col("right.studyLocusId")), + f.col("left.studyType") == f.lit("gwas"), + ] ) + return ( credset_to_overlap.alias("left") - .filter(f.col("studyType") == "gwas") - # Self join with complex condition. Left it's all gwas and right can be gwas or molecular trait + # Self join with complex condition. .join( credset_to_overlap.alias("right"), - on=[ - f.col("left.chromosome") == f.col("right.chromosome"), - f.col("left.tagVariantId") == f.col("right.tagVariantId"), - (f.col("right.studyType") != "gwas") - | (f.col("left.studyLocusId") > f.col("right.studyLocusId")), - ], + on=join_condition, how="inner", ) .select( f.col("left.studyLocusId").alias("leftStudyLocusId"), f.col("right.studyLocusId").alias("rightStudyLocusId"), + f.col("right.studyType").alias("rightStudyType"), f.col("left.chromosome").alias("chromosome"), ) .distinct() @@ -159,11 +576,13 @@ def _align_overlapping_tags( "rightStudyLocusId", "leftStudyLocusId", "tagVariantId", + "rightStudyType", ], how="outer", ).select( "leftStudyLocusId", "rightStudyLocusId", + "rightStudyType", "chromosome", "tagVariantId", f.struct( @@ -176,49 +595,54 @@ def _align_overlapping_tags( ) @staticmethod - def update_quality_flag( - qc: Column, flag_condition: Column, flag_text: StudyLocusQualityCheck - ) -> Column: - """Update the provided quality control list with a new flag if condition is met. + def assign_study_locus_id(uniqueness_defining_columns: list[str]) -> Column: + """Hashes the provided columns to extract a consistent studyLocusId. Args: - qc (Column): Array column with the current list of qc flags. - flag_condition (Column): This is a column of booleans, signing which row should be flagged - flag_text (StudyLocusQualityCheck): Text for the new quality control flag + uniqueness_defining_columns (list[str]): list of columns defining uniqueness Returns: - Column: Array column with the updated list of qc flags. + Column: column with a study locus ID + + Examples: + >>> df = spark.createDataFrame([("GCST000001", "1_1000_A_C", "SuSiE-inf"), ("GCST000002", "1_1000_A_C", "pics")]).toDF("studyId", "variantId", "finemappingMethod") + >>> df.withColumn("study_locus_id", StudyLocus.assign_study_locus_id(["studyId", "variantId", "finemappingMethod"])).show(truncate=False) + +----------+----------+-----------------+--------------------------------+ + |studyId |variantId |finemappingMethod|study_locus_id | + +----------+----------+-----------------+--------------------------------+ + |GCST000001|1_1000_A_C|SuSiE-inf |109804fe1e20c94231a31bafd71b566e| + |GCST000002|1_1000_A_C|pics |de310be4558e0482c9cc359c97d37773| + +----------+----------+-----------------+--------------------------------+ + """ - qc = f.when(qc.isNull(), f.array()).otherwise(qc) - return f.when( - flag_condition, - f.array_union(qc, f.array(f.lit(flag_text.value))), - ).otherwise(qc) + return Dataset.generate_identifier(uniqueness_defining_columns).alias( + "studyLocusId" + ) - @staticmethod - def assign_study_locus_id(study_id_col: Column, variant_id_col: Column) -> Column: - """Hashes a column with a variant ID and a study ID to extract a consistent studyLocusId. + @classmethod + def calculate_credible_set_log10bf(cls: type[StudyLocus], logbfs: Column) -> Column: + """Calculate Bayes factor for the entire credible set. The Bayes factor is calculated as the logsumexp of the logBF values of the variants in the locus. Args: - study_id_col (Column): column name with a study ID - variant_id_col (Column): column name with a variant ID + logbfs (Column): Array column with the logBF values of the variants in the locus. Returns: - Column: column with a study locus ID + Column: log10 Bayes factor for the entire credible set. Examples: - >>> df = spark.createDataFrame([("GCST000001", "1_1000_A_C"), ("GCST000002", "1_1000_A_C")]).toDF("studyId", "variantId") - >>> df.withColumn("study_locus_id", StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId"))).show() - +----------+----------+-------------------+ - | studyId| variantId| study_locus_id| - +----------+----------+-------------------+ - |GCST000001|1_1000_A_C|1553357789130151995| - |GCST000002|1_1000_A_C|-415050894682709184| - +----------+----------+-------------------+ + >>> spark.createDataFrame([([0.2, 0.1, 0.05, 0.0],)]).toDF("logBF").select(f.round(StudyLocus.calculate_credible_set_log10bf(f.col("logBF")), 7).alias("credibleSetlog10BF")).show() + +------------------+ + |credibleSetlog10BF| + +------------------+ + | 0.6412604| + +------------------+ """ - variant_id_col = f.coalesce(variant_id_col, f.rand().cast("string")) - return f.xxhash64(study_id_col, variant_id_col).alias("studyLocusId") + # log10=log/log(10)=log*0.43429448190325176 + logsumexp_udf = f.udf( + lambda x: (get_logsum(x) * 0.43429448190325176), FloatType() + ) + return logsumexp_udf(logbfs).cast("double").alias("credibleSetlog10BF") @classmethod def get_schema(cls: type[StudyLocus]) -> StructType: @@ -229,40 +653,29 @@ def get_schema(cls: type[StudyLocus]) -> StructType: """ return parse_spark_schema("study_locus.json") - def filter_by_study_type( - self: StudyLocus, study_type: str, study_index: StudyIndex - ) -> StudyLocus: - """Creates a new StudyLocus dataset filtered by study type. - - Args: - study_type (str): Study type to filter for. Can be one of `gwas`, `eqtl`, `pqtl`, `eqtl`. - study_index (StudyIndex): Study index to resolve study types. + @classmethod + def get_QC_column_name(cls: type[StudyLocus]) -> str: + """Quality control column. Returns: - StudyLocus: Filtered study-locus dataset. + str: Name of the quality control column. + """ + return "qualityControls" - Raises: - ValueError: If study type is not supported. + @classmethod + def get_QC_mappings(cls: type[StudyLocus]) -> dict[str, str]: + """Quality control flag to QC column category mappings. + + Returns: + dict[str, str]: Mapping between flag name and QC column category value. """ - if study_type not in ["gwas", "eqtl", "pqtl", "sqtl"]: - raise ValueError( - f"Study type {study_type} not supported. Supported types are: gwas, eqtl, pqtl, sqtl." - ) - new_df = ( - self.df.join(study_index.study_type_lut(), on="studyId", how="inner") - .filter(f.col("studyType") == study_type) - .drop("studyType") - ) - return StudyLocus( - _df=new_df, - _schema=self._schema, - ) + return {member.name: member.value for member in StudyLocusQualityCheck} def filter_credible_set( self: StudyLocus, credible_interval: CredibleInterval, ) -> StudyLocus: - """Filter study-locus tag variants based on given credible interval. + """Annotate and filter study-locus tag variants based on given credible interval. Args: credible_interval (CredibleInterval): Credible interval to filter for. @@ -270,34 +683,59 @@ def filter_credible_set( Returns: StudyLocus: Filtered study-locus dataset. """ - self.df = self._df.withColumn( - "locus", + return StudyLocus( + _df=self.annotate_credible_sets().df.withColumn( + "locus", + f.filter( + f.col("locus"), + lambda tag: (tag[credible_interval.value]), + ), + ), + _schema=self._schema, + ) + + @staticmethod + def filter_ld_set(ld_set: Column, r2_threshold: float) -> Column: + """Filter the LD set by a given R2 threshold. + + Args: + ld_set (Column): LD set + r2_threshold (float): R2 threshold to filter the LD set on + + Returns: + Column: Filtered LD index + """ + return f.when( + ld_set.isNotNull(), f.filter( - f.col("locus"), - lambda tag: (tag[credible_interval.value]), + ld_set, + lambda tag: tag["r2Overall"] >= r2_threshold, ), ) - return self - def find_overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverlap: + def find_overlaps( + self: StudyLocus, intra_study_overlap: bool = False + ) -> StudyLocusOverlap: """Calculate overlapping study-locus. Find overlapping study-locus that share at least one tagging variant. All GWAS-GWAS and all GWAS-Molecular traits are computed with the Molecular traits always appearing on the right side. Args: - study_index (StudyIndex): Study index to resolve study types. + intra_study_overlap (bool): If True, finds intra-study overlaps for credible set deduplication. Default is False. Returns: StudyLocusOverlap: Pairs of overlapping study-locus with aligned tags. """ loci_to_overlap = ( - self.df.join(study_index.study_type_lut(), on="studyId", how="inner") + self.df.filter(f.col("studyType").isNotNull()) .withColumn("locus", f.explode("locus")) .select( "studyLocusId", + "studyId", "studyType", "chromosome", + "region", f.col("locus.variantId").alias("tagVariantId"), f.col("locus.logBF").alias("logBF"), f.col("locus.posteriorProbability").alias("posteriorProbability"), @@ -309,7 +747,7 @@ def find_overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverla ) # overlapping study-locus - peak_overlaps = self._overlapping_peaks(loci_to_overlap) + peak_overlaps = self._overlapping_peaks(loci_to_overlap, intra_study_overlap) # study-locus overlap by aligning overlapping variants return self._align_overlapping_tags(loci_to_overlap, peak_overlaps) @@ -348,6 +786,28 @@ def neglog_pvalue(self: StudyLocus) -> Column: self.df.pValueExponent, ) + def build_feature_matrix( + self: StudyLocus, + features_list: list[str], + features_input_loader: L2GFeatureInputLoader, + ) -> L2GFeatureMatrix: + """Returns the feature matrix for a StudyLocus. + + Args: + features_list (list[str]): List of features to include in the feature matrix. + features_input_loader (L2GFeatureInputLoader): Feature input loader to use. + + Returns: + L2GFeatureMatrix: Feature matrix for this study-locus. + """ + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix + + return L2GFeatureMatrix.from_features_list( + self, + features_list, + features_input_loader, + ).fill_na() + def annotate_credible_sets(self: StudyLocus) -> StudyLocus: """Annotate study-locus dataset with credible set flags. @@ -403,21 +863,93 @@ def annotate_credible_sets(self: StudyLocus) -> StudyLocus: ) return self + def annotate_locus_statistics( + self: StudyLocus, + summary_statistics: SummaryStatistics, + collect_locus_distance: int, + ) -> StudyLocus: + """Annotates study locus with summary statistics in the specified distance around the position. + + Args: + summary_statistics (SummaryStatistics): Summary statistics to be used for annotation. + collect_locus_distance (int): distance from variant defining window for inclusion of variants in locus. + + Returns: + StudyLocus: Study locus annotated with summary statistics in `locus` column. If no statistics are found, the `locus` column will be empty. + """ + # The clumps will be used several times (persisting) + self.df.persist() + # Renaming columns: + sumstats_renamed = summary_statistics.df.selectExpr( + *[f"{col} as tag_{col}" for col in summary_statistics.df.columns] + ).alias("sumstat") + + locus_df = ( + sumstats_renamed + # Joining the two datasets together: + .join( + f.broadcast( + self.df.alias("clumped").select( + "position", "chromosome", "studyId", "studyLocusId" + ) + ), + on=[ + (f.col("sumstat.tag_studyId") == f.col("clumped.studyId")) + & (f.col("sumstat.tag_chromosome") == f.col("clumped.chromosome")) + & ( + f.col("sumstat.tag_position") + >= (f.col("clumped.position") - collect_locus_distance) + ) + & ( + f.col("sumstat.tag_position") + <= (f.col("clumped.position") + collect_locus_distance) + ) + ], + how="inner", + ) + .withColumn( + "locus", + f.struct( + f.col("tag_variantId").alias("variantId"), + f.col("tag_beta").alias("beta"), + f.col("tag_pValueMantissa").alias("pValueMantissa"), + f.col("tag_pValueExponent").alias("pValueExponent"), + f.col("tag_standardError").alias("standardError"), + ), + ) + .groupBy("studyLocusId") + .agg( + f.collect_list(f.col("locus")).alias("locus"), + ) + ) + + self.df = self.df.drop("locus").join( + locus_df, + on="studyLocusId", + how="left", + ) + + return self + def annotate_ld( - self: StudyLocus, study_index: StudyIndex, ld_index: LDIndex + self: StudyLocus, + study_index: StudyIndex, + ld_index: LDIndex, + r2_threshold: float = 0.0, ) -> StudyLocus: """Annotate LD information to study-locus. Args: study_index (StudyIndex): Study index to resolve ancestries. ld_index (LDIndex): LD index to resolve LD information. + r2_threshold (float): R2 threshold to filter the LD index. Default is 0.0. Returns: StudyLocus: Study locus annotated with ld information from LD index. """ from gentropy.method.ld import LDAnnotator - return LDAnnotator.ld_annotate(self, study_index, ld_index) + return LDAnnotator.ld_annotate(self, study_index, ld_index, r2_threshold) def clump(self: StudyLocus) -> StudyLocus: """Perform LD clumping of the studyLocus. @@ -427,11 +959,12 @@ def clump(self: StudyLocus) -> StudyLocus: Returns: StudyLocus: with empty credible sets for linked variants and QC flag. """ - self.df = ( + clumped_df = ( self.df.withColumn( "is_lead_linked", LDclumping._is_lead_linked( self.df.studyId, + self.df.chromosome, self.df.variantId, self.df.pValueExponent, self.df.pValueMantissa, @@ -452,8 +985,171 @@ def clump(self: StudyLocus) -> StudyLocus: ) .drop("is_lead_linked") ) + return StudyLocus( + _df=clumped_df, + _schema=self.get_schema(), + ) + + def exclude_region( + self: StudyLocus, region: GenomicRegion, exclude_overlap: bool = False + ) -> StudyLocus: + """Exclude a region from the StudyLocus dataset. + + Args: + region (GenomicRegion): genomic region object. + exclude_overlap (bool): If True, excludes StudyLocus windows with any overlap with the region. + + Returns: + StudyLocus: filtered StudyLocus object. + """ + if exclude_overlap: + filter_condition = ~( + (f.col("chromosome") == region.chromosome) + & ( + (f.col("locusStart") <= region.end) + & (f.col("locusEnd") >= region.start) + ) + ) + else: + filter_condition = ~( + (f.col("chromosome") == region.chromosome) + & ( + (f.col("position") >= region.start) + & (f.col("position") <= region.end) + ) + ) + + return StudyLocus( + _df=self.df.filter(filter_condition), + _schema=StudyLocus.get_schema(), + ) + + def qc_MHC_region(self: StudyLocus) -> StudyLocus: + """Adds qualityControl flag when lead overlaps with MHC region. + + Returns: + StudyLocus: including qualityControl flag if in MHC region. + """ + region = GenomicRegion.from_known_genomic_region(KnownGenomicRegions.MHC) + self.df = self.df.withColumn( + "qualityControls", + self.update_quality_flag( + f.col("qualityControls"), + ( + (f.col("chromosome") == region.chromosome) + & ( + (f.col("position") <= region.end) + & (f.col("position") >= region.start) + ) + ), + StudyLocusQualityCheck.IN_MHC, + ), + ) return self + def qc_redundant_top_hits_from_PICS(self: StudyLocus) -> StudyLocus: + """Flag associations from top hits when the study contains other PICS associations from summary statistics. + + This flag can be useful to identify top hits that should be explained by other associations in the study derived from the summary statistics. + + Returns: + StudyLocus: Updated study locus with redundant top hits flagged. + """ + studies_with_pics_sumstats = ( + self.df.filter(f.col("finemappingMethod") == "pics") + # Returns True if the study contains any PICS associations from summary statistics + .withColumn( + "hasPicsSumstats", + ~f.array_contains( + "qualityControls", StudyLocusQualityCheck.TOP_HIT.value + ), + ) + .groupBy("studyId") + .agg(f.max(f.col("hasPicsSumstats")).alias("studiesWithPicsSumstats")) + ) + + return StudyLocus( + _df=self.df.join(studies_with_pics_sumstats, on="studyId", how="left") + .withColumn( + "qualityControls", + self.update_quality_flag( + f.col("qualityControls"), + f.array_contains( + "qualityControls", StudyLocusQualityCheck.TOP_HIT.value + ) + & f.col("studiesWithPicsSumstats"), + StudyLocusQualityCheck.REDUNDANT_PICS_TOP_HIT, + ), + ) + .drop("studiesWithPicsSumstats"), + _schema=StudyLocus.get_schema(), + ) + + def qc_explained_by_SuSiE(self: StudyLocus) -> StudyLocus: + """Flag associations that are explained by SuSiE associations. + + Credible sets overlapping in the same region as a SuSiE credible set are flagged as explained by SuSiE. + + Returns: + StudyLocus: Updated study locus with SuSiE explained flags. + """ + # unique study-regions covered by SuSie credible sets + susie_study_regions = ( + self.filter(f.col("finemappingMethod") == "SuSiE-inf") + .df.select( + "studyId", + "chromosome", + "locusStart", + "locusEnd", + f.lit(True).alias("inSuSiE"), + ) + .distinct() + ) + + # non SuSiE credible sets (studyLocusId) overlapping in any variant with SuSiE locus + redundant_study_locus = ( + self.filter(f.col("finemappingMethod") != "SuSiE-inf") + .df.withColumn("l", f.explode("locus")) + .select( + "studyLocusId", + "studyId", + "chromosome", + f.split(f.col("l.variantId"), "_")[1].alias("tag_position"), + ) + .alias("study_locus") + .join( + susie_study_regions.alias("regions"), + how="inner", + on=[ + (f.col("study_locus.chromosome") == f.col("regions.chromosome")) + & (f.col("study_locus.studyId") == f.col("regions.studyId")) + & (f.col("study_locus.tag_position") >= f.col("regions.locusStart")) + & (f.col("study_locus.tag_position") <= f.col("regions.locusEnd")) + ], + ) + .select("studyLocusId", "inSuSiE") + .distinct() + ) + + return StudyLocus( + _df=( + self.df.join(redundant_study_locus, on="studyLocusId", how="left") + .withColumn( + "qualityControls", + self.update_quality_flag( + f.col("qualityControls"), + # credible set in SuSiE overlapping region + f.col("inSuSiE") + # credible set not based on SuSiE + & (f.col("finemappingMethod") != "SuSiE-inf"), + StudyLocusQualityCheck.EXPLAINED_BY_SUSIE, + ), + ) + .drop("inSuSiE") + ), + _schema=StudyLocus.get_schema(), + ) + def _qc_no_population(self: StudyLocus) -> StudyLocus: """Flag associations where the study doesn't have population information to resolve LD. @@ -473,3 +1169,146 @@ def _qc_no_population(self: StudyLocus) -> StudyLocus: ), ) return self + + def annotate_locus_statistics_boundaries( + self: StudyLocus, + summary_statistics: SummaryStatistics, + ) -> StudyLocus: + """Annotates study locus with summary statistics in the specified boundaries - locusStart and locusEnd. + + Args: + summary_statistics (SummaryStatistics): Summary statistics to be used for annotation. + + Returns: + StudyLocus: Study locus annotated with summary statistics in `locus` column. If no statistics are found, the `locus` column will be empty. + """ + # The clumps will be used several times (persisting) + self.df.persist() + # Renaming columns: + sumstats_renamed = summary_statistics.df.selectExpr( + *[f"{col} as tag_{col}" for col in summary_statistics.df.columns] + ).alias("sumstat") + + locus_df = ( + sumstats_renamed + # Joining the two datasets together: + .join( + f.broadcast( + self.df.alias("clumped").select( + "position", + "chromosome", + "studyId", + "studyLocusId", + "locusStart", + "locusEnd", + ) + ), + on=[ + (f.col("sumstat.tag_studyId") == f.col("clumped.studyId")) + & (f.col("sumstat.tag_chromosome") == f.col("clumped.chromosome")) + & (f.col("sumstat.tag_position") >= (f.col("clumped.locusStart"))) + & (f.col("sumstat.tag_position") <= (f.col("clumped.locusEnd"))) + ], + how="inner", + ) + .withColumn( + "locus", + f.struct( + f.col("tag_variantId").alias("variantId"), + f.col("tag_beta").alias("beta"), + f.col("tag_pValueMantissa").alias("pValueMantissa"), + f.col("tag_pValueExponent").alias("pValueExponent"), + f.col("tag_standardError").alias("standardError"), + ), + ) + .groupBy("studyLocusId") + .agg( + f.collect_list(f.col("locus")).alias("locus"), + ) + ) + + self.df = self.df.drop("locus").join( + locus_df, + on="studyLocusId", + how="left", + ) + + return self + + def window_based_clumping( + self: StudyLocus, + window_size: int = WindowBasedClumpingStepConfig().distance, + ) -> StudyLocus: + """Clump study locus by window size. + + Args: + window_size (int): Window size for clumping. + + Returns: + StudyLocus: Clumped study locus, where clumped associations are flagged. + """ + from gentropy.method.window_based_clumping import WindowBasedClumping + + return WindowBasedClumping.clump(self, window_size) + + def assign_confidence(self: StudyLocus) -> StudyLocus: + """Assign confidence to study locus. + + Returns: + StudyLocus: Study locus with confidence assigned. + """ + # Return self if the required columns are not in the dataframe: + if ( + "qualityControls" not in self.df.columns + or "finemappingMethod" not in self.df.columns + ): + return self + + # Assign confidence based on the presence of quality controls + df = self.df.withColumn( + "confidence", + f.when( + (f.col("finemappingMethod").isin(["SuSiE-inf", "SuSie"])) + & ( + ~f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.OUT_OF_SAMPLE_LD.value, + ) + ), + CredibleSetConfidenceClasses.FINEMAPPED_IN_SAMPLE_LD.value, + ) + .when( + (f.col("finemappingMethod").isin(["SuSiE-inf", "SuSie"])) + & ( + f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.OUT_OF_SAMPLE_LD.value, + ) + ), + CredibleSetConfidenceClasses.FINEMAPPED_OUT_OF_SAMPLE_LD.value, + ) + .when( + (f.col("finemappingMethod") == "pics") + & ( + ~f.array_contains( + f.col("qualityControls"), StudyLocusQualityCheck.TOP_HIT.value + ) + ), + CredibleSetConfidenceClasses.PICSED_SUMMARY_STATS.value, + ) + .when( + (f.col("finemappingMethod") == "pics") + & ( + f.array_contains( + f.col("qualityControls"), StudyLocusQualityCheck.TOP_HIT.value + ) + ), + CredibleSetConfidenceClasses.PICSED_TOP_HIT.value, + ) + .otherwise(CredibleSetConfidenceClasses.UNKNOWN.value), + ) + + return StudyLocus( + _df=df, + _schema=self.get_schema(), + ) diff --git a/src/gentropy/dataset/study_locus_overlap.py b/src/gentropy/dataset/study_locus_overlap.py index 5f839bd9c..d4faea4cc 100644 --- a/src/gentropy/dataset/study_locus_overlap.py +++ b/src/gentropy/dataset/study_locus_overlap.py @@ -1,16 +1,19 @@ """Study locus overlap index dataset.""" + from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING +import pyspark.sql.functions as f + from gentropy.common.schemas import parse_spark_schema from gentropy.dataset.dataset import Dataset if TYPE_CHECKING: + from pyspark.sql import DataFrame from pyspark.sql.types import StructType - from gentropy.dataset.study_index import StudyIndex from gentropy.dataset.study_locus import StudyLocus @@ -36,18 +39,48 @@ def get_schema(cls: type[StudyLocusOverlap]) -> StructType: @classmethod def from_associations( - cls: type[StudyLocusOverlap], study_locus: StudyLocus, study_index: StudyIndex + cls: type[StudyLocusOverlap], study_locus: StudyLocus ) -> StudyLocusOverlap: """Find the overlapping signals in a particular set of associations (StudyLocus dataset). Args: study_locus (StudyLocus): Study-locus associations to find the overlapping signals - study_index (StudyIndex): Study index to find the overlapping signals Returns: StudyLocusOverlap: Study-locus overlap dataset """ - return study_locus.find_overlaps(study_index) + return study_locus.find_overlaps() + + + def calculate_beta_ratio(self: StudyLocusOverlap) -> DataFrame: + """Calculate the beta ratio for the overlapping signals. + + Returns: + DataFrame: A dataframe containing left and right loci IDs, chromosome + and the average sign of the beta ratio + """ + return ( + # Unpack statistics column: + self.df.select("*", "statistics.*") + .drop("statistics") + # Drop any rows where the beta is null or zero + .filter( + f.col("left_beta").isNotNull() & + f.col("right_beta").isNotNull() & + (f.col("left_beta") != 0) & + (f.col("right_beta") != 0) + ) + # Calculate the beta ratio and get the sign, then calculate the average sign across all variants in the locus + .withColumn( + "betaRatioSign", + f.signum(f.col("left_beta") / f.col("right_beta")) + ) + # Aggregate beta signs: + .groupBy("leftStudyLocusId","rightStudyLocusId","chromosome") + .agg( + f.avg("betaRatioSign").alias("betaRatioSignAverage") + ) + ) def _convert_to_square_matrix(self: StudyLocusOverlap) -> StudyLocusOverlap: """Convert the dataset to a square matrix. @@ -60,7 +93,10 @@ def _convert_to_square_matrix(self: StudyLocusOverlap) -> StudyLocusOverlap: self.df.selectExpr( "leftStudyLocusId as rightStudyLocusId", "rightStudyLocusId as leftStudyLocusId", + "rightStudyType", "tagVariantId", + "chromosome", + "statistics", ) ).distinct(), _schema=self.get_schema(), diff --git a/src/gentropy/dataset/summary_statistics.py b/src/gentropy/dataset/summary_statistics.py index 442672c58..25edbeca7 100644 --- a/src/gentropy/dataset/summary_statistics.py +++ b/src/gentropy/dataset/summary_statistics.py @@ -1,4 +1,5 @@ """Summary satistics dataset.""" + from __future__ import annotations from dataclasses import dataclass @@ -6,10 +7,11 @@ import pyspark.sql.functions as f +from gentropy.common.genomic_region import GenomicRegion from gentropy.common.schemas import parse_spark_schema -from gentropy.common.utils import parse_region, split_pvalue +from gentropy.common.utils import split_pvalue +from gentropy.config import LocusBreakerClumpingConfig, WindowBasedClumpingStepConfig from gentropy.dataset.dataset import Dataset -from gentropy.method.window_based_clumping import WindowBasedClumping if TYPE_CHECKING: from pyspark.sql.types import StructType @@ -57,60 +59,114 @@ def pvalue_filter(self: SummaryStatistics, pvalue: float) -> SummaryStatistics: def window_based_clumping( self: SummaryStatistics, - distance: int = 500_000, - gwas_significance: float = 5e-8, - baseline_significance: float = 0.05, - locus_collect_distance: int | None = None, + distance: int = WindowBasedClumpingStepConfig().distance, + gwas_significance: float = WindowBasedClumpingStepConfig().gwas_significance, ) -> StudyLocus: - """Generate study-locus from summary statistics by distance based clumping + collect locus. + """Generate study-locus from summary statistics using window-based clumping. + + For more info, see [`WindowBasedClumping`][gentropy.method.window_based_clumping.WindowBasedClumping] Args: distance (int): Distance in base pairs to be used for clumping. Defaults to 500_000. gwas_significance (float, optional): GWAS significance threshold. Defaults to 5e-8. - baseline_significance (float, optional): Baseline significance threshold for inclusion in the locus. Defaults to 0.05. - locus_collect_distance (int | None): The distance to collect locus around semi-indices. If not provided, locus is not collected. Returns: - StudyLocus: Clumped study-locus containing variants based on window. + StudyLocus: Clumped study-locus optionally containing variants based on window. + Check WindowBasedClumpingStepConfig object for default values. """ - return ( - WindowBasedClumping.clump_with_locus( - self, - window_length=distance, - p_value_significance=gwas_significance, - p_value_baseline=baseline_significance, - locus_window_length=locus_collect_distance, - ) - if locus_collect_distance - else WindowBasedClumping.clump( - self, - window_length=distance, - p_value_significance=gwas_significance, - ) + from gentropy.method.window_based_clumping import WindowBasedClumping + + return WindowBasedClumping.clump( + # Before clumping, we filter the summary statistics by p-value: + self.pvalue_filter(gwas_significance), + distance=distance, + # After applying the clumping, we filter the clumped loci by the flag: + ).valid_rows(["WINDOW_CLUMPED"]) + + def locus_breaker_clumping( + self: SummaryStatistics, + baseline_pvalue_cutoff: float = LocusBreakerClumpingConfig.lbc_baseline_pvalue, + distance_cutoff: int = LocusBreakerClumpingConfig.lbc_distance_cutoff, + pvalue_cutoff: float = LocusBreakerClumpingConfig.lbc_pvalue_threshold, + flanking_distance: int = LocusBreakerClumpingConfig.lbc_flanking_distance, + ) -> StudyLocus: + """Generate study-locus from summary statistics using locus-breaker clumping method with locus boundaries. + + For more info, see [`locus_breaker`][gentropy.method.locus_breaker_clumping.LocusBreakerClumping] + + Args: + baseline_pvalue_cutoff (float, optional): Baseline significance we consider for the locus. + distance_cutoff (int, optional): Distance in base pairs to be used for clumping. + pvalue_cutoff (float, optional): GWAS significance threshold. + flanking_distance (int, optional): Flank distance in base pairs to be used for clumping. + + Returns: + StudyLocus: Clumped study-locus optionally containing variants based on window. + Check LocusBreakerClumpingConfig object for default values. + """ + from gentropy.method.locus_breaker_clumping import LocusBreakerClumping + + return LocusBreakerClumping.locus_breaker( + self, + baseline_pvalue_cutoff, + distance_cutoff, + pvalue_cutoff, + flanking_distance, ) - def exclude_region(self: SummaryStatistics, region: str) -> SummaryStatistics: + def exclude_region( + self: SummaryStatistics, region: GenomicRegion + ) -> SummaryStatistics: """Exclude a region from the summary stats dataset. Args: - region (str): region given in "chr##:#####-####" format + region (GenomicRegion): Genomic region to be excluded. Returns: SummaryStatistics: filtered summary statistics. """ - (chromosome, start_position, end_position) = parse_region(region) - return SummaryStatistics( _df=( self.df.filter( ~( - (f.col("chromosome") == chromosome) + (f.col("chromosome") == region.chromosome) & ( - (f.col("position") >= start_position) - & (f.col("position") <= end_position) + (f.col("position") >= region.start) + & (f.col("position") <= region.end) ) ) ) ), _schema=SummaryStatistics.get_schema(), ) + + def sanity_filter(self: SummaryStatistics) -> SummaryStatistics: + """The function filters the summary statistics by sanity filters. + + The function filters the summary statistics by the following filters: + - The p-value should be less than 1. + - The pValueMantissa should be greater than 0. + - The beta should not be equal 0. + - The p-value, beta and se should not be NaN. + - The se should be positive. + - The beta and se should not be infinite. + + Returns: + SummaryStatistics: The filtered summary statistics. + """ + gwas_df = self._df + gwas_df = gwas_df.dropna( + subset=["beta", "standardError", "pValueMantissa", "pValueExponent"] + ) + gwas_df = gwas_df.filter((f.col("beta") != 0) & (f.col("standardError") > 0)) + gwas_df = gwas_df.filter( + (f.col("pValueMantissa") * 10 ** f.col("pValueExponent") < 1) + & (f.col("pValueMantissa") > 0) + ) + cols = ["beta", "standardError"] + summary_stats = SummaryStatistics( + _df=gwas_df, + _schema=SummaryStatistics.get_schema(), + ).drop_infinity_values(*cols) + + return summary_stats diff --git a/src/gentropy/dataset/v2g.py b/src/gentropy/dataset/v2g.py deleted file mode 100644 index 04bad2113..000000000 --- a/src/gentropy/dataset/v2g.py +++ /dev/null @@ -1,51 +0,0 @@ -"""V2G dataset.""" -from __future__ import annotations - -from dataclasses import dataclass -from typing import TYPE_CHECKING - -import pyspark.sql.functions as f - -from gentropy.common.schemas import parse_spark_schema -from gentropy.dataset.dataset import Dataset - -if TYPE_CHECKING: - from pyspark.sql.types import StructType - - from gentropy.dataset.gene_index import GeneIndex - - -@dataclass -class V2G(Dataset): - """Variant-to-gene (V2G) evidence dataset. - - A variant-to-gene (V2G) evidence is understood as any piece of evidence that supports the association of a variant with a likely causal gene. The evidence can sometimes be context-specific and refer to specific `biofeatures` (e.g. cell types) - """ - - @classmethod - def get_schema(cls: type[V2G]) -> StructType: - """Provides the schema for the V2G dataset. - - Returns: - StructType: Schema for the V2G dataset - """ - return parse_spark_schema("v2g.json") - - def filter_by_genes(self: V2G, genes: GeneIndex) -> V2G: - """Filter V2G dataset by genes. - - Args: - genes (GeneIndex): Gene index dataset to filter by - - Returns: - V2G: V2G dataset filtered by genes - """ - self.df = self._df.join(genes.df.select("geneId"), on="geneId", how="inner") - return self - - def extract_distance_tss_minimum(self: V2G) -> None: - """Extract minimum distance to TSS.""" - self.df = self._df.filter(f.col("distance")).withColumn( - "distanceTssMinimum", - f.expr("min(distTss) OVER (PARTITION BY studyLocusId)"), - ) diff --git a/src/gentropy/dataset/variant_annotation.py b/src/gentropy/dataset/variant_annotation.py deleted file mode 100644 index 4854a7edd..000000000 --- a/src/gentropy/dataset/variant_annotation.py +++ /dev/null @@ -1,227 +0,0 @@ -"""Variant annotation dataset.""" -from __future__ import annotations - -from dataclasses import dataclass -from typing import TYPE_CHECKING - -import pyspark.sql.functions as f - -from gentropy.common.schemas import parse_spark_schema -from gentropy.common.spark_helpers import ( - get_record_with_maximum_value, - normalise_column, -) -from gentropy.dataset.dataset import Dataset -from gentropy.dataset.v2g import V2G - -if TYPE_CHECKING: - from pyspark.sql import Column, DataFrame - from pyspark.sql.types import StructType - - from gentropy.dataset.gene_index import GeneIndex - - -@dataclass -class VariantAnnotation(Dataset): - """Dataset with variant-level annotations.""" - - @classmethod - def get_schema(cls: type[VariantAnnotation]) -> StructType: - """Provides the schema for the VariantAnnotation dataset. - - Returns: - StructType: Schema for the VariantAnnotation dataset - """ - return parse_spark_schema("variant_annotation.json") - - def max_maf(self: VariantAnnotation) -> Column: - """Maximum minor allele frequency accross all populations. - - Returns: - Column: Maximum minor allele frequency accross all populations. - """ - return f.array_max( - f.transform( - self.df.alleleFrequencies, - lambda af: f.when( - af.alleleFrequency > 0.5, 1 - af.alleleFrequency - ).otherwise(af.alleleFrequency), - ) - ) - - def filter_by_variant_df( - self: VariantAnnotation, df: DataFrame - ) -> VariantAnnotation: - """Filter variant annotation dataset by a variant dataframe. - - Args: - df (DataFrame): A dataframe of variants - - Returns: - VariantAnnotation: A filtered variant annotation dataset - """ - self.df = self._df.join( - f.broadcast(df.select("variantId", "chromosome")), - on=["variantId", "chromosome"], - how="inner", - ) - return self - - def get_transcript_consequence_df( - self: VariantAnnotation, gene_index: GeneIndex | None = None - ) -> DataFrame: - """Dataframe of exploded transcript consequences. - - Optionally the trancript consequences can be reduced to the universe of a gene index. - - Args: - gene_index (GeneIndex | None): A gene index. Defaults to None. - - Returns: - DataFrame: A dataframe exploded by transcript consequences with the columns variantId, chromosome, transcriptConsequence - """ - # exploding the array removes records without VEP annotation - transript_consequences = self.df.withColumn( - "transcriptConsequence", f.explode("vep.transcriptConsequences") - ).select( - "variantId", - "chromosome", - "position", - "transcriptConsequence", - f.col("transcriptConsequence.geneId").alias("geneId"), - ) - if gene_index: - transript_consequences = transript_consequences.join( - f.broadcast(gene_index.df), - on=["chromosome", "geneId"], - ) - return transript_consequences.persist() - - def get_most_severe_vep_v2g( - self: VariantAnnotation, - vep_consequences: DataFrame, - gene_index: GeneIndex, - ) -> V2G: - """Creates a dataset with variant to gene assignments based on VEP's predicted consequence of the transcript. - - Optionally the trancript consequences can be reduced to the universe of a gene index. - - Args: - vep_consequences (DataFrame): A dataframe of VEP consequences - gene_index (GeneIndex): A gene index to filter by. Defaults to None. - - Returns: - V2G: High and medium severity variant to gene assignments - """ - return V2G( - _df=self.get_transcript_consequence_df(gene_index) - .select( - "variantId", - "chromosome", - f.col("transcriptConsequence.geneId").alias("geneId"), - f.explode("transcriptConsequence.consequenceTerms").alias("label"), - f.lit("vep").alias("datatypeId"), - f.lit("variantConsequence").alias("datasourceId"), - ) - .join( - f.broadcast(vep_consequences), - on="label", - how="inner", - ) - .drop("label") - .filter(f.col("score") != 0) - # A variant can have multiple predicted consequences on a transcript, the most severe one is selected - .transform( - lambda df: get_record_with_maximum_value( - df, ["variantId", "geneId"], "score" - ) - ), - _schema=V2G.get_schema(), - ) - - def get_plof_v2g(self: VariantAnnotation, gene_index: GeneIndex) -> V2G: - """Creates a dataset with variant to gene assignments with a flag indicating if the variant is predicted to be a loss-of-function variant by the LOFTEE algorithm. - - Optionally the trancript consequences can be reduced to the universe of a gene index. - - Args: - gene_index (GeneIndex): A gene index to filter by. - - Returns: - V2G: variant to gene assignments from the LOFTEE algorithm - """ - return V2G( - _df=( - self.get_transcript_consequence_df(gene_index) - .filter(f.col("transcriptConsequence.lof").isNotNull()) - .withColumn( - "isHighQualityPlof", - f.when(f.col("transcriptConsequence.lof") == "HC", True).when( - f.col("transcriptConsequence.lof") == "LC", False - ), - ) - .withColumn( - "score", - f.when(f.col("isHighQualityPlof"), 1.0).when( - ~f.col("isHighQualityPlof"), 0 - ), - ) - .select( - "variantId", - "chromosome", - "geneId", - "isHighQualityPlof", - f.col("score"), - f.lit("vep").alias("datatypeId"), - f.lit("loftee").alias("datasourceId"), - ) - ), - _schema=V2G.get_schema(), - ) - - def get_distance_to_tss( - self: VariantAnnotation, - gene_index: GeneIndex, - max_distance: int = 500_000, - ) -> V2G: - """Extracts variant to gene assignments for variants falling within a window of a gene's TSS. - - Args: - gene_index (GeneIndex): A gene index to filter by. - max_distance (int): The maximum distance from the TSS to consider. Defaults to 500_000. - - Returns: - V2G: variant to gene assignments with their distance to the TSS - """ - return V2G( - _df=( - self.df.alias("variant") - .join( - f.broadcast(gene_index.locations_lut()).alias("gene"), - on=[ - f.col("variant.chromosome") == f.col("gene.chromosome"), - f.abs(f.col("variant.position") - f.col("gene.tss")) - <= max_distance, - ], - how="inner", - ) - .withColumn( - "distance", f.abs(f.col("variant.position") - f.col("gene.tss")) - ) - .withColumn( - "inverse_distance", - max_distance - f.col("distance"), - ) - .transform(lambda df: normalise_column(df, "inverse_distance", "score")) - .select( - "variantId", - f.col("variant.chromosome").alias("chromosome"), - "distance", - "geneId", - "score", - f.lit("distance").alias("datatypeId"), - f.lit("canonical_tss").alias("datasourceId"), - ) - ), - _schema=V2G.get_schema(), - ) diff --git a/src/gentropy/dataset/variant_index.py b/src/gentropy/dataset/variant_index.py index 4bafbc288..9e8740aa6 100644 --- a/src/gentropy/dataset/variant_index.py +++ b/src/gentropy/dataset/variant_index.py @@ -1,78 +1,300 @@ -"""Variant index dataset.""" +"""Dataset definition for variant index.""" + from __future__ import annotations -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING import pyspark.sql.functions as f +import pyspark.sql.types as t from gentropy.common.schemas import parse_spark_schema -from gentropy.common.spark_helpers import nullify_empty_array +from gentropy.common.spark_helpers import ( + get_nested_struct_schema, + rename_all_columns, + safe_array_union, +) from gentropy.dataset.dataset import Dataset -from gentropy.dataset.study_locus import StudyLocus if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType - from gentropy.dataset.variant_annotation import VariantAnnotation - @dataclass class VariantIndex(Dataset): - """Variant index dataset. + """Dataset for representing variants and methods applied on them.""" + + id_threshold: int = field(default=300) + + def __post_init__(self: VariantIndex) -> None: + """Forcing the presence of empty arrays even if the schema allows missing values. + + To bring in annotations from other sources, we use the `array_union()` function. However it assumes + both columns have arrays (not just the array schema!). If one of the array is null, the union + is nullified. This needs to be avoided. + """ + # Calling dataset's post init to validate schema: + super().__post_init__() + + # Composing a list of expressions to replace nulls with empty arrays if the schema assumes: + array_columns = { + column.name: f.when(f.col(column.name).isNull(), f.array()).otherwise( + f.col(column.name) + ) + for column in self.df.schema + if "ArrayType" in column.dataType.__str__() + } - Variant index dataset is the result of intersecting the variant annotation dataset with the variants with V2D available information. - """ + # Not returning, but changing the data: + self.df = self.df.withColumns(array_columns).withColumn( + # Hashing long variant identifiers: + "variantId", + self.hash_long_variant_ids( + f.col("variantId"), + f.col("chromosome"), + f.col("position"), + self.id_threshold, + ), + ) @classmethod def get_schema(cls: type[VariantIndex]) -> StructType: - """Provides the schema for the VariantIndex dataset. + """Provides the schema for the variant index dataset. Returns: StructType: Schema for the VariantIndex dataset """ return parse_spark_schema("variant_index.json") - @classmethod - def from_variant_annotation( - cls: type[VariantIndex], - variant_annotation: VariantAnnotation, - study_locus: StudyLocus, - ) -> VariantIndex: - """Initialise VariantIndex from pre-existing variant annotation dataset. + @staticmethod + def hash_long_variant_ids( + variant_id: Column, chromosome: Column, position: Column, threshold: int + ) -> Column: + """Hash long variant identifiers. Args: - variant_annotation (VariantAnnotation): Variant annotation dataset - study_locus (StudyLocus): Study locus dataset with the variants to intersect with the variant annotation dataset + variant_id (Column): Column containing variant identifiers. + chromosome (Column): Chromosome column. + position (Column): position column. + threshold (int): Above this limit, a hash will be generated. Returns: - VariantIndex: Variant index dataset + Column: Hashed variant identifiers for long variants. + + Examples: + >>> ( + ... spark.createDataFrame([('v_short', 'x', 23),('v_looooooong', '23', 23), ('no_chrom', None, None), (None, None, None)], ['variantId', 'chromosome', 'position']) + ... .select('variantId', VariantIndex.hash_long_variant_ids(f.col('variantId'), f.col('chromosome'), f.col('position'), 10).alias('hashedVariantId')) + ... .show(truncate=False) + ... ) + +------------+--------------------------------------------+ + |variantId |hashedVariantId | + +------------+--------------------------------------------+ + |v_short |v_short | + |v_looooooong|OTVAR_23_23_3749d019d645894770c364992ae70a05| + |no_chrom |OTVAR_41acfcd7d4fd523b33600b504914ef25 | + |null |null | + +------------+--------------------------------------------+ + """ - unchanged_cols = [ - "variantId", - "chromosome", - "position", - "referenceAllele", - "alternateAllele", - "chromosomeB37", - "positionB37", - "alleleType", - "alleleFrequencies", - "inSilicoPredictors", - ] - va_slimmed = variant_annotation.filter_by_variant_df( - study_locus.unique_variants_in_locus() + return ( + # If either the position or the chromosome is missing, we hash the identifier: + f.when( + chromosome.isNull() | position.isNull(), + f.concat( + f.lit("OTVAR_"), + f.md5(variant_id).cast("string"), + ), + ) + # If chromosome and position are given, but alleles are too long, create hash: + .when( + f.length(variant_id) >= threshold, + f.concat_ws( + "_", + f.lit("OTVAR"), + chromosome, + position, + f.md5(variant_id).cast("string"), + ), + ) + # Missing and regular variant identifiers are left unchanged: + .otherwise(variant_id) ) - return cls( + + def add_annotation( + self: VariantIndex, annotation_source: VariantIndex + ) -> VariantIndex: + """Import annotation from an other variant index dataset. + + At this point the annotation can be extended with extra cross-references, + in-silico predictions and allele frequencies. + + Args: + annotation_source (VariantIndex): Annotation to add to the dataset + + Returns: + VariantIndex: VariantIndex dataset with the annotation added + """ + # Prefix for renaming columns: + prefix = "annotation_" + + # Generate select expressions that to merge and import columns from annotation: + select_expressions = [] + + # Collect columns by iterating over the variant index schema: + for schema_field in VariantIndex.get_schema(): + column = schema_field.name + + # If an annotation column can be found in both datasets: + if (column in self.df.columns) and (column in annotation_source.df.columns): + # Arrays are merged: + if isinstance(schema_field.dataType, t.ArrayType): + fields_order = None + if isinstance(schema_field.dataType.elementType, t.StructType): + # Extract the schema of the array to get the order of the fields: + array_schema = [ + schema_field + for schema_field in VariantIndex.get_schema().fields + if schema_field.name == column + ][0].dataType + fields_order = get_nested_struct_schema( + array_schema + ).fieldNames() + select_expressions.append( + safe_array_union( + f.col(column), f.col(f"{prefix}{column}"), fields_order + ).alias(column) + ) + # Non-array columns are coalesced: + else: + select_expressions.append( + f.coalesce(f.col(column), f.col(f"{prefix}{column}")).alias( + column + ) + ) + # If the column is only found in the annotation dataset rename it: + elif column in annotation_source.df.columns: + select_expressions.append(f.col(f"{prefix}{column}").alias(column)) + # If the column is only found in the main dataset: + elif column in self.df.columns: + select_expressions.append(f.col(column)) + # VariantIndex columns not found in either dataset are ignored. + + # Join the annotation to the dataset: + return VariantIndex( _df=( - va_slimmed.df.select( - *unchanged_cols, - f.col("vep.mostSevereConsequence").alias("mostSevereConsequence"), - # filters/rsid are arrays that can be empty, in this case we convert them to null - nullify_empty_array(f.col("rsIds")).alias("rsIds"), + f.broadcast(self.df) + .join( + rename_all_columns(annotation_source.df, prefix), + on=[f.col("variantId") == f.col(f"{prefix}variantId")], + how="left", ) - .repartition(400, "chromosome") - .sortWithinPartitions("chromosome", "position") + .select(*select_expressions) + ), + _schema=self.schema, + ) + + def max_maf(self: VariantIndex) -> Column: + """Maximum minor allele frequency accross all populations assuming all variants biallelic. + + Returns: + Column: Maximum minor allele frequency accross all populations. + + Raises: + ValueError: Allele frequencies are not present in the dataset. + """ + if "alleleFrequencies" not in self.df.columns: + raise ValueError("Allele frequencies are not present in the dataset.") + + return f.array_max( + f.transform( + self.df.alleleFrequencies, + lambda af: f.when( + af.alleleFrequency > 0.5, 1 - af.alleleFrequency + ).otherwise(af.alleleFrequency), + ) + ) + + def filter_by_variant(self: VariantIndex, df: DataFrame) -> VariantIndex: + """Filter variant annotation dataset by a variant dataframe. + + Args: + df (DataFrame): A dataframe of variants + + Returns: + VariantIndex: A filtered variant annotation dataset + """ + join_columns = ["variantId", "chromosome"] + + assert all( + col in df.columns for col in join_columns + ), "The variant dataframe must contain the columns 'variantId' and 'chromosome'." + + return VariantIndex( + _df=self._df.join( + f.broadcast(df.select(*join_columns).distinct()), + on=join_columns, + how="inner", ), - _schema=cls.get_schema(), + _schema=self.schema, + ) + + def get_distance_to_gene( + self: VariantIndex, + *, + distance_type: str = "distanceFromTss", + max_distance: int = 500_000, + ) -> DataFrame: + """Extracts variant to gene assignments for variants falling within a window of a gene's TSS or footprint. + + Args: + distance_type (str): The type of distance to use. Can be "distanceFromTss" or "distanceFromFootprint". Defaults to "distanceFromTss". + max_distance (int): The maximum distance to consider. Defaults to 500_000, the default window size for VEP. + + Returns: + DataFrame: A dataframe with the distance between a variant and a gene's TSS or footprint. + + Raises: + ValueError: Invalid distance type. + """ + if distance_type not in {"distanceFromTss", "distanceFromFootprint"}: + raise ValueError( + f"Invalid distance_type: {distance_type}. Must be 'distanceFromTss' or 'distanceFromFootprint'." + ) + df = self.df.select( + "variantId", f.explode("transcriptConsequences").alias("tc") + ).select("variantId", "tc.targetId", f"tc.{distance_type}") + if max_distance == 500_000: + return df + elif max_distance < 500_000: + return df.filter(f"{distance_type} <= {max_distance}") + else: + raise ValueError( + f"max_distance must be less than 500_000. Got {max_distance}." + ) + + def get_loftee(self: VariantIndex) -> DataFrame: + """Returns a dataframe with a flag indicating whether a variant is predicted to cause loss of function in a gene. The source of this information is the LOFTEE algorithm (https://github.com/konradjk/loftee). + + !!! note, "This will return a filtered dataframe with only variants that have been annotated by LOFTEE." + + Returns: + DataFrame: variant to gene assignments from the LOFTEE algorithm + """ + return ( + self.df.select("variantId", f.explode("transcriptConsequences").alias("tc")) + .filter(f.col("tc.lofteePrediction").isNotNull()) + .withColumn( + "isHighQualityPlof", + f.when(f.col("tc.lofteePrediction") == "HC", True).when( + f.col("tc.lofteePrediction") == "LC", False + ), + ) + .select( + "variantId", + f.col("tc.targetId"), + f.col("tc.lofteePrediction"), + "isHighQualityPlof", + ) ) diff --git a/src/gentropy/datasource/biosample_ontologies/__init__.py b/src/gentropy/datasource/biosample_ontologies/__init__.py new file mode 100644 index 000000000..d3fa6b416 --- /dev/null +++ b/src/gentropy/datasource/biosample_ontologies/__init__.py @@ -0,0 +1,3 @@ +"""Biosample index data source.""" + +from __future__ import annotations diff --git a/src/gentropy/datasource/biosample_ontologies/utils.py b/src/gentropy/datasource/biosample_ontologies/utils.py new file mode 100644 index 000000000..2d9bb6bc4 --- /dev/null +++ b/src/gentropy/datasource/biosample_ontologies/utils.py @@ -0,0 +1,142 @@ +"""Utility functions for Biosample ontology processing.""" +import re + +from pyspark.sql import DataFrame, SparkSession +from pyspark.sql import functions as f +from pyspark.sql.types import ArrayType, StringType +from pyspark.sql.window import Window + +from gentropy.dataset.biosample_index import BiosampleIndex + + +def extract_ontology_from_json( + ontology_json : str, + spark : SparkSession +) -> BiosampleIndex: + """Extracts the ontology information from a JSON file. Currently only supports Uberon and Cell Ontology. + + Args: + ontology_json (str): Path to the JSON file containing the ontology information. + spark (SparkSession): Spark session. + + Returns: + BiosampleIndex: Parsed and annotated biosample index table. + """ + + def json_graph_traversal( + df : DataFrame, + node_col : str, + link_col: str, + traversal_type: str + ) -> DataFrame: + """Traverse a graph represented in a DataFrame to find all ancestors or descendants. + + Args: + df (DataFrame): DataFrame containing the graph data. + node_col (str): Column name for the node. + link_col (str): Column name for the link. + traversal_type (str): Type of traversal - "ancestors" or "descendants". + + Returns: + DataFrame: DataFrame with the result column added. + """ + # Collect graph data as a map + graph_map = df.select(node_col, link_col).rdd.collectAsMap() + broadcasted_graph = spark.sparkContext.broadcast(graph_map) + + def get_relationships( + node : str + ) -> list[str]: + """Get all relationships for a given node. + + Args: + node (str): Node ID. + + Returns: + list[str]: List of relationships. + """ + relationships = set() + stack = [node] + while stack: + current = stack.pop() + if current in broadcasted_graph.value: + current_links = broadcasted_graph.value[current] + stack.extend(current_links) + relationships.update(current_links) + return list(relationships) + + # Choose column name based on traversal type + result_col = "ancestors" if traversal_type == "ancestors" else "descendants" + + # Register the UDF based on traversal type + relationship_udf = f.udf(get_relationships, ArrayType(StringType())) + + # Apply the UDF to create the result column + return df.withColumn(result_col, relationship_udf(f.col(node_col))) + + # Load the JSON file + df = spark.read.json(ontology_json, multiLine=True) + + # Exploding the 'graphs' array to make individual records easier to access + df_graphs = df.select(f.explode_outer("graphs").alias("graph")) + + # Exploding the 'nodes' array within each graph + df_nodes = df_graphs.select( + f.col("graph.id").alias("graph_id"), + f.explode_outer("graph.nodes").alias("node")) + + # Exploding the 'edges' array within each graph for relationship data + df_edges = df_graphs.select( + f.col("graph.id").alias("graph_id"), + f.explode_outer("graph.edges").alias("edge") + ).select( + f.col("edge.sub").alias("subject"), + f.col("edge.pred").alias("predicate"), + f.col("edge.obj").alias("object") + ) + + # Remove certain URL prefixes from IDs + urls_to_remove = [ + "http://purl.obolibrary.org/obo/", + "http://www.ebi.ac.uk/efo/" + ] + # Create a regex pattern that matches any of the URLs + escaped_urls_pattern = "|".join([re.escape(url) for url in urls_to_remove]) + + + df_edges = df_edges.withColumn("subject", f.regexp_replace(f.col("subject"), escaped_urls_pattern, "")) + df_edges = df_edges.withColumn("object", f.regexp_replace(f.col("object"), escaped_urls_pattern, "")) + + # Extract the relevant information from the nodes + transformed_df = df_nodes.select( + f.regexp_replace(f.col("node.id"), escaped_urls_pattern, "").alias("biosampleId"), + f.coalesce(f.col("node.lbl"), f.col("node.id")).alias("biosampleName"), + f.col("node.meta.definition.val").alias("description"), + f.collect_set(f.col("node.meta.xrefs.val")).over(Window.partitionBy("node.id")).getItem(0).alias("xrefs"), + f.collect_set(f.col("node.meta.synonyms.val")).over(Window.partitionBy("node.id")).getItem(0).alias("synonyms")) + + + # Extract the relationships from the edges + # Prepare relationship-specific DataFrames + df_parents = df_edges.filter(f.col("predicate") == "is_a").select("subject", "object").withColumnRenamed("object", "parent") + df_children = df_edges.filter(f.col("predicate") == "is_a").select("object", "subject").withColumnRenamed("subject", "child") + + # Aggregate relationships back to nodes + df_parents_grouped = df_parents.groupBy("subject").agg(f.array_distinct(f.collect_list("parent")).alias("parents")) + df_children_grouped = df_children.groupBy("object").agg(f.array_distinct(f.collect_list("child")).alias("children")) + + # Get all ancestors + df_with_ancestors = json_graph_traversal(df_parents_grouped, "subject", "parents", "ancestors") + # Get all descendants + df_with_descendants = json_graph_traversal(df_children_grouped, "object", "children", "descendants") + + # Join the ancestor and descendant DataFrames + df_with_relationships = df_with_ancestors.join(df_with_descendants, df_with_ancestors.subject == df_with_descendants.object, "full_outer").withColumn("biosampleId", f.coalesce(df_with_ancestors.subject, df_with_descendants.object)).drop("subject", "object") + + # Join the original DataFrame with the relationship DataFrame + final_df = transformed_df.join(df_with_relationships, ["biosampleId"], "left") + + return BiosampleIndex( + _df=final_df, + _schema=BiosampleIndex.get_schema() + ) diff --git a/src/gentropy/datasource/ensembl/__init__.py b/src/gentropy/datasource/ensembl/__init__.py new file mode 100644 index 000000000..e20ce9a95 --- /dev/null +++ b/src/gentropy/datasource/ensembl/__init__.py @@ -0,0 +1,3 @@ +"""Ensembl's Variant Effect Predictor datasource.""" + +from __future__ import annotations diff --git a/src/gentropy/datasource/ensembl/api.py b/src/gentropy/datasource/ensembl/api.py new file mode 100644 index 000000000..eb42b3166 --- /dev/null +++ b/src/gentropy/datasource/ensembl/api.py @@ -0,0 +1,95 @@ +"""Methods that interact with Ensembl's API.""" + +from typing import Any + + +def fetch_coordinates_from_rsids( + rsids: list[str], batch_size: int = 200, pause_time: int = 1 +) -> dict[str, list[str]]: + """Batch query the Ensembl API to extract variant coordinates from a list of rsIds. + + Args: + rsids (list[str]): List of rsIDs + batch_size (int): Number of rsIDs to process in each batch. + pause_time (int): Time to pause between batches. + + Returns: + dict[str, list[str]]: Dictionary with rsID as key and list of variant IDs as value. + + Raises: + Exception: If an error occurs while processing the batches. + + Example: + >>> fetch_coordinates_from_rsids(["rs75493593"]) # doctest: +SKIP + {'rs75493593': ['17_7041768_G_C', '17_7041768_G_T']} + """ + + def _ensembl_batch_request(rsids: list[str]) -> dict[str, dict[str, Any]]: + """Access the batch endpoint of Ensembl. + + Args: + rsids (list[str]): List of rsIDs + + Returns: + dict[str, dict[str, Any]]: Dictionary with rsID as key and variant data as value. + """ + url = "https://rest.ensembl.org/variation/human" + headers = {"Content-Type": "application/json", "Accept": "application/json"} + data = json.dumps({"ids": rsids}).encode("utf-8") + + req = request.Request(url, data=data, headers=headers, method="POST") + with request.urlopen(req) as response: + response_data = response.read().decode() + + return json.loads(response_data) + + def _parse_response( + response: dict[str, dict[str, Any]], + ) -> dict[str, list[str]]: + """Parse the response from the Ensembl API. + + Args: + response (dict[str, dict[str, Any]]): Response from the Ensembl API. This is a dictionary where the key is the rsID and the value is the variant data. + + Returns: + dict[str, list[str]]: Dictionary with rsID as key and list of variant IDs as value. + """ + parsed_results = {} + valid_chromosomes = [str(i) for i in range(1, 23)] + ["X", "Y", "MT"] + for rsid in response: + if response[rsid]["mappings"]: + for data in response[rsid]["mappings"]: + if data["seq_region_name"] in valid_chromosomes: + chrom = data["seq_region_name"] + pos = data["start"] + # The first element of allele_string contains the reference allele and the rest are the alternate alleles + ref_allele = data["allele_string"].split("/")[0] + alt_alleles = data["allele_string"].split("/")[1:] + variant_ids = [ + f"{chrom}_{pos}_{ref_allele}_{alt_allele}" + for alt_allele in alt_alleles + ] + parsed_results[rsid] = variant_ids + else: + continue + return parsed_results + + import json + import time + from urllib import request + + all_results = {} + + # Chunk the rsids into batches + for i in range(0, len(rsids), batch_size): + batch = rsids[i : i + batch_size] + try: + variant_data = _ensembl_batch_request(batch) + all_results.update(_parse_response(variant_data)) + + except Exception as e: + raise Exception(f"Error processing batch {i // batch_size + 1}: {e}") from e + + time.sleep(pause_time) + + return all_results diff --git a/src/gentropy/datasource/ensembl/vep_parser.py b/src/gentropy/datasource/ensembl/vep_parser.py new file mode 100644 index 000000000..01c820513 --- /dev/null +++ b/src/gentropy/datasource/ensembl/vep_parser.py @@ -0,0 +1,813 @@ +"""Generating variant index based on Esembl's Variant Effect Predictor output.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from pyspark.sql import SparkSession +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.common.schemas import parse_spark_schema +from gentropy.common.spark_helpers import ( + enforce_schema, + get_nested_struct_schema, + map_column_by_dictionary, + order_array_of_structs_by_field, + order_array_of_structs_by_two_fields, +) +from gentropy.dataset.variant_index import VariantIndex + +if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame + +from gentropy.config import VariantIndexConfig + + +class VariantEffectPredictorParser: + """Collection of methods to parse VEP output in json format.""" + + # NOTE: Due to the fact that the comparison of the xrefs is done om the base of rsids + # if the field `colocalised_variants` have multiple rsids, this extracting xrefs will result in + # an array of xref structs, rather then the struct itself. + + DBXREF_SCHEMA = VariantIndex.get_schema()["dbXrefs"].dataType + + # Schema description of the in silico predictor object: + IN_SILICO_PREDICTOR_SCHEMA = get_nested_struct_schema( + VariantIndex.get_schema()["inSilicoPredictors"] + ) + + # Schema for the allele frequency column: + ALLELE_FREQUENCY_SCHEMA = VariantIndex.get_schema()["alleleFrequencies"].dataType + + @staticmethod + def get_schema() -> t.StructType: + """Return the schema of the VEP output. + + Returns: + t.StructType: VEP output schema. + + Examples: + >>> type(VariantEffectPredictorParser.get_schema()) + + """ + return parse_spark_schema("vep_json_output.json") + + @classmethod + def extract_variant_index_from_vep( + cls: type[VariantEffectPredictorParser], + spark: SparkSession, + vep_output_path: str | list[str], + hash_threshold: int, + **kwargs: bool | float | int | str | None, + ) -> VariantIndex: + """Extract variant index from VEP output. + + Args: + spark (SparkSession): Spark session. + vep_output_path (str | list[str]): Path to the VEP output. + hash_threshold (int): Threshold above which variant identifiers will be hashed. + **kwargs (bool | float | int | str | None): Additional arguments to pass to spark.read.json. + + Returns: + VariantIndex: Variant index dataset. + + Raises: + ValueError: Failed reading file or if the dataset is empty. + """ + # To speed things up and simplify the json structure, read data following an expected schema: + vep_schema = cls.get_schema() + + try: + vep_data = spark.read.json(vep_output_path, schema=vep_schema, **kwargs) + except ValueError as e: + raise ValueError(f"Failed reading file: {vep_output_path}.") from e + + if vep_data.isEmpty(): + raise ValueError(f"The dataset is empty: {vep_output_path}") + + # Convert to VariantAnnotation dataset: + return VariantIndex( + _df=VariantEffectPredictorParser.process_vep_output( + vep_data, hash_threshold + ), + _schema=VariantIndex.get_schema(), + id_threshold=hash_threshold, + ) + + @staticmethod + def _extract_ensembl_xrefs(colocated_variants: Column) -> Column: + """Extract rs identifiers and build cross reference to Ensembl's variant page. + + Args: + colocated_variants (Column): Colocated variants field from VEP output. + + Returns: + Column: List of dbXrefs for rs identifiers. + """ + return VariantEffectPredictorParser._generate_dbxrefs( + VariantEffectPredictorParser._colocated_variants_to_rsids( + colocated_variants + ), + "ensembl_variation", + ) + + @enforce_schema(DBXREF_SCHEMA) + @staticmethod + def _generate_dbxrefs(ids: Column, source: str) -> Column: + """Convert a list of variant identifiers to dbXrefs given the source label. + + Identifiers are cast to strings, then Null values are filtered out of the id list. + + Args: + ids (Column): List of variant identifiers. + source (str): Source label for the dbXrefs. + + Returns: + Column: List of dbXrefs. + + Examples: + >>> ( + ... spark.createDataFrame([('rs12',),(None,)], ['test_id']) + ... .select(VariantEffectPredictorParser._generate_dbxrefs(f.array(f.col('test_id')), "ensemblVariation").alias('col')) + ... .show(truncate=False) + ... ) + +--------------------------+ + |col | + +--------------------------+ + |[{rs12, ensemblVariation}]| + |[] | + +--------------------------+ + + >>> ( + ... spark.createDataFrame([('rs12',),(None,)], ['test_id']) + ... .select(VariantEffectPredictorParser._generate_dbxrefs(f.array(f.col('test_id')), "ensemblVariation").alias('col')) + ... .first().col[0].asDict() + ... ) + {'id': 'rs12', 'source': 'ensemblVariation'} + """ + ids = f.filter(ids, lambda id: id.isNotNull()) + xref_column = f.transform( + ids, + lambda id: f.struct( + id.cast(t.StringType()).alias("id"), f.lit(source).alias("source") + ), + ) + + return f.when(xref_column.isNull(), f.array()).otherwise(xref_column) + + @staticmethod + def _colocated_variants_to_rsids(colocated_variants: Column) -> Column: + """Extract rs identifiers from the colocated variants VEP field. + + Args: + colocated_variants (Column): Colocated variants field from VEP output. + + Returns: + Column: List of rs identifiers. + + Examples: + >>> data = [('s1', 'rs1'),('s1', 'rs2'),('s1', 'rs3'),('s2', None),] + >>> ( + ... spark.createDataFrame(data, ['s','v']) + ... .groupBy('s') + ... .agg(f.collect_list(f.struct(f.col('v').alias('id'))).alias('cv')) + ... .select(VariantEffectPredictorParser._colocated_variants_to_rsids(f.col('cv')).alias('rsIds'),) + ... .show(truncate=False) + ... ) + +---------------+ + |rsIds | + +---------------+ + |[rs1, rs2, rs3]| + |[null] | + +---------------+ + + """ + return f.when( + colocated_variants.isNotNull(), + f.transform( + colocated_variants, lambda variant: variant.getItem("id").alias("id") + ), + ).alias("rsIds") + + @staticmethod + def _extract_omim_xrefs(colocated_variants: Column) -> Column: + """Build xdbRefs for OMIM identifiers. + + OMIM identifiers are extracted from the colocated variants field, casted to strings and formatted as dbXrefs. + + Args: + colocated_variants (Column): Colocated variants field from VEP output. + + Returns: + Column: List of dbXrefs for OMIM identifiers. + + Examples: + >>> data = [('234234.32', 'rs1', 's1',),(None, 'rs1', 's1',),] + >>> ( + ... spark.createDataFrame(data, ['id', 'rsid', 's']) + ... .groupBy('s') + ... .agg(f.collect_list(f.struct(f.struct(f.array(f.col('id')).alias('OMIM')).alias('var_synonyms'),f.col('rsid').alias('id'),),).alias('cv'),).select(VariantEffectPredictorParser._extract_omim_xrefs(f.col('cv')).alias('dbXrefs')) + ... .show(truncate=False) + ... ) + +-------------------+ + |dbXrefs | + +-------------------+ + |[{234234#32, omim}]| + +-------------------+ + + """ + variants_w_omim_ref = f.filter( + colocated_variants, + lambda variant: variant.getItem("var_synonyms").getItem("OMIM").isNotNull(), + ) + + omim_var_ids = f.transform( + variants_w_omim_ref, + lambda var: f.transform( + var.getItem("var_synonyms").getItem("OMIM"), + lambda var: f.regexp_replace(var.cast(t.StringType()), r"\.", r"#"), + ), + ) + + return VariantEffectPredictorParser._generate_dbxrefs( + f.flatten(omim_var_ids), "omim" + ) + + @staticmethod + def _extract_clinvar_xrefs(colocated_variants: Column) -> Column: + """Build xdbRefs for VCV ClinVar identifiers. + + ClinVar identifiers are extracted from the colocated variants field. + VCV-identifiers are filtered out to generate cross-references. + + Args: + colocated_variants (Column): Colocated variants field from VEP output. + + Returns: + Column: List of dbXrefs for VCV ClinVar identifiers. + + Examples: + >>> data = [('VCV2323,RCV3423', 'rs1', 's1',),(None, 'rs1', 's1',),] + >>> ( + ... spark.createDataFrame(data, ['id', 'rsid', 's']) + ... .groupBy('s') + ... .agg(f.collect_list(f.struct(f.struct(f.split(f.col('id'),',').alias('ClinVar')).alias('var_synonyms'),f.col('rsid').alias('id'),),).alias('cv'),).select(VariantEffectPredictorParser._extract_clinvar_xrefs(f.col('cv')).alias('dbXrefs')) + ... .show(truncate=False) + ... ) + +--------------------+ + |dbXrefs | + +--------------------+ + |[{VCV2323, clinvar}]| + +--------------------+ + + """ + variants_w_clinvar_ref = f.filter( + colocated_variants, + lambda variant: variant.getItem("var_synonyms") + .getItem("ClinVar") + .isNotNull(), + ) + + clin_var_ids = f.transform( + variants_w_clinvar_ref, + lambda var: f.filter( + var.getItem("var_synonyms").getItem("ClinVar"), + lambda x: x.startswith("VCV"), + ), + ) + + return VariantEffectPredictorParser._generate_dbxrefs( + f.flatten(clin_var_ids), "clinvar" + ) + + @staticmethod + def _get_most_severe_transcript( + transcript_column_name: str, score_field_name: str + ) -> Column: + """Return transcript with the highest in silico predicted score. + + This method assumes the higher the score, the more severe the consequence of the variant is. + Hence, by selecting the transcript with the highest score, we are selecting the most severe consequence. + + Args: + transcript_column_name (str): Name of the column containing the list of transcripts. + score_field_name (str): Name of the field containing the severity score. + + Returns: + Column: Most severe transcript. + + Examples: + >>> data = [("v1", 0.2, 'transcript1'),("v1", None, 'transcript2'),("v1", 0.6, 'transcript3'),("v1", 0.4, 'transcript4'),] + >>> ( + ... spark.createDataFrame(data, ['v', 'score', 'transcriptId']) + ... .groupBy('v') + ... .agg(f.collect_list(f.struct(f.col('score'),f.col('transcriptId'))).alias('transcripts')) + ... .select(VariantEffectPredictorParser._get_most_severe_transcript('transcripts', 'score').alias('most_severe_transcript')) + ... .show(truncate=False) + ... ) + +----------------------+ + |most_severe_transcript| + +----------------------+ + |{0.6, transcript3} | + +----------------------+ + + """ + assert isinstance( + transcript_column_name, str + ), "transcript_column_name must be a string and not a column." + # Order transcripts by severity score: + ordered_transcripts = order_array_of_structs_by_field( + transcript_column_name, score_field_name + ) + + # Drop transcripts with no severity score and return the most severe one: + return f.filter( + ordered_transcripts, + lambda transcript: transcript.getItem(score_field_name).isNotNull(), + )[0] + + @enforce_schema(IN_SILICO_PREDICTOR_SCHEMA) + @staticmethod + def _get_max_alpha_missense(transcripts: Column) -> Column: + """Return the most severe alpha missense prediction from all transcripts. + + This function assumes one variant can fall onto only one gene with alpha-sense prediction available on the canonical transcript. + + Args: + transcripts (Column): List of transcripts. + + Returns: + Column: Most severe alpha missense prediction. + + Examples: + >>> data = [('v1', 0.4, 'assessment 1'), ('v1', None, None), ('v1', None, None),('v2', None, None),] + >>> ( + ... spark.createDataFrame(data, ['v', 'a', 'b']) + ... .groupBy('v') + ... .agg(f.collect_list(f.struct(f.struct( + ... f.col('a').alias('am_pathogenicity'), + ... f.col('b').alias('am_class')).alias('alphamissense'), + ... f.lit('gene1').alias('gene_id'))).alias('transcripts') + ... ) + ... .select(VariantEffectPredictorParser._get_max_alpha_missense(f.col('transcripts')).alias('am')) + ... .show(truncate=False) + ... ) + +----------------------------------------------------+ + |am | + +----------------------------------------------------+ + |{max alpha missense, assessment 1, 0.4, null, gene1}| + |{max alpha missense, null, null, null, gene1} | + +----------------------------------------------------+ + + """ + return f.transform( + # Extract transcripts with alpha missense values: + f.filter( + transcripts, + lambda transcript: transcript.getItem("alphamissense").isNotNull(), + ), + # Extract alpha missense values: + lambda transcript: f.struct( + transcript.getItem("alphamissense") + .getItem("am_pathogenicity") + .cast(t.FloatType()) + .alias("score"), + transcript.getItem("alphamissense") + .getItem("am_class") + .alias("assessment"), + f.lit("max alpha missense").alias("method"), + transcript.getItem("gene_id").alias("targetId"), + ), + )[0] + + @enforce_schema(IN_SILICO_PREDICTOR_SCHEMA) + @staticmethod + def _vep_in_silico_prediction_extractor( + transcript_column_name: str, + method_name: str, + score_column_name: str | None = None, + assessment_column_name: str | None = None, + assessment_flag_column_name: str | None = None, + ) -> Column: + """Extract in silico prediction from VEP output. + + Args: + transcript_column_name (str): Name of the column containing the list of transcripts. + method_name (str): Name of the in silico predictor. + score_column_name (str | None): Name of the column containing the score. + assessment_column_name (str | None): Name of the column containing the assessment. + assessment_flag_column_name (str | None): Name of the column containing the assessment flag. + + Returns: + Column: In silico predictor. + """ + # Get highest score: + most_severe_transcript: Column = ( + # Getting the most severe transcript: + VariantEffectPredictorParser._get_most_severe_transcript( + transcript_column_name, score_column_name + ) + if score_column_name is not None + # If we don't have score, just pick one of the transcript where assessment is available: + else f.filter( + f.col(transcript_column_name), + lambda transcript: transcript.getItem( + assessment_column_name + ).isNotNull(), + ) + ) + + return f.when( + most_severe_transcript.isNotNull(), + f.struct( + # Adding method name: + f.lit(method_name).cast(t.StringType()).alias("method"), + # Adding assessment: + f.lit(None).cast(t.StringType()).alias("assessment") + if assessment_column_name is None + else most_severe_transcript.getField(assessment_column_name).alias( + "assessment" + ), + # Adding score: + f.lit(None).cast(t.FloatType()).alias("score") + if score_column_name is None + else most_severe_transcript.getField(score_column_name) + .cast(t.FloatType()) + .alias("score"), + # Adding assessment flag: + f.lit(None).cast(t.StringType()).alias("assessmentFlag") + if assessment_flag_column_name is None + else most_severe_transcript.getField(assessment_flag_column_name) + .cast(t.FloatType()) + .alias("assessmentFlag"), + # Adding target id if present: + most_severe_transcript.getItem("gene_id").alias("targetId"), + ), + ) + + @staticmethod + def _parser_amino_acid_change(amino_acids: Column, protein_end: Column) -> Column: + """Convert VEP amino acid change information to one letter code aa substitution code. + + The logic assumes that the amino acid change is given in the format "from/to" and the protein end is given also. + If any of the information is missing, the amino acid change will be set to None. + + Args: + amino_acids (Column): Amino acid change information. + protein_end (Column): Protein end information. + + Returns: + Column: Amino acid change in one letter code. + + Examples: + >>> data = [('A/B', 1),('A/B', None),(None, 1),] + >>> ( + ... spark.createDataFrame(data, ['amino_acids', 'protein_end']) + ... .select(VariantEffectPredictorParser._parser_amino_acid_change(f.col('amino_acids'), f.col('protein_end')).alias('amino_acid_change')) + ... .show() + ... ) + +-----------------+ + |amino_acid_change| + +-----------------+ + | A1B| + | null| + | null| + +-----------------+ + + """ + return f.when( + amino_acids.isNotNull() & protein_end.isNotNull(), + f.concat( + f.split(amino_acids, r"\/")[0], + protein_end, + f.split(amino_acids, r"\/")[1], + ), + ).otherwise(f.lit(None)) + + @staticmethod + def _collect_uniprot_accessions(trembl: Column, swissprot: Column) -> Column: + """Flatten arrays containing Uniprot accessions. + + Args: + trembl (Column): List of TrEMBL protein accessions. + swissprot (Column): List of SwissProt protein accessions. + + Returns: + Column: List of unique Uniprot accessions extracted from swissprot and trembl arrays, splitted from version numbers. + + Examples: + >>> data = [('v1', ["sp_1"], ["tr_1"]), ('v1', None, None), ('v1', None, ["tr_2"]),] + >>> ( + ... spark.createDataFrame(data, ['v', 'sp', 'tr']) + ... .select(VariantEffectPredictorParser._collect_uniprot_accessions(f.col('sp'), f.col('tr')).alias('proteinIds')) + ... .show() + ... ) + +------------+ + | proteinIds| + +------------+ + |[sp_1, tr_1]| + | []| + | [tr_2]| + +------------+ + + """ + # Dropping Null values and flattening the arrays: + return f.filter( + f.array_distinct( + f.transform( + f.flatten( + f.filter( + f.array(trembl, swissprot), + lambda x: x.isNotNull(), + ) + ), + lambda x: f.split(x, r"\.")[0], + ) + ), + lambda x: x.isNotNull(), + ) + + @staticmethod + def _parse_variant_location_id(vep_input_field: Column) -> list[Column]: + r"""Parse variant identifier, chromosome, position, reference allele and alternate allele from VEP input field. + + Args: + vep_input_field (Column): Column containing variant vcf string used as VEP input. + + Returns: + list[Column]: List of columns containing chromosome, position, reference allele and alternate allele. + """ + variant_fields = f.split(vep_input_field, r"\t") + return [ + f.concat_ws( + "_", + f.array( + variant_fields[0], + variant_fields[1], + variant_fields[3], + variant_fields[4], + ), + ).alias("variantId"), + variant_fields[0].cast(t.StringType()).alias("chromosome"), + variant_fields[1].cast(t.IntegerType()).alias("position"), + variant_fields[3].cast(t.StringType()).alias("referenceAllele"), + variant_fields[4].cast(t.StringType()).alias("alternateAllele"), + ] + + @classmethod + def process_vep_output( + cls, vep_output: DataFrame, hash_threshold: int = 100 + ) -> DataFrame: + """Process and format a VEP output in JSON format. + + Args: + vep_output (DataFrame): raw VEP output, read as spark DataFrame. + hash_threshold (int): threshold above which variant identifiers will be hashed. + + Returns: + DataFrame: processed data in the right shape. + """ + # Consequence to sequence ontology map: + sequence_ontology_map = { + item["label"]: item["id"] + for item in VariantIndexConfig.consequence_to_pathogenicity_score + } + # Sequence ontology to score map: + label_to_score_map = { + item["label"]: item["score"] + for item in VariantIndexConfig.consequence_to_pathogenicity_score + } + # Processing VEP output: + return ( + vep_output + # Dropping non-canonical transcript consequences: # TODO: parametrize this. + .withColumn( + "transcript_consequences", + f.filter( + f.col("transcript_consequences"), + lambda consequence: consequence.getItem("canonical") == 1, + ), + ) + .select( + # Parse id and chr:pos:alt:ref: + *cls._parse_variant_location_id(f.col("input")), + # Extracting corss_references from colocated variants: + cls._extract_ensembl_xrefs(f.col("colocated_variants")).alias( + "ensembl_xrefs" + ), + cls._extract_omim_xrefs(f.col("colocated_variants")).alias( + "omim_xrefs" + ), + cls._extract_clinvar_xrefs(f.col("colocated_variants")).alias( + "clinvar_xrefs" + ), + # Extracting in silico predictors + f.when( + # The following in-silico predictors are only available for variants with transcript consequences: + f.col("transcript_consequences").isNotNull(), + f.filter( + f.array( + # Extract CADD scores: + cls._vep_in_silico_prediction_extractor( + transcript_column_name="transcript_consequences", + method_name="phred scaled CADD", + score_column_name="cadd_phred", + ), + # Extract polyphen scores: + cls._vep_in_silico_prediction_extractor( + transcript_column_name="transcript_consequences", + method_name="polyphen", + score_column_name="polyphen_score", + assessment_column_name="polyphen_prediction", + ), + # Extract sift scores: + cls._vep_in_silico_prediction_extractor( + transcript_column_name="transcript_consequences", + method_name="sift", + score_column_name="sift_score", + assessment_column_name="sift_prediction", + ), + # Extract loftee scores: + cls._vep_in_silico_prediction_extractor( + method_name="loftee", + transcript_column_name="transcript_consequences", + score_column_name="lof", + assessment_column_name="lof", + assessment_flag_column_name="lof_filter", + ), + # Extract max alpha missense: + cls._get_max_alpha_missense( + f.col("transcript_consequences") + ), + ), + lambda predictor: predictor.isNotNull(), + ), + ) + .otherwise( + # Extract CADD scores from intergenic object: + f.array( + cls._vep_in_silico_prediction_extractor( + transcript_column_name="intergenic_consequences", + method_name="phred scaled CADD", + score_column_name="cadd_phred", + ), + ) + ) + .alias("inSilicoPredictors"), + # Convert consequence to SO: + map_column_by_dictionary( + f.col("most_severe_consequence"), sequence_ontology_map + ).alias("mostSevereConsequenceId"), + # Extract HGVS identifier: + f.when( + f.size("transcript_consequences") > 0, + f.col("transcript_consequences").getItem(0).getItem("hgvsg"), + ) + .when( + f.size("intergenic_consequences") > 0, + f.col("intergenic_consequences").getItem(0).getItem("hgvsg"), + ) + .otherwise(f.lit(None)) + .alias("hgvsId"), + # Collect transcript consequence: + f.when( + f.col("transcript_consequences").isNotNull(), + f.transform( + f.col("transcript_consequences"), + lambda transcript: f.struct( + # Convert consequence terms to SO identifier: + f.transform( + transcript.consequence_terms, + lambda y: map_column_by_dictionary( + y, sequence_ontology_map + ), + ).alias("variantFunctionalConsequenceIds"), + # Convert consequence terms to consequence score: + f.array_max( + f.transform( + transcript.consequence_terms, + lambda term: map_column_by_dictionary( + term, label_to_score_map + ), + ) + ) + .cast(t.FloatType()) + .alias("consequenceScore"), + # Format amino acid change: + cls._parser_amino_acid_change( + transcript.amino_acids, transcript.protein_end + ).alias("aminoAcidChange"), + # Extract and clean uniprot identifiers: + cls._collect_uniprot_accessions( + transcript.swissprot, + transcript.trembl, + ).alias("uniprotAccessions"), + # Add canonical flag: + f.when(transcript.canonical == 1, f.lit(True)) + .otherwise(f.lit(False)) + .alias("isEnsemblCanonical"), + # Extract footprint distance: + transcript.codons.alias("codons"), + f.when(transcript.distance.isNotNull(), transcript.distance) + .otherwise(f.lit(0)) + .cast(t.LongType()) + .alias("distanceFromFootprint"), + # Extract distance from the transcription start site: + transcript.tssdistance.cast(t.LongType()).alias( + "distanceFromTss" + ), + # Extracting APPRIS isoform annotation for this transcript: + transcript.appris.alias("appris"), + # Extracting MANE select transcript: + transcript.mane_select.alias("maneSelect"), + transcript.gene_id.alias("targetId"), + transcript.impact.alias("impact"), + transcript.lof.cast(t.StringType()).alias( + "lofteePrediction" + ), + transcript.lof.cast(t.FloatType()).alias("siftPrediction"), + transcript.lof.cast(t.FloatType()).alias( + "polyphenPrediction" + ), + transcript.transcript_id.alias("transcriptId"), + ), + ), + ).alias("transcriptConsequences"), + # Extracting rsids: + cls._colocated_variants_to_rsids(f.col("colocated_variants")).alias( + "rsIds" + ), + # Adding empty array for allele frequencies - now this piece of data is not coming form the VEP data: + f.array().cast(cls.ALLELE_FREQUENCY_SCHEMA).alias("alleleFrequencies"), + ) + # Dropping transcripts where the consequence score or the distance is null: + .withColumn( + "transcriptConsequences", + f.filter( + f.col("transcriptConsequences"), + lambda x: x.getItem("consequenceScore").isNotNull() + & x.getItem("distanceFromFootprint").isNotNull(), + ), + ) + # Sort transcript consequences by consequence score and distance from footprint and add index: + .withColumn( + "transcriptConsequences", + f.when( + f.col("transcriptConsequences").isNotNull(), + f.transform( + order_array_of_structs_by_two_fields( + "transcriptConsequences", + "consequenceScore", + "distanceFromFootprint", + ), + lambda x, i: x.withField("transcriptIndex", i + f.lit(1)), + ), + ), + ) + # Adding protvar xref for missense variants: # TODO: making and extendable list of consequences + .withColumn( + "protvar_xrefs", + f.when( + f.size( + f.filter( + f.col("transcriptConsequences"), + lambda x: f.array_contains( + x.variantFunctionalConsequenceIds, "SO_0001583" + ), + ) + ) + > 0, + cls._generate_dbxrefs(f.array(f.col("variantId")), "protvar"), + ), + ) + .withColumn( + "dbXrefs", + f.flatten( + f.filter( + f.array( + f.col("ensembl_xrefs"), + f.col("omim_xrefs"), + f.col("clinvar_xrefs"), + f.col("protvar_xrefs"), + ), + lambda x: x.isNotNull(), + ) + ), + ) + # If the variantId is too long, hash it: + .withColumn( + "variantId", + VariantIndex.hash_long_variant_ids( + f.col("variantId"), + f.col("chromosome"), + f.col("position"), + hash_threshold, + ), + ) + # Dropping intermediate xref columns: + .drop(*["ensembl_xrefs", "omim_xrefs", "clinvar_xrefs", "protvar_xrefs"]) + # Drooping rows with null position: + .filter(f.col("position").isNotNull()) + ) diff --git a/src/gentropy/datasource/eqtl_catalogue/finemapping.py b/src/gentropy/datasource/eqtl_catalogue/finemapping.py new file mode 100644 index 000000000..ea46359df --- /dev/null +++ b/src/gentropy/datasource/eqtl_catalogue/finemapping.py @@ -0,0 +1,323 @@ +"""Process SuSIE finemapping results from eQTL Catalogue.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +from pyspark.sql import Column, DataFrame, Window +from pyspark.sql.types import ( + DoubleType, + IntegerType, + StringType, + StructField, + StructType, +) + +from gentropy.common.session import Session +from gentropy.common.utils import parse_pvalue +from gentropy.dataset.study_locus import StudyLocus +from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +@dataclass +class EqtlCatalogueFinemapping: + """SuSIE finemapping dataset for eQTL Catalogue. + + Credible sets from SuSIE are extracted and transformed into StudyLocus objects: + - A study ID is defined as a triad between: the publication, the tissue, and the measured trait (e.g. Braineac2_substantia_nigra_ENSG00000248275) + - Each row in the `credible_sets.tsv.gz` files is represented by molecular_trait_id/variant/rsid trios relevant for a given tissue. Each have their own finemapping statistics + - log Bayes Factors are available for all variants in the `lbf_variable.txt` files + """ + + raw_credible_set_schema: StructType = StructType( + [ + StructField("molecular_trait_id", StringType(), True), + StructField("gene_id", StringType(), True), + StructField("cs_id", StringType(), True), + StructField("variant", StringType(), True), + StructField("rsid", StringType(), True), + StructField("cs_size", IntegerType(), True), + StructField("pip", DoubleType(), True), + StructField("pvalue", DoubleType(), True), + StructField("beta", DoubleType(), True), + StructField("se", DoubleType(), True), + StructField("z", DoubleType(), True), + StructField("cs_min_r2", DoubleType(), True), + StructField("region", StringType(), True), + ] + ) + raw_lbf_schema: StructType = StructType( + [ + StructField("molecular_trait_id", StringType(), True), + StructField("region", StringType(), True), + StructField("variant", StringType(), True), + StructField("chromosome", StringType(), True), + StructField("position", IntegerType(), True), + StructField("lbf_variable1", DoubleType(), True), + StructField("lbf_variable2", DoubleType(), True), + StructField("lbf_variable3", DoubleType(), True), + StructField("lbf_variable4", DoubleType(), True), + StructField("lbf_variable5", DoubleType(), True), + StructField("lbf_variable6", DoubleType(), True), + StructField("lbf_variable7", DoubleType(), True), + StructField("lbf_variable8", DoubleType(), True), + StructField("lbf_variable9", DoubleType(), True), + StructField("lbf_variable10", DoubleType(), True), + ] + ) + + @classmethod + def _extract_credible_set_index( + cls: type[EqtlCatalogueFinemapping], cs_id: Column + ) -> Column: + """Extract the credible set index from the cs_id. + + Args: + cs_id (Column): column with the credible set id as defined in the eQTL Catalogue. + + Returns: + Column: The credible set index. + + Examples: + >>> spark.createDataFrame([("QTD000046_L1",)], ["cs_id"]).select(EqtlCatalogueFinemapping._extract_credible_set_index(f.col("cs_id"))).show() + +----------------+ + |credibleSetIndex| + +----------------+ + | 1| + +----------------+ + + """ + return f.split(cs_id, "_L")[1].cast(IntegerType()).alias("credibleSetIndex") + + @classmethod + def _extract_dataset_id_from_file_path( + cls: type[EqtlCatalogueFinemapping], file_path: Column + ) -> Column: + """Extract the dataset_id from the file_path. The dataset_id follows the pattern QTD{6}. + + Args: + file_path (Column): A column containing the file path. + + Returns: + Column: The dataset_id. + + Examples: + >>> spark.createDataFrame([("QTD000046.credible_sets.tsv",)], ["filename"]).select(EqtlCatalogueFinemapping._extract_dataset_id_from_file_path(f.col("filename"))).show() + +----------+ + |dataset_id| + +----------+ + | QTD000046| + +----------+ + + """ + return f.regexp_extract(file_path, r"QTD\d{6}", 0).alias("dataset_id") + + @classmethod + def parse_susie_results( + cls: type[EqtlCatalogueFinemapping], + credible_sets: DataFrame, + lbf: DataFrame, + studies_metadata: DataFrame, + ) -> DataFrame: + """Parse the SuSIE results into a DataFrame containing the finemapping statistics and metadata about the studies. + + Args: + credible_sets (DataFrame): DataFrame containing raw statistics of all variants in the credible sets. + lbf (DataFrame): DataFrame containing the raw log Bayes Factors for all variants. + studies_metadata (DataFrame): DataFrame containing the study metadata. + + Returns: + DataFrame: Processed SuSIE results to contain metadata about the studies and the finemapping statistics. + """ + ss_ftp_path_template = "https://ftp.ebi.ac.uk/pub/databases/spot/eQTL/sumstats" + return ( + lbf.join( + credible_sets.join(f.broadcast(studies_metadata), on="dataset_id"), + on=["molecular_trait_id", "region", "variant", "dataset_id"], + how="inner", + ) + .withColumn( + "logBF", + f.when(f.col("credibleSetIndex") == 1, f.col("lbf_variable1")) + .when(f.col("credibleSetIndex") == 2, f.col("lbf_variable2")) + .when(f.col("credibleSetIndex") == 3, f.col("lbf_variable3")) + .when(f.col("credibleSetIndex") == 4, f.col("lbf_variable4")) + .when(f.col("credibleSetIndex") == 5, f.col("lbf_variable5")) + .when(f.col("credibleSetIndex") == 6, f.col("lbf_variable6")) + .when(f.col("credibleSetIndex") == 7, f.col("lbf_variable7")) + .when(f.col("credibleSetIndex") == 8, f.col("lbf_variable8")) + .when(f.col("credibleSetIndex") == 9, f.col("lbf_variable9")) + .when(f.col("credibleSetIndex") == 10, f.col("lbf_variable10")), + ) + .select( + f.regexp_replace(f.col("variant"), r"chr", "").alias("variantId"), + f.col("region"), + f.col("chromosome"), + f.col("position"), + f.col("pip").alias("posteriorProbability"), + *parse_pvalue(f.col("pvalue")), + f.col("sample_size").alias("nSamples"), + f.col("beta"), + f.col("se").alias("standardError"), + f.col("credibleSetIndex"), + f.col("logBF"), + f.lit("SuSie").alias("finemappingMethod"), + # Study metadata + f.col("molecular_trait_id").alias("traitFromSource"), + f.col("gene_id").alias("geneId"), + f.col("dataset_id"), + f.concat_ws( + "_", + f.col("study_label"), + f.col("quant_method"), + f.col("sample_group"), + f.col("molecular_trait_id"), + ).alias("studyId"), + f.col("tissue_id").alias("biosampleFromSourceId"), + EqtlCatalogueStudyIndex._identify_study_type( + f.col("quant_method"), f.col("tissue_id") + ).alias("studyType"), + f.col("study_label").alias("projectId"), + f.concat_ws( + "/", + f.lit(ss_ftp_path_template), + f.col("study_id"), + f.col("dataset_id"), + ).alias("summarystatsLocation"), + f.lit(True).alias("hasSumstats"), + f.col("molecular_trait_id"), + f.col("pmid").alias("pubmedId"), + f.col("condition_label").alias("condition"), + ) + ) + + @classmethod + def from_susie_results( + cls: type[EqtlCatalogueFinemapping], processed_finemapping_df: DataFrame + ) -> StudyLocus: + """Create a StudyLocus object from the processed SuSIE results. + + Args: + processed_finemapping_df (DataFrame): DataFrame containing the processed SuSIE results. + + Returns: + StudyLocus: eQTL Catalogue credible sets. + """ + lead_w = Window.partitionBy( + "dataset_id", "molecular_trait_id", "region", "credibleSetIndex" + ) + study_locus_cols = [ + field.name + for field in StudyLocus.get_schema().fields + if field.name in processed_finemapping_df.columns + ] + ["locus"] + return StudyLocus( + _df=( + processed_finemapping_df.withColumn( + "isLead", + f.row_number().over(lead_w.orderBy(f.desc("posteriorProbability"))) + == f.lit(1), + ) + .withColumn( + # Collecting all variants that constitute the credible set brings as many variants as the credible set size + "locus", + f.when( + f.col("isLead"), + f.collect_list( + f.struct( + "variantId", + "posteriorProbability", + "pValueMantissa", + "pValueExponent", + "logBF", + "beta", + "standardError", + ) + ).over(lead_w), + ), + ) + .filter(f.col("isLead")) + .drop("isLead") + .select( + *study_locus_cols, + StudyLocus.assign_study_locus_id( + ["studyId", "variantId", "finemappingMethod"] + ), + StudyLocus.calculate_credible_set_log10bf( + f.col("locus.logBF") + ).alias("credibleSetlog10BF"), + ) + ), + _schema=StudyLocus.get_schema(), + ).annotate_credible_sets() + + @classmethod + def read_credible_set_from_source( + cls: type[EqtlCatalogueFinemapping], + session: Session, + credible_set_path: str | list[str], + ) -> DataFrame: + """Load raw credible sets from eQTL Catalogue. + + Args: + session (Session): Spark session. + credible_set_path (str | list[str]): Path to raw table(s) containing finemapping results for any variant belonging to a credible set. + + Returns: + DataFrame: Credible sets DataFrame. + """ + return ( + session.spark.read.csv( + credible_set_path, + sep="\t", + header=True, + schema=cls.raw_credible_set_schema, + ) + .withColumns( + { + # Adding dataset id based on the input file name: + "dataset_id": cls._extract_dataset_id_from_file_path( + f.input_file_name() + ), + # Parsing credible set index from the cs_id: + "credibleSetIndex": cls._extract_credible_set_index(f.col("cs_id")), + } + ) + # Remove duplicates caused by explosion of single variants to multiple rsid-s: + .drop("rsid") + .distinct() + ) + + @classmethod + def read_lbf_from_source( + cls: type[EqtlCatalogueFinemapping], + session: Session, + lbf_path: str | list[str], + ) -> DataFrame: + """Load raw log Bayes Factors from eQTL Catalogue. + + Args: + session (Session): Spark session. + lbf_path (str | list[str]): Path to raw table(s) containing Log Bayes Factors for each variant. + + Returns: + DataFrame: Log Bayes Factors DataFrame. + """ + return ( + session.spark.read.csv( + lbf_path, + sep="\t", + header=True, + schema=cls.raw_lbf_schema, + ) + .withColumn( + "dataset_id", + cls._extract_dataset_id_from_file_path(f.input_file_name()), + ) + .distinct() + ) diff --git a/src/gentropy/datasource/eqtl_catalogue/study_index.py b/src/gentropy/datasource/eqtl_catalogue/study_index.py index bcfc5e50f..d284eb781 100644 --- a/src/gentropy/datasource/eqtl_catalogue/study_index.py +++ b/src/gentropy/datasource/eqtl_catalogue/study_index.py @@ -1,10 +1,15 @@ """Study Index for eQTL Catalogue data source.""" + from __future__ import annotations -from typing import TYPE_CHECKING, Type +from itertools import chain +from typing import TYPE_CHECKING +import pandas as pd import pyspark.sql.functions as f +from pyspark.sql.types import IntegerType, StringType, StructField, StructType +from gentropy.common.session import Session from gentropy.dataset.study_index import StudyIndex if TYPE_CHECKING: @@ -13,167 +18,140 @@ class EqtlCatalogueStudyIndex: - """Study index dataset from eQTL Catalogue.""" - - study_config = { - "GTEx_V8": { - "nSamples": 838, - "initialSampleSize": "838 (281 females and 557 males)", - "discoverySamples": [ - {"sampleSize": 715, "ancestry": "European American"}, - {"sampleSize": 103, "ancestry": "African American"}, - {"sampleSize": 12, "ancestry": "Asian American"}, - {"sampleSize": 16, "ancestry": "Hispanic or Latino"}, - ], - "ldPopulationStructure": [ - {"ldPopulation": "nfe", "relativeSampleSize": 0.85}, - {"ldPopulation": "afr", "relativeSampleSize": 0.12}, - {"ldPopulation": "eas", "relativeSampleSize": 0.01}, - {"ldPopulation": "amr", "relativeSampleSize": 0.02}, - ], - "pubmedId": "32913098", - "publicationTitle": "The GTEx Consortium atlas of genetic regulatory effects across human tissues", - "publicationFirstAuthor": "GTEx Consortium", - "publicationDate": "2020-09-11", - "publicationJournal": "Science", - }, + """Study index dataset from eQTL Catalogue. + + We extract study level metadata from eQTL Catalogue's fine mapping results. All available studies can be found [here](https://www.ebi.ac.uk/eqtl/Studies/). + + One study from the eQTL Catalogue clusters together all the molecular QTLs (mQTLs) that were found: + + - in the same publication (e.g. Alasoo_2018) + - in the same cell type or tissue (e.g. monocytes) + - and for the same measured molecular trait (e.g. ENSG00000141510) + + """ + + raw_studies_metadata_schema: StructType = StructType( + [ + StructField("study_id", StringType(), True), + StructField("dataset_id", StringType(), True), + StructField("study_label", StringType(), True), + StructField("sample_group", StringType(), True), + StructField("tissue_id", StringType(), True), + StructField("tissue_label", StringType(), True), + StructField("condition_label", StringType(), True), + StructField("sample_size", IntegerType(), True), + StructField("quant_method", StringType(), True), + StructField("pmid", StringType(), True), + ] + ) + raw_studies_metadata_path = "https://raw.githubusercontent.com/eQTL-Catalogue/eQTL-Catalogue-resources/092e01a9601feb404f1c88f86311b43b907a88f6/data_tables/dataset_metadata_upcoming.tsv" + method_to_study_type_mapping = { + "ge": "eqtl", + "exon": "eqtl", + "tx": "eqtl", + "microarray": "eqtl", + "leafcutter": "sqtl", + "aptamer": "pqtl", + "txrev": "tuqtl", } @classmethod - def get_study_attribute( - cls: Type[EqtlCatalogueStudyIndex], attribute_key: str + def _identify_study_type( + cls: type[EqtlCatalogueStudyIndex], + quantification_method_col: Column, + biosample_col: Column, ) -> Column: - """Returns a Column expression that dynamically assigns the attribute based on the study. + """Identify the study type based on the method to quantify the trait and the biosample where the trait was measured. + + The quantification method identifies the type of molecular QTLs that were found. + The biosample identifies the biosample where the trait was measured, distinguishing between bulk and single cell. Args: - attribute_key (str): The attribute key to assign. + quantification_method_col (Column): column with the label of the method to quantify the trait. Available methods are [here](https://www.ebi.ac.uk/eqtl/Methods/) + biosample_col (Column): column with the label of the biosample where the trait was measured. Returns: - Column: The dynamically assigned attribute. - - Raises: - ValueError: If the attribute key is not known for the study. + Column: The study type. + + Examples: + >>> df = spark.createDataFrame([("ge", "CL_1"), ("leafcutter", "UBERON_2"), ("tx", "EFO_3")], ["quant_method", "tissue_id"]) + >>> df.withColumn("study_type", EqtlCatalogueStudyIndex._identify_study_type(f.col("quant_method"), f.col("tissue_id"))).show() + +------------+---------+----------+ + |quant_method|tissue_id|study_type| + +------------+---------+----------+ + | ge| CL_1| sceqtl| + | leafcutter| UBERON_2| sqtl| + | tx| EFO_3| eqtl| + +------------+---------+----------+ + """ - study_column = f.col("study") - for study, config in cls.study_config.items(): - attribute_value = config.get(attribute_key) - if attribute_value is None: - raise ValueError( - f"Unknown attribute key {attribute_key} for study {study}" - ) - # Convert list of dicts to array of structs - if isinstance(attribute_value, list) and isinstance( - attribute_value[0], dict - ): - struct_fields = [ - f.struct(*[f.lit(value).alias(key) for key, value in item.items()]) - for item in attribute_value - ] - attribute_value = f.array(struct_fields) - # Convert dict to struct - elif isinstance(attribute_value, dict): - attribute_value = f.struct( - *[f.lit(value).alias(key) for key, value in attribute_value.items()] - ) - return f.when(study_column == study, attribute_value).alias(attribute_key) + qtl_type_mapping = f.create_map( + *[f.lit(x) for x in chain(*cls.method_to_study_type_mapping.items())] + )[quantification_method_col] + return f.when( + biosample_col.startswith("CL"), f.concat(f.lit("sc"), qtl_type_mapping) + ).otherwise(qtl_type_mapping) @classmethod - def _all_attributes(cls: Type[EqtlCatalogueStudyIndex]) -> list[Column]: - """A helper function to return all study index attribute expressions. + def get_studies_of_interest( + cls: type[EqtlCatalogueStudyIndex], + studies_metadata: DataFrame, + ) -> list[str]: + """Filter studies of interest from the raw studies metadata. + + Args: + studies_metadata (DataFrame): raw studies metadata filtered with studies of interest. Returns: - list[Column]: A list of all study index attribute expressions. + list[str]: QTD IDs defining the studies of interest for ingestion. """ - study_column = f.col("study") - - static_study_attributes = [ - study_column.alias("projectId"), - f.concat(study_column, f.lit("_"), f.col("qtl_group")).alias("studyId"), - f.col("ftp_path").alias("summarystatsLocation"), - f.lit(True).alias("hasSumstats"), - f.lit("eqtl").alias("studyType"), - ] - tissue_attributes = [ - # Human readable tissue label, example: "Adipose - Subcutaneous". - f.col("tissue_label").alias("traitFromSource"), - # Ontology identifier for the tissue, for example: "UBERON:0001157". - f.array( - f.regexp_replace( - f.regexp_replace( - f.col("tissue_ontology_id"), - "UBER_", - "UBERON_", - ), - "_", - ":", - ) - ).alias("traitFromSourceMappedIds"), - ] - dynamic_study_attributes = [ - cls.get_study_attribute("nSamples"), - cls.get_study_attribute("initialSampleSize"), - cls.get_study_attribute("discoverySamples"), - cls.get_study_attribute("ldPopulationStructure"), - cls.get_study_attribute("pubmedId"), - cls.get_study_attribute("publicationTitle"), - cls.get_study_attribute("publicationFirstAuthor"), - cls.get_study_attribute("publicationDate"), - cls.get_study_attribute("publicationJournal"), - ] - return static_study_attributes + tissue_attributes + dynamic_study_attributes + return ( + studies_metadata.select("dataset_id") + .distinct() + .toPandas()["dataset_id"] + .tolist() + ) @classmethod - def add_gene_to_study_id( + def from_susie_results( cls: type[EqtlCatalogueStudyIndex], - study_index_df: DataFrame, - summary_stats_df: DataFrame, + processed_finemapping_df: DataFrame, ) -> StudyIndex: - """Update the studyId to include gene information from summary statistics. A geneId column is also added. - - While the original list contains one entry per tissue, what we consider as a single study is one mini-GWAS for - an expression of a _particular gene_ in a particular study. At this stage we have a study index with partial - study IDs like "PROJECT_QTLGROUP", and a summary statistics object with full study IDs like - "PROJECT_QTLGROUP_GENEID", so we need to perform a merge and explosion to obtain our final study index. + """Ingest study level metadata from eQTL Catalogue. Args: - study_index_df (DataFrame): preliminary study index for eQTL Catalogue studies. - summary_stats_df (DataFrame): summary statistics dataframe for eQTL Catalogue data. + processed_finemapping_df (DataFrame): processed fine mapping results with study metadata. Returns: - StudyIndex: final study index for eQTL Catalogue studies. + StudyIndex: eQTL Catalogue study index dataset derived from the selected SuSIE results. """ - partial_to_full_study_id = summary_stats_df.select( - f.col("studyId").alias("fullStudyId"), # PROJECT_QTLGROUP_GENEID - f.regexp_extract(f.col("studyId"), r"^(.*)_ENSG\d+", 1).alias( - "studyId" - ), # PROJECT_QTLGROUP - ).distinct() - study_index_df = ( - partial_to_full_study_id.join( - f.broadcast(study_index_df), "studyId", "inner" - ) - # Change studyId to fullStudyId - .drop("studyId") - .withColumnRenamed("fullStudyId", "studyId") - # Add geneId column - .withColumn("geneId", f.regexp_extract(f.col("studyId"), r"([^_]+)$", 1)) + study_index_cols = [ + field.name + for field in StudyIndex.get_schema().fields + if field.name in processed_finemapping_df.columns + ] + return StudyIndex( + _df=processed_finemapping_df.select(study_index_cols).distinct(), + _schema=StudyIndex.get_schema(), ) - return StudyIndex(_df=study_index_df, _schema=StudyIndex.get_schema()) @classmethod - def from_source( + def read_studies_from_source( cls: type[EqtlCatalogueStudyIndex], - eqtl_studies: DataFrame, - ) -> StudyIndex: - """Ingest study level metadata from eQTL Catalogue. + session: Session, + mqtl_quantification_methods_blacklist: list[str], + ) -> DataFrame: + """Read raw studies metadata from eQTL Catalogue. Args: - eqtl_studies (DataFrame): ingested but unprocessed eQTL Catalogue studies. + session (Session): Spark session. + mqtl_quantification_methods_blacklist (list[str]): Molecular trait quantification methods that we don't want to ingest. Available options in https://github.com/eQTL-Catalogue/eQTL-Catalogue-resources/blob/master/data_tables/dataset_metadata.tsv Returns: - StudyIndex: preliminary processed study index for eQTL Catalogue studies. + DataFrame: raw studies metadata. """ - return StudyIndex( - _df=eqtl_studies.select(*cls._all_attributes()), - _schema=StudyIndex.get_schema(), - ) + pd.DataFrame.iteritems = pd.DataFrame.items + return session.spark.createDataFrame( + pd.read_csv(cls.raw_studies_metadata_path, sep="\t"), + schema=cls.raw_studies_metadata_schema, + ).filter(~(f.col("quant_method").isin(mqtl_quantification_methods_blacklist))) diff --git a/src/gentropy/datasource/finngen/finemapping.py b/src/gentropy/datasource/finngen/finemapping.py index 8fd12b0ba..36ab97e80 100644 --- a/src/gentropy/datasource/finngen/finemapping.py +++ b/src/gentropy/datasource/finngen/finemapping.py @@ -5,6 +5,7 @@ from dataclasses import dataclass +import hail as hl import pyspark.sql.functions as f import pyspark.sql.types as t from pyspark.sql import SparkSession, Window @@ -21,7 +22,7 @@ class FinnGenFinemapping: Credible sets from SuSIE are extracted and transformed into StudyLocus objects: - - Study ID in the special format (e.g. FINNGEN_R10_*) + - Study ID in the special format (e.g. FINNGEN_R11*) - Credible set specific finemapping statistics (e.g. LogBayesFactors, Alphas/Posterior) - Additional credible set level BayesFactor filtering is applied (LBF > 2) - StudyLocusId is annotated for each credible set. @@ -109,39 +110,194 @@ class FinnGenFinemapping: ] ) + raw_hail_shema: hl.tstruct = hl.tstruct( + trait=hl.tstr, + region=hl.tstr, + v=hl.tstr, + rsid=hl.tstr, + chromosome=hl.tstr, + position=hl.tstr, + allele1=hl.tstr, + allele2=hl.tstr, + maf=hl.tstr, + beta=hl.tstr, + se=hl.tstr, + p=hl.tstr, + mean=hl.tstr, + sd=hl.tstr, + prob=hl.tstr, + cs=hl.tstr, + cs_specific_prob=hl.tfloat64, + low_purity=hl.tstr, + lead_r2=hl.tstr, + mean_99=hl.tstr, + sd_99=hl.tstr, + prob_99=hl.tstr, + cs_99=hl.tstr, + cs_specific_prob_99=hl.tstr, + low_purity_99=hl.tstr, + lead_r2_99=hl.tstr, + alpha1=hl.tfloat64, + alpha2=hl.tfloat64, + alpha3=hl.tfloat64, + alpha4=hl.tfloat64, + alpha5=hl.tfloat64, + alpha6=hl.tfloat64, + alpha7=hl.tfloat64, + alpha8=hl.tfloat64, + alpha9=hl.tfloat64, + alpha10=hl.tfloat64, + mean1=hl.tstr, + mean2=hl.tstr, + mean3=hl.tstr, + mean4=hl.tstr, + mean5=hl.tstr, + mean6=hl.tstr, + mean7=hl.tstr, + mean8=hl.tstr, + mean9=hl.tstr, + mean10=hl.tstr, + sd1=hl.tstr, + sd2=hl.tstr, + sd3=hl.tstr, + sd4=hl.tstr, + sd5=hl.tstr, + sd6=hl.tstr, + sd7=hl.tstr, + sd8=hl.tstr, + sd9=hl.tstr, + sd10=hl.tstr, + lbf_variable1=hl.tfloat64, + lbf_variable2=hl.tfloat64, + lbf_variable3=hl.tfloat64, + lbf_variable4=hl.tfloat64, + lbf_variable5=hl.tfloat64, + lbf_variable6=hl.tfloat64, + lbf_variable7=hl.tfloat64, + lbf_variable8=hl.tfloat64, + lbf_variable9=hl.tfloat64, + lbf_variable10=hl.tfloat64, + ) + + summary_hail_schema: hl.tstruct = hl.tstruct( + trait=hl.tstr, + region=hl.tstr, + cs=hl.tstr, + cs_log10bf=hl.tfloat64, + ) + + @staticmethod + def _infer_block_gzip_compression(paths: str | list[str]) -> bool: + """Naively infer compression type based on the file extension. + + Args: + paths (str | list[str]): File path(s). + + Returns: + bool: True if block gzipped, False otherwise. + """ + if isinstance(paths, str): + return paths.endswith(".bgz") + return all(path.endswith(".bgz") for path in paths) + @classmethod def from_finngen_susie_finemapping( cls: type[FinnGenFinemapping], spark: SparkSession, - finngen_finemapping_df: (str | list[str]), - finngen_finemapping_summaries: (str | list[str]), + finngen_susie_finemapping_snp_files: (str | list[str]), + finngen_susie_finemapping_cs_summary_files: (str | list[str]), finngen_release_prefix: str, credset_lbf_threshold: float = 0.8685889638065036, ) -> StudyLocus: """Process the SuSIE finemapping output for FinnGen studies. + The finngen_susie_finemapping_snp_files are files that contain variant summaries with credible set information with following shema: + - trait: phenotype + - region: region for which the fine-mapping was run. + - v, rsid: variant ids + - chromosome + - position + - allele1 + - allele2 + - maf: minor allele frequency + - beta: original marginal beta + - se: original se + - p: original p + - mean: posterior mean beta after fine-mapping + - sd: posterior standard deviation after fine-mapping. + - prob: posterior inclusion probability + - cs: credible set index within region + - lead_r2: r2 value to a lead variant (the one with maximum PIP) in a credible set + - alphax: posterior inclusion probability for the x-th single effect (x := 1..L where L is the number of single effects (causal variants) specified; default: L = 10). + - lbfx: log-Bayes Factor for each variable and single effect (i.e credible set). + - meanx: posterior mean for each variable and single effect (i.e credible set). + - sdx: posterior sd of mean for each variable and single effect (i.e credible set). + As for r11 finngen release these files are ingested from `https://console.cloud.google.com/storage/browser/finngen-public-data-r11/finemap/full/susie/` by + - *.snp.bgz + - *.snp.bgz.tbi + Each file contains index (.tbi) file that is required to read the block gzipped compressed snp file. These files needs to be + downloaded, transfromed from block gzipped to plain gzipped and then uploaded to the storage bucket, before they can be read by spark or read by hail directly as import table. + + The finngen_susie_finemapping_cs_summary_files are files that Contains credible set summaries from SuSiE fine-mapping for all genome-wide significant regions with following schema: + - trait: phenotype + - region: region for which the fine-mapping was run. + - cs: running number for independent credible sets in a region + - cs_log10bf: Log10 bayes factor of comparing the solution of this model (cs independent credible sets) to cs -1 credible sets + - cs_avg_r2: Average correlation R2 between variants in the credible set + - cs_min_r2: minimum r2 between variants in the credible set + - low_purity: boolean (TRUE,FALSE) indicator if the CS is low purity (low min r2) + - cs_size: how many snps does this credible set contain + - good_cs: boolean (TRUE,FALSE) indicator if this CS is considered reliable. IF this is FALSE then top variant reported for the CS will be chosen based on minimum p-value in the credible set, otherwise top variant is chosen by maximum PIP + - cs_id: + - v: top variant (chr:pos:ref:alt) + - p: top variant p-value + - beta: top variant beta + - sd: top variant standard deviation + - prob: overall PIP of the variant in the region + - cs_specific_prob: PIP of the variant in the current credible set (this and previous are typically almost identical) + - 0..n: configured annotation columns. Typical default most_severe,gene_most_severe giving consequence and gene of top variant + These files needs to be downloaded from the `https://console.cloud.google.com/storage/browser/finngen-public-data-r11/finemap/summary/` by *.cred.summary.tsv pattern, + Args: - spark (SparkSession): Spark session object. - finngen_finemapping_df (str | list[str]): SuSIE finemapping output filename(s). - finngen_finemapping_summaries (str | list[str]): filename of SuSIE finemapping summaries. - finngen_release_prefix (str): FinnGen study prefix. + spark (SparkSession): SparkSession object. + finngen_susie_finemapping_snp_files (str | list[str]): SuSIE finemapping output filename(s). + finngen_susie_finemapping_cs_summary_files (str | list[str]): filename of SuSIE finemapping credible set summaries. + finngen_release_prefix (str): Finngen project release prefix. Should look like FINNGEN_R*. credset_lbf_threshold (float, optional): Filter out credible sets below, Default 0.8685889638065036 == np.log10(np.exp(2)), this is threshold from publication. Returns: StudyLocus: Processed SuSIE finemapping output in StudyLocus format. """ + # NOTE: hail allows for importing block gzipped files, spark does not without external libraries. + # check https://github.com/projectglow/glow/blob/36bf6121fbc4ccc33a13b028deb87b63faeba7a9/core/src/main/scala/io/projectglow/vcf/VCFFileFormat.scala#L274 + # how it could be implemented with spark. + bgzip_compressed_snps = cls._infer_block_gzip_compression( + finngen_susie_finemapping_snp_files + ) + + # NOTE: fallback to spark read if not block gzipped file in the input + if bgzip_compressed_snps: + snps_df = hl.import_table( + finngen_susie_finemapping_snp_files, + delimiter="\t", + types=cls.raw_hail_shema, + ).to_spark() + else: + snps_df = ( + spark.read.schema(cls.raw_schema) + .option("delimiter", "\t") + .option("compression", "gzip") + .csv(finngen_susie_finemapping_snp_files, header=True) + ) + processed_finngen_finemapping_df = ( - spark.read.schema(cls.raw_schema) - .option("delimiter", "\t") - .option("compression", "gzip") - .csv(finngen_finemapping_df, header=True) # Drop rows which don't have proper position. - .filter(f.col("position").cast(t.IntegerType()).isNotNull()) + snps_df.filter(f.col("position").cast(t.IntegerType()).isNotNull()) # Drop non credible set SNPs: .filter(f.col("cs").cast(t.IntegerType()) > 0) .select( # Add study idenfitier. - f.concat(f.lit(finngen_release_prefix), f.col("trait")) + f.concat_ws("_", f.lit(finngen_release_prefix), f.col("trait")) .cast(t.StringType()) .alias("studyId"), f.col("region"), @@ -156,8 +312,7 @@ def from_finngen_susie_finemapping( f.col("allele2").cast(t.StringType()).alias("alt"), # Parse p-value into mantissa and exponent. *parse_pvalue(f.col("p")), - # Add beta, standard error, and allele frequency information. - f.col("beta").cast("double"), + # Add standard error, and allele frequency information. f.col("se").cast("double").alias("standardError"), f.col("maf").cast("float").alias("effectAlleleFrequencyFromSource"), f.lit("SuSie").cast("string").alias("finemappingMethod"), @@ -169,6 +324,10 @@ def from_finngen_susie_finemapping( f.col(f"lbf_variable{i}").cast(t.DoubleType()).alias(f"lbf_{i}") for i in range(1, 11) ], + *[ + f.col(f"mean{i}").cast(t.DoubleType()).alias(f"beta_{i}") + for i in range(1, 11) + ], ) .withColumn( "posteriorProbability", @@ -220,16 +379,58 @@ def from_finngen_susie_finemapping( "lbf_9", "lbf_10", ) + .withColumn( + "beta", + f.when(f.col("credibleSetIndex") == 1, f.col("beta_1")) + .when(f.col("credibleSetIndex") == 2, f.col("beta_2")) + .when(f.col("credibleSetIndex") == 3, f.col("beta_3")) + .when(f.col("credibleSetIndex") == 4, f.col("beta_4")) + .when(f.col("credibleSetIndex") == 5, f.col("beta_5")) + .when(f.col("credibleSetIndex") == 6, f.col("beta_6")) + .when(f.col("credibleSetIndex") == 7, f.col("beta_7")) + .when(f.col("credibleSetIndex") == 8, f.col("beta_8")) + .when(f.col("credibleSetIndex") == 9, f.col("beta_9")) + .when(f.col("credibleSetIndex") == 10, f.col("beta_10")), + ) + .drop( + "beta_1", + "beta_2", + "beta_3", + "beta_4", + "beta_5", + "beta_6", + "beta_7", + "beta_8", + "beta_9", + "beta_10", + ) + ) + + bgzip_compressed_cs_summaries = cls._infer_block_gzip_compression( + finngen_susie_finemapping_cs_summary_files ) + # NOTE: fallback to spark read if not block gzipped file in the input + # in case we want to use the raw files from the + # https://console.cloud.google.com/storage/browser/finngen-public-data-r11/finemap/full/susie/*.cred.gz + if bgzip_compressed_cs_summaries: + cs_summary_df = hl.import_table( + finngen_susie_finemapping_cs_summary_files, + delimiter="\t", + types=cls.summary_hail_schema, + ).to_spark() + else: + cs_summary_df = ( + spark.read.schema(cls.summary_schema) + .option("delimiter", "\t") + .csv(finngen_susie_finemapping_cs_summary_files, header=True) + ) + # drop credible sets where logbf > 2. Except when there's only one credible set in region: # 0.8685889638065036 corresponds to np.log10(np.exp(2)), to match the orginal threshold in publication. finngen_finemapping_summaries_df = ( # Read credible set level lbf, it is output as a different file which is not ideal. - spark.read.schema(cls.summary_schema) - .option("delimiter", "\t") - .csv(finngen_finemapping_summaries, header=True) - .select( + cs_summary_df.select( f.col("region"), f.col("trait"), f.col("cs").cast("integer").alias("credibleSetIndex"), @@ -240,7 +441,8 @@ def from_finngen_susie_finemapping( | (f.col("credibleSetIndex") == 1) ) .withColumn( - "studyId", f.concat(f.lit(finngen_release_prefix), f.col("trait")) + "studyId", + f.concat_ws("_", f.lit(finngen_release_prefix), f.col("trait")), ) ) @@ -253,10 +455,7 @@ def from_finngen_susie_finemapping( toploci_df = get_top_ranked_in_window( processed_finngen_finemapping_df, Window.partitionBy("studyId", "region", "credibleSetIndex").orderBy( - *[ - f.col("pValueExponent").asc(), - f.col("pValueMantissa").asc(), - ] + f.desc("posteriorProbability") ), ).select( "variantId", @@ -304,9 +503,19 @@ def from_finngen_susie_finemapping( on=["studyId", "region", "credibleSetIndex"], how="inner", ) + .withColumns( + { + "locusStart": f.split(f.split("region", ":")[1], "-")[0].cast( + "int" + ), + "locusEnd": f.split(f.split("region", ":")[1], "-")[1].cast("int"), + } + ) ).withColumn( "studyLocusId", - StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + StudyLocus.assign_study_locus_id( + ["studyId", "variantId", "finemappingMethod"] + ), ) return StudyLocus( diff --git a/src/gentropy/datasource/finngen/study_index.py b/src/gentropy/datasource/finngen/study_index.py index 6745a2542..dc0389aa1 100644 --- a/src/gentropy/datasource/finngen/study_index.py +++ b/src/gentropy/datasource/finngen/study_index.py @@ -1,54 +1,160 @@ -"""Study Index for Finngen data source.""" +"""Study Index for FinnGen data source.""" + from __future__ import annotations +import re +from typing import TypedDict from urllib.request import urlopen import pyspark.sql.functions as f -from pyspark.sql import SparkSession +from pyspark.sql import DataFrame, SparkSession from gentropy.dataset.study_index import StudyIndex +class FinngenPrefixMatch(TypedDict): + """Class to store the output of the validate_release_prefix.""" + + prefix: str + release: str + + class FinnGenStudyIndex: """Study index dataset from FinnGen. The following information is aggregated/extracted: - - Study ID in the special format (e.g. FINNGEN_R10_*) + - Study ID in the special format (e.g. FINNGEN_R11_*) - Trait name (for example, Amoebiasis) - Number of cases and controls - Link to the summary statistics location + - EFO mapping from curated EFO mapping file Some fields are also populated as constants, such as study type and the initial sample size. """ - finngen_phenotype_table_url: str = "https://r10.finngen.fi/api/phenos" - finngen_release_prefix: str = "FINNGEN_R10" - finngen_summary_stats_url_prefix: str = ( - "gs://finngen-public-data-r10/summary_stats/finngen_R10_" - ) - finngen_summary_stats_url_suffix: str = ".gz" + @staticmethod + def validate_release_prefix(release_prefix: str) -> FinngenPrefixMatch: + """Validate release prefix passed to finngen StudyIndex. + + Args: + release_prefix (str): Finngen release prefix, should be a string like FINNGEN_R*. + + Returns: + FinngenPrefixMatch: Object containing valid prefix and release strings. + + Raises: + ValueError: when incorrect release prefix is provided. + + This method ensures that the trailing underscore is removed from prefix. + """ + pattern = re.compile(r"FINNGEN_(?PR\d+){1}_?") + pattern_match = pattern.match(release_prefix) + if not pattern_match: + raise ValueError( + f"Invalid FinnGen release prefix: {release_prefix}, use the format FINNGEN_R*" + ) + release = pattern_match.group("release").upper() + if release_prefix.endswith("_"): + release_prefix = release_prefix[:-1] + return FinngenPrefixMatch(prefix=release_prefix, release=release) + + @staticmethod + def read_efo_curation(session: SparkSession, url: str) -> DataFrame: + """Read efo curation from provided url. + + Args: + session (SparkSession): Session to use when reading the mapping file. + url (str): Url to the mapping file. The file provided should be a tsv file. + + Returns: + DataFrame: DataFrame with EFO mappings. + + Example of the file can be found in https://raw.githubusercontent.com/opentargets/curation/refs/heads/master/mappings/disease/manual_string.tsv. + """ + csv_data = urlopen(url).readlines() + csv_rows = [row.decode("utf8") for row in csv_data] + rdd = session.sparkContext.parallelize(csv_rows) + # NOTE: type annotations for spark.read.csv miss the fact that the first param can be [RDD[str]] + efo_curation_mapping_df = session.read.csv(rdd, header=True, sep="\t") + return efo_curation_mapping_df + + @staticmethod + def join_efo_mapping( + study_index: StudyIndex, + efo_curation_mapping: DataFrame, + finngen_release: str, + ) -> StudyIndex: + """Add EFO mapping to the Finngen study index table. + + This function performs inner join on table of EFO mappings to the study index table by trait name. + All studies without EFO traits are dropped. The EFO mappings are then aggregated into lists per + studyId. + + NOTE: preserve all studyId entries even if they don't have EFO mappings. + This is to avoid discrepancies between `study_index` and `credible_set` `studyId` column. + The rows with missing EFO mappings will be dropped in the study_index validation step. + + Args: + study_index (StudyIndex): Study index table. + efo_curation_mapping (DataFrame): Dataframe with EFO mappings. + finngen_release (str): FinnGen release. + + Returns: + StudyIndex: Study index table with added EFO mappings. + """ + efo_mappings = ( + efo_curation_mapping.withColumn("STUDY", f.upper(f.col("STUDY"))) + .filter(f.col("STUDY").contains("FINNGEN")) + .filter(f.upper(f.col("STUDY")).contains(finngen_release)) + .select( + f.regexp_replace(f.col("SEMANTIC_TAG"), r"^.*/", "").alias( + "traitFromSourceMappedId" + ), + f.col("PROPERTY_VALUE").alias("traitFromSource"), + ) + ) + + si_df = study_index.df.join( + efo_mappings, on="traitFromSource", how="left_outer" + ) + common_cols = [c for c in si_df.columns if c != "traitFromSourceMappedId"] + si_df = si_df.groupby(common_cols).agg( + f.collect_list("traitFromSourceMappedId").alias("traitFromSourceMappedIds") + ) + return StudyIndex(_df=si_df, _schema=StudyIndex.get_schema()) @classmethod def from_source( cls: type[FinnGenStudyIndex], spark: SparkSession, + finngen_phenotype_table_url: str, + finngen_release_prefix: str, + finngen_summary_stats_url_prefix: str, + finngen_summary_stats_url_suffix: str, + sample_size: int, ) -> StudyIndex: """This function ingests study level metadata from FinnGen. Args: spark (SparkSession): Spark session object. + finngen_phenotype_table_url (str): URL to the FinnGen phenotype table. + finngen_release_prefix (str): FinnGen release prefix. + finngen_summary_stats_url_prefix (str): FinnGen summary stats URL prefix. + finngen_summary_stats_url_suffix (str): FinnGen summary stats URL suffix. + sample_size (int): Number of individuals participated in sample collection. Returns: StudyIndex: Parsed and annotated FinnGen study table. """ - json_data = urlopen(cls.finngen_phenotype_table_url).read().decode("utf-8") + json_data = urlopen(finngen_phenotype_table_url).read().decode("utf-8") rdd = spark.sparkContext.parallelize([json_data]) raw_df = spark.read.json(rdd) + return StudyIndex( _df=raw_df.select( f.concat( - f.lit(f"{cls.finngen_release_prefix}_"), f.col("phenocode") + f.concat_ws("_", f.lit(finngen_release_prefix), f.col("phenocode")) ).alias("studyId"), f.col("phenostring").alias("traitFromSource"), f.col("num_cases").cast("integer").alias("nCases"), @@ -56,24 +162,24 @@ def from_source( (f.col("num_cases") + f.col("num_controls")) .cast("integer") .alias("nSamples"), - f.lit(cls.finngen_release_prefix).alias("projectId"), + f.lit(finngen_release_prefix).alias("projectId"), f.lit("gwas").alias("studyType"), f.lit(True).alias("hasSumstats"), - f.lit("377,277 (210,870 females and 166,407 males)").alias( + f.lit("453,733 (254,618 females and 199,115 males)").alias( "initialSampleSize" ), f.array( f.struct( - f.lit(377277).cast("integer").alias("sampleSize"), + f.lit(sample_size).cast("integer").alias("sampleSize"), f.lit("Finnish").alias("ancestry"), ) ).alias("discoverySamples"), # Cohort label is consistent with GWAS Catalog curation. f.array(f.lit("FinnGen")).alias("cohorts"), f.concat( - f.lit(cls.finngen_summary_stats_url_prefix), + f.lit(finngen_summary_stats_url_prefix), f.col("phenocode"), - f.lit(cls.finngen_summary_stats_url_suffix), + f.lit(finngen_summary_stats_url_suffix), ).alias("summarystatsLocation"), ).withColumn( "ldPopulationStructure", diff --git a/src/gentropy/datasource/finngen/summary_stats.py b/src/gentropy/datasource/finngen/summary_stats.py index 0d77f7d5c..08403bed5 100644 --- a/src/gentropy/datasource/finngen/summary_stats.py +++ b/src/gentropy/datasource/finngen/summary_stats.py @@ -50,7 +50,6 @@ def from_source( Returns: SummaryStatistics: Processed summary statistics dataset """ - study_id = raw_file.split("/")[-1].split(".")[0].upper() processed_summary_stats_df = ( spark.read.schema(cls.raw_schema) .option("delimiter", "\t") @@ -59,7 +58,11 @@ def from_source( .filter(f.col("pos").cast(t.IntegerType()).isNotNull()) .select( # From the full path, extracts just the filename, and converts to upper case to get the study ID. - f.lit(study_id).alias("studyId"), + f.upper( + f.regexp_extract( + f.input_file_name(), r"([^/]+)(\.tsv\.gz|\.gz|\.tsv)", 1 + ) + ).alias("studyId"), # Add variant information. f.concat_ws( "_", diff --git a/src/gentropy/datasource/finngen_ukb_meta/__init__.py b/src/gentropy/datasource/finngen_ukb_meta/__init__.py new file mode 100644 index 000000000..8d6cfd752 --- /dev/null +++ b/src/gentropy/datasource/finngen_ukb_meta/__init__.py @@ -0,0 +1,3 @@ +"""FinnGen UKB meta-analysis data source.""" + +from __future__ import annotations diff --git a/src/gentropy/datasource/finngen_ukb_meta/study_index.py b/src/gentropy/datasource/finngen_ukb_meta/study_index.py new file mode 100644 index 000000000..eefb2da7c --- /dev/null +++ b/src/gentropy/datasource/finngen_ukb_meta/study_index.py @@ -0,0 +1,88 @@ +"""Study Index for Finngen data source.""" + +from __future__ import annotations + +from urllib.request import urlopen + +import pyspark.sql.functions as f +from pyspark.sql import SparkSession + +from gentropy.config import FinngenStudiesConfig +from gentropy.dataset.study_index import StudyIndex +from gentropy.datasource.finngen.study_index import FinnGenStudyIndex + + +class FinngenUkbMetaStudyIndex(StudyIndex): + """Study index dataset from FinnGen UKB meta-analysis.""" + + @classmethod + def from_source( + cls: type[FinngenUkbMetaStudyIndex], + spark: SparkSession, + raw_study_index_path_from_tsv: str, + efo_curation_mapping_url: str = FinngenStudiesConfig().efo_curation_mapping_url, + ) -> StudyIndex: + """This function ingests study level metadata from FinnGen UKB meta-analysis. + + Args: + spark (SparkSession): Spark session object. + raw_study_index_path_from_tsv (str): Raw study index path. + efo_curation_mapping_url (str): URL to the EFO curation mapping file. + + Returns: + StudyIndex: Parsed and annotated FinnGen UKB meta-analysis study table. + """ + # Read the raw study index and process. + study_index_df = spark.read.csv( + raw_study_index_path_from_tsv, sep="\t", header=True + ).select( + f.lit("gwas").alias("studyType"), + f.lit("FINNGEN_R11_UKB_META").alias("projectId"), + f.col("_gentropy_study_id").alias("studyId"), + f.col("name").alias("traitFromSource"), + f.lit(True).alias("hasSumstats"), + f.col("_gentropy_summary_stats_link").alias("summarystatsLocation"), + ( + f.col("fg_n_cases") + + f.col("ukbb_n_cases") + + f.col("fg_n_controls") + + f.col("ukbb_n_controls") + ) + .cast("integer") + .alias("nSamples"), + f.array( + f.struct( + (f.col("fg_n_cases") + f.col("fg_n_controls")) + .cast("integer") + .alias("sampleSize"), + f.lit("Finnish").alias("ancestry"), + ), + f.struct( + (f.col("ukbb_n_cases") + f.col("ukbb_n_controls")) + .cast("integer") + .alias("sampleSize"), + f.lit("European").alias("ancestry"), + ), + ).alias("discoverySamples"), + ) + # Add population structure. + study_index_df = study_index_df.withColumn( + "ldPopulationStructure", + cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + ) + # Create study index. + study_index = StudyIndex( + _df=study_index_df, + _schema=StudyIndex.get_schema(), + ) + # Add EFO mappings. + csv_data = urlopen(efo_curation_mapping_url).readlines() + csv_rows = [row.decode("utf8") for row in csv_data] + rdd = spark.sparkContext.parallelize(csv_rows) + efo_curation_mapping = spark.read.csv(rdd, header=True, sep="\t") + study_index = FinnGenStudyIndex.join_efo_mapping( + study_index, + efo_curation_mapping, + finngen_release="R11", + ) + return study_index diff --git a/src/gentropy/datasource/finngen_ukb_meta/summary_stats.py b/src/gentropy/datasource/finngen_ukb_meta/summary_stats.py new file mode 100644 index 000000000..b77d57966 --- /dev/null +++ b/src/gentropy/datasource/finngen_ukb_meta/summary_stats.py @@ -0,0 +1,67 @@ +"""Summary statistics ingestion for FinnGen UKB meta-analysis.""" + +from __future__ import annotations + +from dataclasses import dataclass + +import pyspark.sql.functions as f +from pyspark.sql import SparkSession + +from gentropy.common.harmonise import harmonise_summary_stats +from gentropy.dataset.summary_statistics import SummaryStatistics + + +@dataclass +class FinngenUkbMetaSummaryStats: + """Summary statistics dataset for FinnGen UKB meta-analysis.""" + + @classmethod + def from_source( + cls: type[FinngenUkbMetaSummaryStats], + spark: SparkSession, + raw_summary_stats_path: str, + tmp_variant_annotation_path: str, + chromosome: str, + study_index_path: str, + ) -> SummaryStatistics: + """Ingest and harmonise all summary stats for FinnGen UKB meta-analysis data. + + Args: + spark (SparkSession): Spark session object. + raw_summary_stats_path (str): Input raw summary stats path. + tmp_variant_annotation_path (str): Input variant annotation dataset path. + chromosome (str): Which chromosome to process. + study_index_path (str): The path to study index, which is necessary in some cases to populate the sample size column. + + Returns: + SummaryStatistics: Processed summary statistics dataset for a given chromosome. + """ + # Run the harmonisation steps. + df = harmonise_summary_stats( + spark, + raw_summary_stats_path, + tmp_variant_annotation_path, + chromosome, + colname_position="POS", + colname_allele0="REF", + colname_allele1="ALT", + colname_a1freq=None, + colname_info=None, + colname_beta="all_inv_var_meta_beta", + colname_se="all_inv_var_meta_sebeta", + colname_mlog10p="all_inv_var_meta_mlogp", + colname_n=None, + ) + + # Populate the sample size column from the study index. + study_index = spark.read.parquet(study_index_path).select( + "studyId", + f.col("nSamples").cast("integer").alias("sampleSize") + ) + df = df.join(study_index, on=["studyId"], how="inner") + + # Create the summary statistics object. + return SummaryStatistics( + _df=df, + _schema=SummaryStatistics.get_schema(), + ) diff --git a/src/gentropy/datasource/gnomad/ld.py b/src/gentropy/datasource/gnomad/ld.py index 1d2d6c18f..e53410d69 100644 --- a/src/gentropy/datasource/gnomad/ld.py +++ b/src/gentropy/datasource/gnomad/ld.py @@ -1,54 +1,56 @@ """Step to import filtered version of a LD matrix (block matrix).""" + from __future__ import annotations import sys -from dataclasses import dataclass, field from functools import reduce from typing import TYPE_CHECKING import hail as hl +import numpy as np import pyspark.sql.functions as f from hail.linalg import BlockMatrix from pyspark.sql import Window from gentropy.common.spark_helpers import get_top_ranked_in_window, get_value_from_row -from gentropy.common.utils import _liftover_loci, convert_gnomad_position_to_ensembl +from gentropy.common.types import LD_Population +from gentropy.common.utils import _liftover_loci +from gentropy.config import LDIndexConfig from gentropy.dataset.ld_index import LDIndex if TYPE_CHECKING: - from pyspark.sql import DataFrame + from pyspark.sql import DataFrame, Row -@dataclass class GnomADLDMatrix: - """Toolset ot interact with GnomAD LD dataset (version: r2.1.1). - - Datasets are accessed in Hail's native format, as provided by the [GnomAD consortium](https://gnomad.broadinstitute.org/downloads/#v2-linkage-disequilibrium). - - Attributes: - ld_matrix_template (str): Template for the LD matrix path. Defaults to "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm". - ld_index_raw_template (str): Template for the LD index path. Defaults to "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht". - grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates. Defaults to "gs://hail-common/references/grch37_to_grch38.over.chain.gz". - ld_populations (list[str]): List of populations to use to build the LDIndex. Defaults to ["afr", "amr", "asj", "eas", "fin", "nfe", "nwe", "seu"]. - """ - - ld_matrix_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm" - ld_index_raw_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht" - grch37_to_grch38_chain_path: str = ( - "gs://hail-common/references/grch37_to_grch38.over.chain.gz" - ) - ld_populations: list[str] = field( - default_factory=lambda: [ - "afr", # African-American - "amr", # American Admixed/Latino - "asj", # Ashkenazi Jewish - "eas", # East Asian - "fin", # Finnish - "nfe", # Non-Finnish European - "nwe", # Northwestern European - "seu", # Southeastern European - ] - ) + """Toolset ot interact with GnomAD LD dataset (version: r2.1.1).""" + + def __init__( + self, + ld_matrix_template: str = LDIndexConfig().ld_matrix_template, + ld_index_raw_template: str = LDIndexConfig().ld_index_raw_template, + grch37_to_grch38_chain_path: str = LDIndexConfig().grch37_to_grch38_chain_path, + ld_populations: list[LD_Population | str] = LDIndexConfig().ld_populations, + liftover_ht_path: str = LDIndexConfig().liftover_ht_path, + ): + """Initialize. + + Datasets are accessed in Hail's native format, as provided by the [GnomAD consortium](https://gnomad.broadinstitute.org/downloads/#v2-linkage-disequilibrium). + + Args: + ld_matrix_template (str): Template for the LD matrix path. + ld_index_raw_template (str): Template for the LD index path. + grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates. + ld_populations (list[LD_Population | str]): List of populations to use to build the LDIndex. + liftover_ht_path (str): Path to the liftover ht file. + + Default values are set in LDIndexConfig. + """ + self.ld_matrix_template = ld_matrix_template + self.ld_index_raw_template = ld_index_raw_template + self.grch37_to_grch38_chain_path = grch37_to_grch38_chain_path + self.ld_populations = ld_populations + self.liftover_ht_path = liftover_ht_path @staticmethod def _aggregate_ld_index_across_populations( @@ -175,24 +177,15 @@ def _process_variant_indices( ld_index_38.to_spark() # Filter out variants where the liftover failed .filter(f.col("`locus_GRCh38.position`").isNotNull()) - .withColumn( - "chromosome", f.regexp_replace("`locus_GRCh38.contig`", "chr", "") - ) - .withColumn( - "position", - convert_gnomad_position_to_ensembl( - f.col("`locus_GRCh38.position`"), - f.col("`alleles`").getItem(0), - f.col("`alleles`").getItem(1), - ), - ) .select( - "chromosome", - "position", + f.regexp_replace("`locus_GRCh38.contig`", "chr", "").alias( + "chromosome" + ), + f.col("`locus_GRCh38.position`").alias("position"), f.concat_ws( "_", - f.col("chromosome"), - f.col("position"), + f.regexp_replace("`locus_GRCh38.contig`", "chr", ""), + f.col("`locus_GRCh38.position`"), f.col("`alleles`").getItem(0), f.col("`alleles`").getItem(1), ).alias("variantId"), @@ -218,9 +211,9 @@ def _resolve_variant_indices( DataFrame: Dataframe with variant IDs instead of `i` and `j` indices """ ld_index_i = ld_index.selectExpr( - "idx as i", "variantId as variantId_i", "chromosome" + "idx as i", "variantId as variantIdI", "chromosome" ) - ld_index_j = ld_index.selectExpr("idx as j", "variantId as variantId_j") + ld_index_j = ld_index.selectExpr("idx as j", "variantId as variantIdJ") return ( ld_matrix.join(ld_index_i, on="i", how="inner") .join(ld_index_j, on="j", how="inner") @@ -238,35 +231,35 @@ def _transpose_ld_matrix(ld_matrix: DataFrame) -> DataFrame: DataFrame: Square LD matrix without diagonal duplicates Examples: - >>> df = spark.createDataFrame( - ... [ - ... (1, 1, 1.0, "1", "AFR"), - ... (1, 2, 0.5, "1", "AFR"), - ... (2, 2, 1.0, "1", "AFR"), - ... ], - ... ["variantId_i", "variantId_j", "r", "chromosome", "population"], - ... ) - >>> GnomADLDMatrix._transpose_ld_matrix(df).show() - +-----------+-----------+---+----------+----------+ - |variantId_i|variantId_j| r|chromosome|population| - +-----------+-----------+---+----------+----------+ - | 1| 2|0.5| 1| AFR| - | 1| 1|1.0| 1| AFR| - | 2| 1|0.5| 1| AFR| - | 2| 2|1.0| 1| AFR| - +-----------+-----------+---+----------+----------+ - + >>> df = spark.createDataFrame( + ... [ + ... (1, 1, 1.0, "1", "AFR"), + ... (1, 2, 0.5, "1", "AFR"), + ... (2, 2, 1.0, "1", "AFR"), + ... ], + ... ["variantIdI", "variantIdJ", "r", "chromosome", "population"], + ... ) + >>> GnomADLDMatrix._transpose_ld_matrix(df).show() + +----------+----------+---+----------+----------+ + |variantIdI|variantIdJ| r|chromosome|population| + +----------+----------+---+----------+----------+ + | 1| 2|0.5| 1| AFR| + | 1| 1|1.0| 1| AFR| + | 2| 1|0.5| 1| AFR| + | 2| 2|1.0| 1| AFR| + +----------+----------+---+----------+----------+ + """ ld_matrix_transposed = ld_matrix.selectExpr( - "variantId_i as variantId_j", - "variantId_j as variantId_i", + "variantIdI as variantIdJ", + "variantIdJ as variantIdI", "r", "chromosome", "population", ) - return ld_matrix.filter( - f.col("variantId_i") != f.col("variantId_j") - ).unionByName(ld_matrix_transposed) + return ld_matrix.filter(f.col("variantIdI") != f.col("variantIdJ")).unionByName( + ld_matrix_transposed + ) def as_ld_index( self: GnomADLDMatrix, @@ -307,8 +300,8 @@ def as_ld_index( GnomADLDMatrix._transpose_ld_matrix( reduce(lambda df1, df2: df1.unionByName(df2), ld_indices_unaggregated) ) - .withColumnRenamed("variantId_i", "variantId") - .withColumnRenamed("variantId_j", "tagVariantId") + .withColumnRenamed("variantIdI", "variantId") + .withColumnRenamed("variantIdJ", "tagVariantId") ) return LDIndex( _df=self._aggregate_ld_index_across_populations(ld_index_unaggregated), @@ -345,7 +338,6 @@ def get_ld_variants( & (f.col("position") <= end) ) .select("chromosome", "position", "variantId", "idx") - .persist() ) if ld_index_df.limit(1).count() == 0: @@ -395,7 +387,7 @@ def _extract_square_matrix( .join( ld_index_df.select( f.col("idx").alias("idx_i"), - f.col("variantId").alias("variantId_i"), + f.col("variantId").alias("variantIdI"), ), on="idx_i", how="inner", @@ -403,12 +395,12 @@ def _extract_square_matrix( .join( ld_index_df.select( f.col("idx").alias("idx_j"), - f.col("variantId").alias("variantId_j"), + f.col("variantId").alias("variantIdJ"), ), on="idx_j", how="inner", ) - .select("variantId_i", "variantId_j", "r") + .select("variantIdI", "variantIdJ", "r") ) def get_ld_matrix_slice( @@ -448,3 +440,115 @@ def get_ld_matrix_slice( .alias("r"), ) ) + + def get_locus_index( + self: GnomADLDMatrix, + study_locus_row: Row, + radius: int = 500_000, + major_population: str = "nfe", + ) -> DataFrame: + """Extract hail matrix index from StudyLocus rows. + + Args: + study_locus_row (Row): Study-locus row + radius (int): Locus radius to extract from gnomad matrix + major_population (str): Major population to extract from gnomad matrix, default is "nfe" + + Returns: + DataFrame: Returns the index of the gnomad matrix for the locus + + """ + chromosome = str("chr" + study_locus_row["chromosome"]) + start = study_locus_row["position"] - radius + end = study_locus_row["position"] + radius + + liftover_ht = hl.read_table(self.liftover_ht_path) + liftover_ht = ( + liftover_ht.filter( + (liftover_ht.locus.contig == chromosome) + & (liftover_ht.locus.position >= start) + & (liftover_ht.locus.position <= end) + ) + .key_by() + .select("locus", "alleles", "original_locus") + .key_by("original_locus", "alleles") + .naive_coalesce(20) + ) + + hail_index = hl.read_table( + self.ld_index_raw_template.format(POP=major_population) + ) + + joined_index = ( + liftover_ht.join(hail_index, how="inner").order_by("idx").to_spark() + ) + + return joined_index + + @staticmethod + def get_numpy_matrix( + locus_index: DataFrame, + gnomad_ancestry: str = "nfe", + ) -> np.ndarray: + """Extract the LD block matrix for a locus. + + Args: + locus_index (DataFrame): hail matrix variant index table + gnomad_ancestry (str): GnomAD major ancestry label eg. `nfe` + + Returns: + np.ndarray: LD block matrix for the locus + """ + idx = [row["idx"] for row in locus_index.select("idx").collect()] + + half_matrix = ( + BlockMatrix.read( + GnomADLDMatrix().ld_matrix_template.format(POP=gnomad_ancestry) + ) + .filter(idx, idx) + .to_numpy() + ) + + return (half_matrix + half_matrix.T) - np.diag(np.diag(half_matrix)) + + def get_locus_index_boundaries( + self: GnomADLDMatrix, + study_locus_row: Row, + major_population: str = "nfe", + ) -> DataFrame: + """Extract hail matrix index from StudyLocus rows. + + Args: + study_locus_row (Row): Study-locus row + major_population (str): Major population to extract from gnomad matrix, default is "nfe" + + Returns: + DataFrame: Returns the index of the gnomad matrix for the locus + + """ + chromosome = str("chr" + study_locus_row["chromosome"]) + start = int(study_locus_row["locusStart"]) + end = int(study_locus_row["locusEnd"]) + + liftover_ht = hl.read_table(self.liftover_ht_path) + liftover_ht = ( + liftover_ht.filter( + (liftover_ht.locus.contig == chromosome) + & (liftover_ht.locus.position >= start) + & (liftover_ht.locus.position <= end) + ) + .key_by() + .select("locus", "alleles", "original_locus") + .key_by("original_locus", "alleles") + .naive_coalesce(20) + ) + + hail_index = hl.read_table( + self.ld_index_raw_template.format(POP=major_population) + ) + + joined_index = ( + liftover_ht.join(hail_index, how="inner").order_by("idx").to_spark() + ) + + return joined_index diff --git a/src/gentropy/datasource/gnomad/variants.py b/src/gentropy/datasource/gnomad/variants.py index 58f5f8093..0575261c2 100644 --- a/src/gentropy/datasource/gnomad/variants.py +++ b/src/gentropy/datasource/gnomad/variants.py @@ -1,68 +1,46 @@ """Import gnomAD variants dataset.""" + from __future__ import annotations -from dataclasses import dataclass, field from typing import TYPE_CHECKING import hail as hl +import pyspark.sql.functions as f +import pyspark.sql.types as t -from gentropy.dataset.variant_annotation import VariantAnnotation +from gentropy.common.types import VariantPopulation +from gentropy.config import GnomadVariantConfig, VariantIndexConfig +from gentropy.dataset.variant_index import VariantIndex if TYPE_CHECKING: - from hail.expr.expressions import Int32Expression, StringExpression + pass -@dataclass class GnomADVariants: - """GnomAD variants included in the GnomAD genomes dataset. - - Attributes: - gnomad_genomes (str): Path to gnomAD genomes hail table. Defaults to gnomAD's 4.0 release. - chain_hail_38_37 (str): Path to GRCh38 to GRCh37 chain file. Defaults to Hail's chain file. - populations (list[str]): List of populations to include. Defaults to all populations. - """ - - gnomad_genomes: str = "gs://gcp-public-data--gnomad/release/4.0/ht/genomes/gnomad.genomes.v4.0.sites.ht/" - chain_hail_38_37: str = "gs://hail-common/references/grch38_to_grch37.over.chain.gz" - populations: list[str] = field( - default_factory=lambda: [ - "afr", # African-American - "amr", # American Admixed/Latino - "ami", # Amish ancestry - "asj", # Ashkenazi Jewish - "eas", # East Asian - "fin", # Finnish - "nfe", # Non-Finnish European - "mid", # Middle Eastern - "sas", # South Asian - "remaining", # Other - ] - ) - - @staticmethod - def _convert_gnomad_position_to_ensembl_hail( - position: Int32Expression, - reference: StringExpression, - alternate: StringExpression, - ) -> Int32Expression: - """Convert GnomAD variant position to Ensembl variant position in hail table. - - For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, the position is unchanged. - More info about the problem: https://www.biostars.org/p/84686/ + """GnomAD variants included in the GnomAD genomes dataset.""" + + def __init__( + self, + gnomad_genomes_path: str = GnomadVariantConfig().gnomad_genomes_path, + gnomad_variant_populations: list[ + VariantPopulation | str + ] = GnomadVariantConfig().gnomad_variant_populations, + hash_threshold: int = VariantIndexConfig().hash_threshold, + ): + """Initialize. Args: - position (Int32Expression): Position of the variant in the GnomAD genome. - reference (StringExpression): The reference allele. - alternate (StringExpression): The alternate allele + gnomad_genomes_path (str): Path to gnomAD genomes hail table. + gnomad_variant_populations (list[VariantPopulation | str]): List of populations to include. + hash_threshold (int): longer variant ids will be hashed. - Returns: - Int32Expression: The position of the variant according to Ensembl genome. + All defaults are stored in GnomadVariantConfig. """ - return hl.if_else( - (reference.length() > 1) | (alternate.length() > 1), position + 1, position - ) + self.gnomad_genomes_path = gnomad_genomes_path + self.gnomad_variant_populations = gnomad_variant_populations + self.lenght_threshold = hash_threshold - def as_variant_annotation(self: GnomADVariants) -> VariantAnnotation: + def as_variant_index(self: GnomADVariants) -> VariantIndex: """Generate variant annotation dataset from gnomAD. Some relevant modifications to the original dataset are: @@ -72,28 +50,23 @@ def as_variant_annotation(self: GnomADVariants) -> VariantAnnotation: 3. Field names are converted to camel case to follow the convention. Returns: - VariantAnnotation: Variant annotation dataset + VariantIndex: GnomaAD variants dataset. """ # Load variants dataset ht = hl.read_table( - self.gnomad_genomes, + self.gnomad_genomes_path, _load_refs=False, ) - # Liftover - grch37 = hl.get_reference("GRCh37") - grch38 = hl.get_reference("GRCh38") - grch38.add_liftover(self.chain_hail_38_37, grch37) - # Drop non biallelic variants ht = ht.filter(ht.alleles.length() == 2) - # Liftover - ht = ht.annotate(locus_GRCh37=hl.liftover(ht.locus, "GRCh37")) + # Select relevant fields and nested records to create class - return VariantAnnotation( + return VariantIndex( _df=( ht.select( - gnomadVariantId=hl.str("-").join( + # Extract mandatory fields: + variantId=hl.str("_").join( [ ht.locus.contig.replace("chr", ""), hl.str(ht.locus.position), @@ -102,68 +75,80 @@ def as_variant_annotation(self: GnomADVariants) -> VariantAnnotation: ] ), chromosome=ht.locus.contig.replace("chr", ""), - position=GnomADVariants._convert_gnomad_position_to_ensembl_hail( - ht.locus.position, ht.alleles[0], ht.alleles[1] - ), - variantId=hl.str("_").join( - [ - ht.locus.contig.replace("chr", ""), - hl.str( - GnomADVariants._convert_gnomad_position_to_ensembl_hail( - ht.locus.position, ht.alleles[0], ht.alleles[1] - ) - ), - ht.alleles[0], - ht.alleles[1], - ] - ), - chromosomeB37=ht.locus_GRCh37.contig.replace("chr", ""), - positionB37=ht.locus_GRCh37.position, + position=ht.locus.position, referenceAllele=ht.alleles[0], alternateAllele=ht.alleles[1], - rsIds=ht.rsid, - alleleType=ht.allele_info.allele_type, + # Extract allele frequencies from populations of interest: alleleFrequencies=hl.set( - [f"{pop}_adj" for pop in self.populations] + [f"{pop}_adj" for pop in self.gnomad_variant_populations] ).map( lambda p: hl.struct( populationName=p, alleleFrequency=ht.freq[ht.globals.freq_index_dict[p]].AF, ) ), - vep=hl.struct( - mostSevereConsequence=ht.vep.most_severe_consequence, - transcriptConsequences=hl.map( - lambda x: hl.struct( - aminoAcids=x.amino_acids, - consequenceTerms=x.consequence_terms, - geneId=x.gene_id, - lof=x.lof, + # Extract in silico predictors: + inSilicoPredictors=hl.array( + [ + hl.struct( + method=hl.str("spliceai"), + assessment=hl.missing(hl.tstr), + score=hl.expr.functions.float32( + ht.in_silico_predictors.spliceai_ds_max + ), + assessmentFlag=hl.missing(hl.tstr), + targetId=hl.missing(hl.tstr), ), - # Only keeping canonical transcripts - ht.vep.transcript_consequences.filter( - lambda x: (x.canonical == 1) - & (x.gene_symbol_source == "HGNC") + hl.struct( + method=hl.str("pangolin"), + assessment=hl.missing(hl.tstr), + score=hl.expr.functions.float32( + ht.in_silico_predictors.pangolin_largest_ds + ), + assessmentFlag=hl.missing(hl.tstr), + targetId=hl.missing(hl.tstr), ), - ), + ] ), - inSilicoPredictors=hl.struct( - cadd=hl.struct( - phred=ht.in_silico_predictors.cadd.phred, - raw=ht.in_silico_predictors.cadd.raw_score, - ), - revelMax=ht.in_silico_predictors.revel_max, - spliceaiDsMax=ht.in_silico_predictors.spliceai_ds_max, - pangolinLargestDs=ht.in_silico_predictors.pangolin_largest_ds, - phylop=ht.in_silico_predictors.phylop, - siftMax=ht.in_silico_predictors.sift_max, - polyphenMax=ht.in_silico_predictors.polyphen_max, + # Extract cross references to GnomAD: + dbXrefs=hl.array( + [ + hl.struct( + id=hl.str("-").join( + [ + ht.locus.contig.replace("chr", ""), + hl.str(ht.locus.position), + ht.alleles[0], + ht.alleles[1], + ] + ), + source=hl.str("gnomad"), + ) + ] ), ) .key_by("chromosome", "position") .drop("locus", "alleles") .select_globals() .to_spark(flatten=False) + .withColumns( + { + # Once The parsing is done, we have to drop objects with no score from inSilicoPredictors: + "inSilicoPredictors": f.filter( + f.col("inSilicoPredictors"), + lambda predictor: predictor["score"].isNotNull(), + ), + # Generate a variantId that is hashed for long variant ids: + "variantId": VariantIndex.hash_long_variant_ids( + f.col("variantId"), + f.col("chromosome"), + f.col("position"), + self.lenght_threshold, + ), + # We are not capturing the most severe consequence from GnomAD, but this column needed for the schema: + "mostSevereConsequenceId": f.lit(None).cast(t.StringType()), + } + ) ), - _schema=VariantAnnotation.get_schema(), + _schema=VariantIndex.get_schema(), ) diff --git a/src/gentropy/datasource/gwas_catalog/associations.py b/src/gentropy/datasource/gwas_catalog/associations.py index 5ff499f2c..31238e425 100644 --- a/src/gentropy/datasource/gwas_catalog/associations.py +++ b/src/gentropy/datasource/gwas_catalog/associations.py @@ -1,4 +1,5 @@ """Study Locus for GWAS Catalog data source.""" + from __future__ import annotations import importlib.resources as pkg_resources @@ -7,30 +8,63 @@ from itertools import chain from typing import TYPE_CHECKING -import numpy as np import pyspark.sql.functions as f -from pyspark.sql.types import DoubleType, IntegerType, LongType +from pyspark.sql.types import DoubleType, FloatType, IntegerType, StringType from pyspark.sql.window import Window from gentropy.assets import data from gentropy.common.spark_helpers import ( - calculate_neglog_pvalue, get_record_with_maximum_value, - pvalue_to_zscore, + get_standard_error_from_confidence_interval, ) -from gentropy.common.utils import parse_efos +from gentropy.common.utils import convert_odds_ratio_to_beta, parse_efos +from gentropy.config import WindowBasedClumpingStepConfig from gentropy.dataset.study_locus import StudyLocus, StudyLocusQualityCheck if TYPE_CHECKING: from pyspark.sql import Column, DataFrame - from gentropy.dataset.variant_annotation import VariantAnnotation + from gentropy.dataset.variant_index import VariantIndex @dataclass class GWASCatalogCuratedAssociationsParser: """GWAS Catalog curated associations parser.""" + @staticmethod + def convert_gnomad_position_to_ensembl( + position: Column, reference: Column, alternate: Column + ) -> Column: + """Convert GnomAD variant position to Ensembl variant position. + + For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, + the position is unchanged. More info about the problem: https://www.biostars.org/p/84686/ + + Args: + position (Column): Position of the variant in GnomAD's coordinates system. + reference (Column): The reference allele in GnomAD's coordinates system. + alternate (Column): The alternate allele in GnomAD's coordinates system. + + Returns: + Column: The position of the variant in the Ensembl genome. + + Examples: + >>> d = [(1, "A", "C"), (2, "AA", "C"), (3, "A", "AA")] + >>> df = spark.createDataFrame(d).toDF("position", "reference", "alternate") + >>> df.withColumn("new_position", GWASCatalogCuratedAssociationsParser.convert_gnomad_position_to_ensembl(f.col("position"), f.col("reference"), f.col("alternate"))).show() + +--------+---------+---------+------------+ + |position|reference|alternate|new_position| + +--------+---------+---------+------------+ + | 1| A| C| 1| + | 2| AA| C| 3| + | 3| A| AA| 4| + +--------+---------+---------+------------+ + + """ + return f.when( + (f.length(reference) > 1) | (f.length(alternate) > 1), position + 1 + ).otherwise(position) + @staticmethod def _parse_pvalue(pvalue: Column) -> tuple[Column, Column]: """Parse p-value column. @@ -106,8 +140,8 @@ def _normalise_pvaluetext(p_value_text: Column) -> Column: ) @staticmethod - def _normalise_risk_allele(risk_allele: Column) -> Column: - """Normalised risk allele column to a standardised format. + def _extract_risk_allele(risk_allele: Column) -> Column: + """Extract risk allele from provided "STRONGEST SNP-RISK ALLELE" input column. If multiple risk alleles are present, the first one is returned. @@ -121,7 +155,7 @@ def _normalise_risk_allele(risk_allele: Column) -> Column: >>> import pyspark.sql.types as t >>> d = [("rs1234-A-G"), ("rs1234-A"), ("rs1234-A; rs1235-G")] >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.withColumn('normalised', GWASCatalogCuratedAssociationsParser._normalise_risk_allele(f.col('value'))).show() + >>> df.withColumn('normalised', GWASCatalogCuratedAssociationsParser._extract_risk_allele(f.col('value'))).show() +------------------+----------+ | value|normalised| +------------------+----------+ @@ -130,7 +164,6 @@ def _normalise_risk_allele(risk_allele: Column) -> Column: |rs1234-A; rs1235-G| A| +------------------+----------+ - """ # GWAS Catalog to risk allele mapping return f.split(f.split(risk_allele, "; ").getItem(0), "-").getItem(1) @@ -161,14 +194,14 @@ def _collect_rsids( return f.array_distinct(f.array(snp_id, snp_id_current, risk_allele)) @staticmethod - def _map_to_variant_annotation_variants( - gwas_associations: DataFrame, variant_annotation: VariantAnnotation + def _map_variants_to_gnomad_variants( + gwas_associations: DataFrame, variant_index: VariantIndex ) -> DataFrame: """Add variant metadata in associations. Args: - gwas_associations (DataFrame): raw GWAS Catalog associations - variant_annotation (VariantAnnotation): variant annotation dataset + gwas_associations (DataFrame): raw GWAS Catalog associations. + variant_index (VariantIndex): GnomaAD variants dataset with allele frequencies. Returns: DataFrame: GWAS Catalog associations data including `variantId`, `referenceAllele`, @@ -176,35 +209,41 @@ def _map_to_variant_annotation_variants( """ # Subset of GWAS Catalog associations required for resolving variant IDs: gwas_associations_subset = gwas_associations.select( - "studyLocusId", + "rowId", f.col("CHR_ID").alias("chromosome"), - f.col("CHR_POS").cast(IntegerType()).alias("position"), + # The positions from GWAS Catalog are from ensembl that causes discrepancy for indels: + f.col("CHR_POS").cast(IntegerType()).alias("ensemblPosition"), # List of all SNPs associated with the variant GWASCatalogCuratedAssociationsParser._collect_rsids( f.split(f.col("SNPS"), "; ").getItem(0), f.col("SNP_ID_CURRENT"), f.split(f.col("STRONGEST SNP-RISK ALLELE"), "; ").getItem(0), ).alias("rsIdsGwasCatalog"), - GWASCatalogCuratedAssociationsParser._normalise_risk_allele( + GWASCatalogCuratedAssociationsParser._extract_risk_allele( f.col("STRONGEST SNP-RISK ALLELE") ).alias("riskAllele"), ) # Subset of variant annotation required for GWAS Catalog annotations: - va_subset = variant_annotation.df.select( + va_subset = variant_index.df.select( "variantId", "chromosome", + # Calculate the position in Ensembl coordinates for indels: + GWASCatalogCuratedAssociationsParser.convert_gnomad_position_to_ensembl( + f.col("position"), + f.col("referenceAllele"), + f.col("alternateAllele"), + ).alias("ensemblPosition"), + # Keeping GnomAD position: "position", f.col("rsIds").alias("rsIdsGnomad"), "referenceAllele", "alternateAllele", "alleleFrequencies", - variant_annotation.max_maf().alias("maxMaf"), + variant_index.max_maf().alias("maxMaf"), ).join( - f.broadcast( - gwas_associations_subset.select("chromosome", "position").distinct() - ), - on=["chromosome", "position"], + gwas_associations_subset.select("chromosome", "ensemblPosition").distinct(), + on=["chromosome", "ensemblPosition"], how="inner", ) @@ -212,14 +251,14 @@ def _map_to_variant_annotation_variants( # based on rsIds or allele concordance) filtered_associations = ( gwas_associations_subset.join( - f.broadcast(va_subset), - on=["chromosome", "position"], + va_subset, + on=["chromosome", "ensemblPosition"], how="left", ) .withColumn( "rsIdFilter", GWASCatalogCuratedAssociationsParser._flag_mappings_to_retain( - f.col("studyLocusId"), + f.col("rowId"), GWASCatalogCuratedAssociationsParser._compare_rsids( f.col("rsIdsGnomad"), f.col("rsIdsGwasCatalog") ), @@ -228,7 +267,7 @@ def _map_to_variant_annotation_variants( .withColumn( "concordanceFilter", GWASCatalogCuratedAssociationsParser._flag_mappings_to_retain( - f.col("studyLocusId"), + f.col("rowId"), GWASCatalogCuratedAssociationsParser._check_concordance( f.col("riskAllele"), f.col("referenceAllele"), @@ -246,11 +285,11 @@ def _map_to_variant_annotation_variants( ) ) - # Keep only highest maxMaf variant per studyLocusId + # Keep only highest maxMaf variant per rowId fully_mapped_associations = get_record_with_maximum_value( - filtered_associations, grouping_col="studyLocusId", sorting_col="maxMaf" + filtered_associations, grouping_col="rowId", sorting_col="maxMaf" ).select( - "studyLocusId", + "rowId", "variantId", "referenceAllele", "alternateAllele", @@ -259,7 +298,7 @@ def _map_to_variant_annotation_variants( ) return gwas_associations.join( - fully_mapped_associations, on="studyLocusId", how="left" + fully_mapped_associations, on="rowId", how="left" ) @staticmethod @@ -528,175 +567,107 @@ def _are_alleles_palindromic( @staticmethod def _harmonise_beta( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, effect_size: Column, confidence_interval: Column, + flipping_needed: Column, ) -> Column: - """A function to extract the beta value from the effect size and confidence interval. + """A function to extract the beta value from the effect size and confidence interval and harmonises for the alternate allele. If the confidence interval contains the word "increase" or "decrease" it indicates, we are dealing with betas. - If it's "increase" and the effect size needs to be harmonized, then multiply the effect size by -1 + If it's "increase" and the effect size needs to be harmonized, then multiply the effect size by -1. + The sign of the effect size is flipped if the confidence interval contains "decrease". + + eg. if the reported value is 0.5, and the confidence interval tells "decrease"? -> beta is -0.5 Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column + effect_size (Column): GWAS Catalog effect size column. + confidence_interval (Column): GWAS Catalog confidence interval column to know the direction of the effect. + flipping_needed (Column): Boolean flag indicating if effect needs to be flipped based on the alleles. Returns: Column: A column containing the beta value. + + Examples: + >>> d = [ + ... # positive effect -no flipping: + ... (0.5, 'increase', False), + ... # Positive effect - flip: + ... (0.5, 'decrease', False), + ... # Positive effect - flip: + ... (0.5, 'decrease', True), + ... # Negative effect - no flip: + ... (0.5, 'increase', True), + ... # Negative effect - flip: + ... (0.5, 'decrease', False), + ... ] + >>> ( + ... spark.createDataFrame(d, ['effect', 'ci_text', 'flip']) + ... .select("effect", "ci_text", 'flip', GWASCatalogCuratedAssociationsParser._harmonise_beta(f.col("effect"), f.col("ci_text"), f.lit(False)).alias("beta")) + ... .show() + ... ) + +------+--------+-----+----+ + |effect| ci_text| flip|beta| + +------+--------+-----+----+ + | 0.5|increase|false| 0.5| + | 0.5|decrease|false|-0.5| + | 0.5|decrease| true|-0.5| + | 0.5|increase| true| 0.5| + | 0.5|decrease|false|-0.5| + +------+--------+-----+----+ + """ return ( f.when( - GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( - reference_allele, alternate_allele - ), - None, - ) - .when( - ( - GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & confidence_interval.contains("increase") - ) - | ( - ~GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & confidence_interval.contains("decrease") - ), + (flipping_needed & confidence_interval.contains("increase")) + | (~flipping_needed & confidence_interval.contains("decrease")), -effect_size, ) .otherwise(effect_size) .cast(DoubleType()) ) - @staticmethod - def _harmonise_beta_ci( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - p_value: Column, - direction: str, - ) -> Column: - """Calculating confidence intervals for beta values. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - p_value (Column): GWAS Catalog p-value column - direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". - - Returns: - Column: The upper and lower bounds of the confidence interval for the beta coefficient. - """ - zscore_95 = f.lit(1.96) - beta = GWASCatalogCuratedAssociationsParser._harmonise_beta( - risk_allele, - reference_allele, - alternate_allele, - effect_size, - confidence_interval, - ) - zscore = pvalue_to_zscore(p_value) - return ( - f.when(f.lit(direction) == "upper", beta + f.abs(zscore_95 * beta) / zscore) - .when(f.lit(direction) == "lower", beta - f.abs(zscore_95 * beta) / zscore) - .otherwise(None) - ) - @staticmethod def _harmonise_odds_ratio( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, effect_size: Column, - confidence_interval: Column, + flipping_needed: Column, ) -> Column: - """Harmonizing odds ratio. + """Odds ratio is either propagated as is, or flipped if indicated, meaning returning a reciprocal value. Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column + effect_size (Column): containing effect size, + flipping_needed (Column): Boolean flag indicating if effect needs to be flipped Returns: Column: A column with the odds ratio, or 1/odds_ratio if harmonization required. + + Examples: + >>> d = [(0.5, False), (0.5, True), (0.0, False), (0.0, True)] + >>> ( + ... spark.createDataFrame(d, ['effect', 'flip']) + ... .select("effect", "flip", GWASCatalogCuratedAssociationsParser._harmonise_odds_ratio(f.col("effect"), f.col("flip")).alias("odds_ratio")) + ... .show() + ... ) + +------+-----+----------+ + |effect| flip|odds_ratio| + +------+-----+----------+ + | 0.5|false| 0.5| + | 0.5| true| 2.0| + | 0.0|false| 0.0| + | 0.0| true| null| + +------+-----+----------+ + """ return ( - f.when( - GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( - reference_allele, alternate_allele - ), - None, - ) + # We are not flipping zero effect size: + f.when((effect_size.cast(DoubleType()) == 0) & flipping_needed, f.lit(None)) .when( - ( - GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & ~confidence_interval.rlike("|".join(["decrease", "increase"])) - ), + flipping_needed, 1 / effect_size, ) .otherwise(effect_size) .cast(DoubleType()) ) - @staticmethod - def _harmonise_odds_ratio_ci( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - p_value: Column, - direction: str, - ) -> Column: - """Calculating confidence intervals for beta values. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - p_value (Column): GWAS Catalog p-value column - direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". - - Returns: - Column: The upper and lower bounds of the 95% confidence interval for the odds ratio. - """ - zscore_95 = f.lit(1.96) - odds_ratio = GWASCatalogCuratedAssociationsParser._harmonise_odds_ratio( - risk_allele, - reference_allele, - alternate_allele, - effect_size, - confidence_interval, - ) - odds_ratio_estimate = f.log(odds_ratio) - zscore = pvalue_to_zscore(p_value) - odds_ratio_se = odds_ratio_estimate / zscore - return f.when( - f.lit(direction) == "upper", - f.exp(odds_ratio_estimate + f.abs(zscore_95 * odds_ratio_se)), - ).when( - f.lit(direction) == "lower", - f.exp(odds_ratio_estimate - f.abs(zscore_95 * odds_ratio_se)), - ) - @staticmethod def _concatenate_substudy_description( association_trait: Column, pvalue_text: Column, mapped_trait_uri: Column @@ -774,7 +745,7 @@ def _qc_all( qc = GWASCatalogCuratedAssociationsParser._qc_variant_interactions( qc, strongest_snp_risk_allele ) - qc = GWASCatalogCuratedAssociationsParser._qc_subsignificant_associations( + qc = StudyLocus._qc_subsignificant_associations( qc, p_value_mantissa, p_value_exponent, p_value_cutoff ) qc = GWASCatalogCuratedAssociationsParser._qc_genomic_location( @@ -810,47 +781,6 @@ def _qc_variant_interactions( StudyLocusQualityCheck.COMPOSITE_FLAG, ) - @staticmethod - def _qc_subsignificant_associations( - qc: Column, - p_value_mantissa: Column, - p_value_exponent: Column, - pvalue_cutoff: float, - ) -> Column: - """Flag associations below significant threshold. - - Args: - qc (Column): QC column - p_value_mantissa (Column): P-value mantissa column - p_value_exponent (Column): P-value exponent column - pvalue_cutoff (float): association p-value cut-off - - Returns: - Column: Updated QC column with flag. - - Examples: - >>> import pyspark.sql.types as t - >>> d = [{'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -7}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 5, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -9}] - >>> df = spark.createDataFrame(d, t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('p_value_mantissa', t.IntegerType()), t.StructField('p_value_exponent', t.IntegerType())])) - >>> df.withColumn('qc', GWASCatalogCuratedAssociationsParser._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) - +------------------------+----------------+----------------+ - |qc |p_value_mantissa|p_value_exponent| - +------------------------+----------------+----------------+ - |[Subsignificant p-value]|1 |-7 | - |[] |1 |-8 | - |[] |5 |-8 | - |[] |1 |-9 | - +------------------------+----------------+----------------+ - - - """ - return StudyLocus.update_quality_flag( - qc, - calculate_neglog_pvalue(p_value_mantissa, p_value_exponent) - < f.lit(-np.log10(pvalue_cutoff)), - StudyLocusQualityCheck.SUBSIGNIFICANT_FLAG, - ) - @staticmethod def _qc_genomic_location( qc: Column, chromosome: Column, position: Column @@ -987,12 +917,178 @@ def _qc_palindromic_alleles( StudyLocusQualityCheck.PALINDROMIC_ALLELE_FLAG, ) + @staticmethod + def _get_effect_type(ci_text: Column) -> Column: + """Extracts the effect type from the 95% CI text. + + The GWAS Catalog confidence interval column contains text that can be used to infer the effect type. + If the text contains "increase" or "decrease", the effect type is beta, otherwise it is odds ratio. + Null columns return null as the effect type. + + Args: + ci_text (Column): Column containing the 95% CI text. + + Returns: + Column: A column containing the effect type. + + Examples: + >>> data = [{"ci_text": "95% CI: [0.1-0.2]"}, {"ci_text": "95% CI: [0.1-0.2] increase"}, {"ci_text": "95% CI: [0.1-0.2] decrease"}, {"ci_text": None}] + >>> spark.createDataFrame(data).select('ci_text', GWASCatalogCuratedAssociationsParser._get_effect_type(f.col('ci_text')).alias('effect_type')).show(truncate=False) + +--------------------------+-----------+ + |ci_text |effect_type| + +--------------------------+-----------+ + |95% CI: [0.1-0.2] |odds_ratio | + |95% CI: [0.1-0.2] increase|beta | + |95% CI: [0.1-0.2] decrease|beta | + |null |null | + +--------------------------+-----------+ + + + """ + return f.when( + f.lower(ci_text).contains("increase") + | f.lower(ci_text).contains("decrease"), + f.lit("beta"), + ).when(ci_text.isNotNull(), f.lit("odds_ratio")) + + @staticmethod + def harmonise_association_effect_to_beta( + df: DataFrame, + ) -> DataFrame: + """Harmonise effect to beta value. + + The harmonisation process has a number of steps: + - Extracting the reported effect allele. + - Flagging palindromic alleles. + - Flagging associations where the effect direction needs to be flipped. + - Flagging the effect type. + - Getting the standard error from the confidence interval text. + - Harmonising both beta and odds ratio. + - Converting the odds ratio to beta. + + Args: + df (DataFrame): DataFrame with the following columns: + + Returns: + DataFrame: DataFrame with the following columns: + + Raises: + ValueError: If any of the required columns are missing. + + Examples: + >>> data = [ + ... # Flagged as palindromic: + ... ('rs123-T', 'A', 'T', '0.1', '[0.08-0.12] unit increase'), + ... # Not palindromic, beta needs to be flipped: + ... ('rs123-C', 'G', 'T', '0.1', '[0.08-0.12] unit increase'), + ... # Beta is not flipped: + ... ('rs123-T', 'C', 'T', '0.1', '[0.08-0.12] unit increase'), + ... # odds ratio: + ... ('rs123-T', 'C', 'T', '0.1', '[0.08-0.12]'), + ... # odds ratio flipped: + ... ('rs123-C', 'G', 'T', '0.1', '[0.08-0.12]'), + ... ] + >>> schema = ["STRONGEST SNP-RISK ALLELE", "referenceAllele", "alternateAllele", "OR or BETA", "95% CI (TEXT)"] + >>> df = spark.createDataFrame(data, schema) + >>> GWASCatalogCuratedAssociationsParser.harmonise_association_effect_to_beta(df).show() + +-------------------------+---------------+---------------+----------+--------------------+-------------------+--------------------+ + |STRONGEST SNP-RISK ALLELE|referenceAllele|alternateAllele|OR or BETA| 95% CI (TEXT)| beta| standardError| + +-------------------------+---------------+---------------+----------+--------------------+-------------------+--------------------+ + | rs123-T| A| T| 0.1|[0.08-0.12] unit ...| null| null| + | rs123-C| G| T| 0.1|[0.08-0.12] unit ...| -0.1|0.010204081404574064| + | rs123-T| C| T| 0.1|[0.08-0.12] unit ...| 0.1|0.010204081404574064| + | rs123-T| C| T| 0.1| [0.08-0.12]|-2.3025850929940455| null| + | rs123-C| G| T| 0.1| [0.08-0.12]| 2.302585092994046| null| + +-------------------------+---------------+---------------+----------+--------------------+-------------------+--------------------+ + + """ + # Testing if all columns are in the dataframe: + required_columns = [ + "STRONGEST SNP-RISK ALLELE", + "referenceAllele", + "alternateAllele", + "OR or BETA", + "95% CI (TEXT)", + ] + + for column in required_columns: + if column not in df.columns: + raise ValueError( + f"Column {column} is required for harmonising effect to beta value." + ) + + return ( + df.withColumn( + "reportedRiskAllele", + GWASCatalogCuratedAssociationsParser._extract_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + ) + .withColumns( + { + # Flag palindromic alleles: + "isAllelePalindromic": GWASCatalogCuratedAssociationsParser._are_alleles_palindromic( + f.col("referenceAllele"), f.col("alternateAllele") + ), + # Flag associations, where the effect direction needs to be flipped: + "needsFlipping": GWASCatalogCuratedAssociationsParser._effect_needs_harmonisation( + f.col("reportedRiskAllele"), f.col("referenceAllele") + ), + # Flag effect type: + "effectType": GWASCatalogCuratedAssociationsParser._get_effect_type( + f.col("95% CI (TEXT)") + ), + # Get standard error from confidence interval text: + "standardError": get_standard_error_from_confidence_interval( + f.regexp_extract( + "95% CI (TEXT)", r"\[(\d+\.*\d*)-\d+\.*\d*\]", 1 + ).cast(FloatType()), + f.regexp_extract( + "95% CI (TEXT)", r"\[\d+\.*\d*-(\d+\.*\d*)\]", 1 + ).cast(FloatType()), + ), + } + ) + # Harmonise both beta and odds ratio: + .withColumns( + { # Normalise beta value of the association: + "effect_beta": f.when( + (f.col("effectType") == "beta") + & (~f.col("isAllelePalindromic")), + GWASCatalogCuratedAssociationsParser._harmonise_beta( + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + f.col("needsFlipping"), + ), + ), + # Normalise odds ratio of the association: + "effect_odds_ratio": f.when( + (f.col("effectType") == "odds_ratio") + & (~f.col("isAllelePalindromic")), + GWASCatalogCuratedAssociationsParser._harmonise_odds_ratio( + f.col("OR or BETA"), + f.col("needsFlipping"), + ), + ), + }, + ) + .select( + *df.columns, + # Harmonise OR effect to beta: + *convert_odds_ratio_to_beta( + f.col("effect_beta"), + f.col("effect_odds_ratio"), + f.col("standardError"), + ), + ) + ) + @classmethod def from_source( cls: type[GWASCatalogCuratedAssociationsParser], gwas_associations: DataFrame, - variant_annotation: VariantAnnotation, - pvalue_threshold: float = 5e-8, + gnomad_variants: VariantIndex, + pvalue_threshold: float = WindowBasedClumpingStepConfig.gwas_significance, ) -> StudyLocusGWASCatalog: """Read GWASCatalog associations. @@ -1000,38 +1096,52 @@ def from_source( applies some pre-defined filters on the data: Args: - gwas_associations (DataFrame): GWAS Catalog raw associations dataset - variant_annotation (VariantAnnotation): Variant annotation dataset - pvalue_threshold (float): P-value threshold for flagging associations + gwas_associations (DataFrame): GWAS Catalog raw associations dataset. + gnomad_variants (VariantIndex): Variant dataset from GnomAD, with allele frequencies. + pvalue_threshold (float): P-value threshold for flagging associations. Returns: StudyLocusGWASCatalog: GWASCatalogAssociations dataset + + pvalue_threshold is keeped in sync with the WindowBasedClumpingStep gwas_significance. """ return StudyLocusGWASCatalog( _df=gwas_associations.withColumn( - "studyLocusId", f.monotonically_increasing_id().cast(LongType()) + # temporary column + "rowId", f.monotonically_increasing_id().cast(StringType()) ) .transform( # Map/harmonise variants to variant annotation dataset: # This function adds columns: variantId, referenceAllele, alternateAllele, chromosome, position - lambda df: GWASCatalogCuratedAssociationsParser._map_to_variant_annotation_variants( - df, variant_annotation + lambda df: GWASCatalogCuratedAssociationsParser._map_variants_to_gnomad_variants( + df, gnomad_variants ) ) - .withColumn( + .withColumns( # Perform all quality control checks: - "qualityControls", - GWASCatalogCuratedAssociationsParser._qc_all( - f.array().alias("qualityControls"), - f.col("CHR_ID"), - f.col("CHR_POS").cast(IntegerType()), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("STRONGEST SNP-RISK ALLELE"), - *GWASCatalogCuratedAssociationsParser._parse_pvalue( - f.col("P-VALUE") - ), - pvalue_threshold, + { + "qualityControls": GWASCatalogCuratedAssociationsParser._qc_all( + f.array().alias("qualityControls"), + f.col("CHR_ID"), + f.col("CHR_POS").cast(IntegerType()), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("STRONGEST SNP-RISK ALLELE"), + *GWASCatalogCuratedAssociationsParser._parse_pvalue( + f.col("P-VALUE") + ), + pvalue_threshold, + ) + } + ) + # Harmonising effect to beta value and flip effect if needed: + .transform(cls.harmonise_association_effect_to_beta) + .withColumnRenamed("STUDY ACCESSION", "studyId") + # Adding study-locus id: + .withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id( + ["studyId", "variantId"] ), ) .select( @@ -1041,17 +1151,7 @@ def from_source( # Mapped genomic location of the variant (; separated list) "chromosome", "position", - f.col("STUDY ACCESSION").alias("studyId"), - # beta value of the association - GWASCatalogCuratedAssociationsParser._harmonise_beta( - GWASCatalogCuratedAssociationsParser._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - ).alias("beta"), + "studyId", # p-value of the association, string: split into exponent and mantissa. *GWASCatalogCuratedAssociationsParser._parse_pvalue(f.col("P-VALUE")), # Capturing phenotype granularity at the association level @@ -1062,6 +1162,8 @@ def from_source( ).alias("subStudyDescription"), # Quality controls (array of strings) "qualityControls", + "beta", + "standardError", ), _schema=StudyLocusGWASCatalog.get_schema(), ) @@ -1093,7 +1195,7 @@ def update_study_id( .drop("subStudyDescription", "updatedStudyId") ).withColumn( "studyLocusId", - StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + StudyLocus.assign_study_locus_id(["studyId", "variantId"]), ) return self @@ -1117,6 +1219,24 @@ def qc_ambiguous_study(self: StudyLocusGWASCatalog) -> StudyLocusGWASCatalog: ) return self + def qc_flag_all_tophits(self: StudyLocusGWASCatalog) -> StudyLocusGWASCatalog: + """Flag all associations as top hits. + + Returns: + StudyLocusGWASCatalog: Updated study locus. + """ + return StudyLocusGWASCatalog( + _df=self._df.withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + f.lit(True), + StudyLocusQualityCheck.TOP_HIT, + ), + ), + _schema=StudyLocusGWASCatalog.get_schema(), + ) + def apply_inclusion_list( self: StudyLocusGWASCatalog, inclusion_list: DataFrame ) -> StudyLocusGWASCatalog: diff --git a/src/gentropy/datasource/gwas_catalog/study_index.py b/src/gentropy/datasource/gwas_catalog/study_index.py index cb6d3338a..c01d6d263 100644 --- a/src/gentropy/datasource/gwas_catalog/study_index.py +++ b/src/gentropy/datasource/gwas_catalog/study_index.py @@ -1,4 +1,5 @@ """Study Index for GWAS Catalog data source.""" + from __future__ import annotations from dataclasses import dataclass @@ -6,61 +7,15 @@ import pyspark.sql.functions as f import pyspark.sql.types as t -from pyspark import SparkFiles -from gentropy.common.session import Session from gentropy.common.spark_helpers import column2camel_case from gentropy.common.utils import parse_efos -from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_index import StudyIndex, StudyQualityCheck if TYPE_CHECKING: from pyspark.sql import Column, DataFrame -def read_curation_table( - curation_path: str | None, session: Session -) -> DataFrame | None: - """Read curation table if path or URL is given. - - Curation itself is fully optional everything should work without it. - - Args: - curation_path (str | None): Optionally given path the curation tsv. - session (Session): session object - - Returns: - DataFrame | None: if curation was provided, - """ - # If no curation path provided, we are returning none: - if curation_path is None: - return None - # Read curation from the web: - elif curation_path.startswith("http"): - # Registering file: - session.spark.sparkContext.addFile(curation_path) - - # Reading file: - curation_df = session.spark.read.csv( - SparkFiles.get(curation_path.split("/")[-1]), sep="\t", header=True - ) - # Read curation from file: - else: - curation_df = session.spark.read.csv(curation_path, sep="\t", header=True) - return curation_df.select( - "studyId", - "studyType", - f.when(f.col("analysisFlag").isNotNull(), f.split(f.col("analysisFlag"), r"\|")) - .otherwise(f.array()) - .alias("analysisFlags"), - f.when( - f.col("qualityControl").isNotNull(), f.split(f.col("qualityControl"), r"\|") - ) - .otherwise(f.array()) - .alias("qualityControls"), - f.col("isCurated").cast(t.BooleanType()), - ) - - @dataclass class StudyIndexGWASCatalogParser: """GWAS Catalog study index parser. @@ -264,14 +219,14 @@ def parse_cohorts(raw_cohort: Column) -> Column: |parsedCohorts | +--------------------------------------+ |[BioME, CaPS, Estonia, FHS, UKB, GERA]| - |[null] | + |null | +--------------------------------------+ """ return f.when( - (raw_cohort.isNull()) | (raw_cohort == ""), - f.array(f.lit(None).cast(t.StringType())), - ).otherwise(f.array_distinct(f.split(raw_cohort, r"\|"))) + (raw_cohort.isNotNull()) & (raw_cohort != ""), + f.array_distinct(f.split(raw_cohort, r"\|")), + ) @classmethod def _parse_study_table( @@ -305,6 +260,7 @@ def _parse_study_table( parse_efos(f.col("MAPPED BACKGROUND TRAIT URI")).alias( "backgroundTraitFromSourceMappedIds" ), + cls.parse_cohorts(f.col("COHORT")).alias("cohorts"), ), _schema=StudyIndexGWASCatalog.get_schema(), ) @@ -314,14 +270,12 @@ def from_source( cls: type[StudyIndexGWASCatalogParser], catalog_studies: DataFrame, ancestry_file: DataFrame, - sumstats_lut: DataFrame, ) -> StudyIndexGWASCatalog: """Ingests study level metadata from the GWAS Catalog. Args: catalog_studies (DataFrame): GWAS Catalog raw study table ancestry_file (DataFrame): GWAS Catalog ancestry table. - sumstats_lut (DataFrame): GWAS Catalog summary statistics list. Returns: StudyIndexGWASCatalog: Parsed and annotated GWAS Catalog study table. @@ -330,7 +284,6 @@ def from_source( return ( cls._parse_study_table(catalog_studies) .annotate_ancestries(ancestry_file) - .annotate_sumstats_info(sumstats_lut) .annotate_discovery_sample_sizes() ) @@ -401,7 +354,13 @@ def annotate_from_study_curation( if curation_table is None: return self - columns = self.df.columns + studies = self.df + + if "qualityControls" not in studies.columns: + studies = studies.withColumn("qualityControls", f.array()) + + if "analysisFlags" not in studies.columns: + studies = studies.withColumn("analysisFlags", f.array()) # Adding prefix to columns in the curation table: curation_table = curation_table.select( @@ -413,46 +372,34 @@ def annotate_from_study_curation( ] ) - # Create expression how to update/create quality controls dataset: - qualityControls_expression = ( - f.col("curation_qualityControls") - if "qualityControls" not in columns - else f.when( - f.col("curation_qualityControls").isNotNull(), - f.array_union( - f.col("qualityControls"), f.array(f.col("curation_qualityControls")) - ), - ).otherwise(f.col("qualityControls")) - ) - - # Create expression how to update/create analysis flag: - analysis_expression = ( - f.col("curation_analysisFlags") - if "analysisFlags" not in columns - else f.when( - f.col("curation_analysisFlags").isNotNull(), - f.array_union( - f.col("analysisFlags"), f.array(f.col("curation_analysisFlags")) - ), - ).otherwise(f.col("analysisFlags")) - ) - - # Updating columns list. We might or might not list columns twice, but that doesn't matter, unique set will generated: - columns = list(set(columns + ["qualityControls", "analysisFlags"])) - # Based on the curation table, columns needs to be updated: curated_df = ( - self.df.join(curation_table, on="studyId", how="left") + studies.join( + curation_table.withColumn("isCurated", f.lit(True)), + on="studyId", + how="left", + ) + .withColumn("isCurated", f.coalesce(f.col("isCurated"), f.lit(False))) # Updating study type: .withColumn( "studyType", f.coalesce(f.col("curation_studyType"), f.col("studyType")) ) - # Updating quality controls: - .withColumn("qualityControls", qualityControls_expression) # Updating study annotation flags: - .withColumn("analysisFlags", analysis_expression) + .withColumn( + "analysisFlags", + f.array_union(f.col("analysisFlags"), f.col("curation_analysisFlags")), + ) + .withColumn("analysisFlags", f.coalesce(f.col("analysisFlags"), f.array())) + .withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~f.col("isCurated"), + StudyQualityCheck.NO_OT_CURATION, + ), + ) # Dropping columns coming from the curation table: - .select(*columns) + .select(*studies.columns) ) return StudyIndexGWASCatalog( _df=curated_df, _schema=StudyIndexGWASCatalog.get_schema() @@ -548,14 +495,6 @@ def annotate_ancestries( ) # studyId has not been split yet ) - # Parsing cohort information: - cohorts = ancestry_lut.select( - f.col("STUDY ACCESSION").alias("studyId"), - GWASCatalogStudyIndexParser.parse_cohorts(f.col("COHORT(S)")).alias( - "cohorts" - ), - ).distinct() - # Get a high resolution dataset on experimental stage: ancestry_stages = ( ancestry.groupBy("studyId") @@ -644,50 +583,7 @@ def annotate_ancestries( ).select( "studyId", "discoverySamples", "ldPopulationStructure", "replicationSamples" ) - self.df = self.df.join(parsed_ancestry_lut, on="studyId", how="left").join( - cohorts, on="studyId", how="left" - ) - return self - - def annotate_sumstats_info( - self: StudyIndexGWASCatalog, sumstats_lut: DataFrame - ) -> StudyIndexGWASCatalog: - """Annotate summary stat locations. - - Args: - sumstats_lut (DataFrame): listing GWAS Catalog summary stats paths - - Returns: - StudyIndexGWASCatalog: including `summarystatsLocation` and `hasSumstats` columns - - Raises: - ValueError: if the sumstats_lut table doesn't have the right columns - """ - gwas_sumstats_base_uri = ( - "ftp://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/" - ) - - if "_c0" not in sumstats_lut.columns: - raise ValueError( - f'Sumstats look-up table needs to have `_c0` column. However it has: {",".join(sumstats_lut.columns)}' - ) - - parsed_sumstats_lut = sumstats_lut.withColumn( - "summarystatsLocation", - f.concat( - f.lit(gwas_sumstats_base_uri), - f.regexp_replace(f.col("_c0"), r"^\.\/", ""), - ), - ).select( - self._parse_gwas_catalog_study_id("summarystatsLocation").alias("studyId"), - "summarystatsLocation", - f.lit(True).alias("hasSumstats"), - ) - self.df = ( - self.df.drop("hasSumstats") - .join(parsed_sumstats_lut, on="studyId", how="left") - .withColumn("hasSumstats", f.coalesce(f.col("hasSumstats"), f.lit(False))) - ) + self.df = self.df.join(parsed_ancestry_lut, on="studyId", how="left") return self def annotate_discovery_sample_sizes( @@ -751,6 +647,22 @@ def apply_inclusion_list( _schema=StudyIndexGWASCatalog.get_schema(), ) + def add_no_sumstats_flag(self: StudyIndexGWASCatalog) -> StudyIndexGWASCatalog: + """Add a flag to the study index if no summary statistics are available. + + Returns: + StudyIndexGWASCatalog: Updated study index. + """ + self.df = self.df.withColumn( + "qualityControls", + StudyIndex.update_quality_flag( + f.col("qualityControls"), + ~f.col("hasSumstats"), + StudyQualityCheck.SUMSTATS_NOT_AVAILABLE, + ), + ) + return self + @staticmethod def _parse_gwas_catalog_study_id(sumstats_path_column: str) -> Column: """Extract GWAS Catalog study accession from the summary statistics path. diff --git a/src/gentropy/datasource/gwas_catalog/study_index_ot_curation.py b/src/gentropy/datasource/gwas_catalog/study_index_ot_curation.py new file mode 100644 index 000000000..8d75e4824 --- /dev/null +++ b/src/gentropy/datasource/gwas_catalog/study_index_ot_curation.py @@ -0,0 +1,90 @@ +"""Study Index for GWAS Catalog data source.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark import SparkFiles + +from gentropy.common.session import Session + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +@dataclass +class StudyIndexGWASCatalogOTCuration: + """Study Index Curation for GWAS Catalog data source. + + This class is responsible for parsing additional curation for the GWAS Catalog studies. + """ + + @staticmethod + def _parser(df: DataFrame) -> DataFrame: + """Parse the curation table. + + Args: + df (DataFrame): DataFrame with the curation table. + + Returns: + DataFrame: DataFrame with the parsed curation table. + """ + if "qualityControl" not in df.columns: + # Add the 'qualityControl' column with null values + df = df.withColumn("qualityControl", f.lit(None).cast("string")) + return df.select( + "studyId", + "studyType", + f.when( + f.col("analysisFlag").isNotNull(), f.split(f.col("analysisFlag"), r"\|") + ) + .otherwise(f.array()) + .alias("analysisFlags"), + f.when( + f.col("qualityControl").isNotNull(), + f.split(f.col("qualityControl"), r"\|"), + ) + .otherwise(f.array()) + .alias("qualityControls"), + f.col("isCurated").cast(t.BooleanType()), + ) + + @classmethod + def from_csv( + cls: type[StudyIndexGWASCatalogOTCuration], session: Session, curation_path: str + ) -> DataFrame: + """Read curation table from csv. + + Args: + session (Session): Session object. + curation_path (str): Path to the curation table. + + Returns: + DataFrame: DataFrame with the curation table. + """ + return cls._parser(session.spark.read.csv(curation_path, sep="\t", header=True)) + + @classmethod + def from_url( + cls: type[StudyIndexGWASCatalogOTCuration], session: Session, curation_url: str + ) -> DataFrame: + """Read curation table from URL. + + Args: + session (Session): Session object. + curation_url (str): URL to the curation table. + + Returns: + DataFrame: DataFrame with the curation table. + """ + # Registering file: + session.spark.sparkContext.addFile(curation_url) + + return cls._parser( + session.spark.read.csv( + SparkFiles.get(curation_url.split("/")[-1]), sep="\t", header=True + ) + ) diff --git a/src/gentropy/datasource/gwas_catalog/study_splitter.py b/src/gentropy/datasource/gwas_catalog/study_splitter.py index 882a9893a..0b11e797a 100644 --- a/src/gentropy/datasource/gwas_catalog/study_splitter.py +++ b/src/gentropy/datasource/gwas_catalog/study_splitter.py @@ -132,5 +132,7 @@ def split( st_ass.select( "updatedStudyId", "studyId", "subStudyDescription" ).distinct() - ).qc_ambiguous_study(), + ) + .qc_ambiguous_study() + .qc_flag_all_tophits(), ) diff --git a/src/gentropy/datasource/intervals/thurman.py b/src/gentropy/datasource/intervals/thurman.py index 88ed5b6ad..a8113e5a6 100644 --- a/src/gentropy/datasource/intervals/thurman.py +++ b/src/gentropy/datasource/intervals/thurman.py @@ -41,7 +41,7 @@ def read(spark: SparkSession, path: str) -> DataFrame: t.StructField("score", t.FloatType(), False), ] ) - return spark.read.csv(path, sep="\t", header=True, schema=thurman_schema) + return spark.read.csv(path, sep="\t", header=False, schema=thurman_schema) @classmethod def parse( diff --git a/src/gentropy/datasource/open_targets/l2g_gold_standard.py b/src/gentropy/datasource/open_targets/l2g_gold_standard.py index 97b04320c..21edcc201 100644 --- a/src/gentropy/datasource/open_targets/l2g_gold_standard.py +++ b/src/gentropy/datasource/open_targets/l2g_gold_standard.py @@ -1,4 +1,5 @@ """Parser for OTPlatform locus to gene gold standards curation.""" + from __future__ import annotations from typing import Type @@ -8,7 +9,7 @@ from gentropy.dataset.l2g_gold_standard import L2GGoldStandard from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.v2g import V2G +from gentropy.dataset.variant_index import VariantIndex class OpenTargetsL2GGoldStandard: @@ -51,7 +52,7 @@ def parse_positive_curation( ) .withColumn( "studyLocusId", - StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + StudyLocus.assign_study_locus_id(["studyId", "variantId"]), ) .groupBy("studyLocusId", "studyId", "variantId", "geneId") .agg(f.collect_set("source").alias("sources")) @@ -59,7 +60,9 @@ def parse_positive_curation( @classmethod def expand_gold_standard_with_negatives( - cls: Type[OpenTargetsL2GGoldStandard], positive_set: DataFrame, v2g: V2G + cls: Type[OpenTargetsL2GGoldStandard], + positive_set: DataFrame, + variant_index: VariantIndex, ) -> DataFrame: """Create full set of positive and negative evidence of locus to gene associations. @@ -67,7 +70,7 @@ def expand_gold_standard_with_negatives( Args: positive_set (DataFrame): Positive set from curation - v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS + variant_index (VariantIndex): Variant index to get distance to gene Returns: DataFrame: Full set of positive and negative evidence of locus to gene associations @@ -75,9 +78,13 @@ def expand_gold_standard_with_negatives( return ( positive_set.withColumnRenamed("geneId", "curated_geneId") .join( - v2g.df.selectExpr( - "variantId", "geneId as non_curated_geneId", "distance" - ).filter(f.col("distance") <= cls.LOCUS_TO_GENE_WINDOW), + variant_index.get_distance_to_gene() + .selectExpr( + "variantId", + "targetId as non_curated_geneId", + "distanceFromTss", + ) + .filter(f.col("distanceFromTss") <= cls.LOCUS_TO_GENE_WINDOW), on="variantId", how="left", ) @@ -85,7 +92,7 @@ def expand_gold_standard_with_negatives( "goldStandardSet", f.when( (f.col("curated_geneId") == f.col("non_curated_geneId")) - # to keep the positives that are outside the v2g dataset + # to keep the positives that are not part of the variant index | (f.col("non_curated_geneId").isNull()), f.lit(L2GGoldStandard.GS_POSITIVE_LABEL), ).otherwise(L2GGoldStandard.GS_NEGATIVE_LABEL), @@ -97,27 +104,27 @@ def expand_gold_standard_with_negatives( f.col("curated_geneId"), ).otherwise(f.col("non_curated_geneId")), ) - .drop("distance", "curated_geneId", "non_curated_geneId") + .drop("distanceFromTss", "curated_geneId", "non_curated_geneId") ) @classmethod def as_l2g_gold_standard( cls: type[OpenTargetsL2GGoldStandard], gold_standard_curation: DataFrame, - v2g: V2G, + variant_index: VariantIndex, ) -> L2GGoldStandard: """Initialise L2GGoldStandard from source dataset. Args: gold_standard_curation (DataFrame): Gold standard curation dataframe, extracted from https://github.com/opentargets/genetics-gold-standards - v2g (V2G): Variant to gene dataset to bring distance between a variant and a gene's TSS + variant_index (VariantIndex): Dataset to bring distance between a variant and a gene's footprint Returns: L2GGoldStandard: L2G Gold Standard dataset. False negatives have not yet been removed. """ return L2GGoldStandard( _df=cls.parse_positive_curation(gold_standard_curation).transform( - cls.expand_gold_standard_with_negatives, v2g + cls.expand_gold_standard_with_negatives, variant_index ), _schema=L2GGoldStandard.get_schema(), ) diff --git a/src/gentropy/datasource/open_targets/variants.py b/src/gentropy/datasource/open_targets/variants.py new file mode 100644 index 000000000..5b6822ae6 --- /dev/null +++ b/src/gentropy/datasource/open_targets/variants.py @@ -0,0 +1,136 @@ +"""Process OT dataset with variant information.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f + +from gentropy.common.spark_helpers import ( + create_empty_column_if_not_exists, + safe_array_union, +) +from gentropy.dataset.study_locus import StudyLocus +from gentropy.datasource.ensembl.api import fetch_coordinates_from_rsids + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + from gentropy.common.session import Session + + +class OpenTargetsVariant: + """Process OT dataset with variant information.""" + + @classmethod + def map_rsids_to_variant_ids( + cls: type[OpenTargetsVariant], + session: Session, + variant_df: DataFrame, + ) -> DataFrame: + """Map rsIDs to variant IDs where variantId is null. + + Args: + session (Session): Spark session. + variant_df (DataFrame): DataFrame with variant information. + + Returns: + DataFrame: DataFrame with mapped variant IDs. + """ + if rsids_to_map := ( + variant_df.filter( + (f.col("variantId").isNull()) & (f.col("variantRsId").isNotNull()) + ) + .select("variantRsId") + .distinct() + .toPandas()["variantRsId"] + .to_list() + ): + rsid_to_variantids = fetch_coordinates_from_rsids(rsids_to_map) + mapping_df = session.spark.createDataFrame( + rsid_to_variantids.items(), schema=["variantRsId", "mappedVariantIds"] + ).select( + "variantRsId", f.explode("mappedVariantIds").alias("mappedVariantId") + ) + + variant_df = ( + variant_df.join(mapping_df, "variantRsId", "left") + .withColumn( + "variantId", + f.coalesce(f.col("variantId"), f.col("mappedVariantId")), + ) + .drop("mappedVariantId") + ) + + return variant_df + + @classmethod + def as_vcf_df( + cls: type[OpenTargetsVariant], + session: Session, + variant_df: DataFrame, + ) -> DataFrame: + """Convert OT dataset to VCF format. VCF format is widely used and is compatible with most variant annotation tools, including VEP. + + Args: + session (Session): Spark session. + variant_df (DataFrame): DataFrame with variant information. + + Returns: + DataFrame: DataFrame with variant information in VCF format. + """ + # Add necessary cols if not present and apply rsID mappings + mandatory_cols = ["variantId", "variantRsId", "locus"] + missing_cols = [col for col in mandatory_cols if col not in variant_df.columns] + for col in missing_cols: + if col == "locus": + variant_df = variant_df.withColumn( + col, + create_empty_column_if_not_exists( + col, + StudyLocus.get_schema()["locus"].dataType, + ), + ) + else: + variant_df = variant_df.withColumn( + col, create_empty_column_if_not_exists(col) + ) + return ( + variant_df.filter(f.col("variantId").isNotNull()) + .withColumn( + # Combine variant IDs from variantId and locus.variantId + "variantId", + f.explode( + safe_array_union( + f.array(f.col("variantId")), + f.col("locus.variantId"), + ) + ), + ) + .select( + f.coalesce(f.split(f.col("variantId"), "_")[0], f.lit(".")).alias( + "#CHROM" + ), + f.coalesce(f.split(f.col("variantId"), "_")[1], f.lit(".")) + .cast("int") + .alias("POS"), + f.coalesce(f.col("variantRsId"), f.lit(".")).alias("ID"), + f.coalesce(f.split(f.col("variantId"), "_")[2], f.lit(".")).alias( + "REF" + ), + f.coalesce(f.split(f.col("variantId"), "_")[3], f.lit(".")).alias( + "ALT" + ), + f.lit(".").alias("QUAL"), + f.lit(".").alias("FILTER"), + f.lit(".").alias("INFO"), + ) + .distinct() + .filter( + (f.col("#CHROM") != ".") + & (f.col("POS").isNotNull()) + & (f.col("REF").rlike("^[GCTA.]*$")) + & (f.col("ALT").rlike("^[GCTA.]*$")) + ) + .orderBy(f.col("#CHROM").asc(), f.col("POS").asc()) + ) diff --git a/src/gentropy/datasource/pan_ukbb_ld/__init__.py b/src/gentropy/datasource/pan_ukbb_ld/__init__.py new file mode 100644 index 000000000..dc57b8db8 --- /dev/null +++ b/src/gentropy/datasource/pan_ukbb_ld/__init__.py @@ -0,0 +1,3 @@ +"""Pan UKBB Data Source.""" + +from __future__ import annotations diff --git a/src/gentropy/datasource/pan_ukbb_ld/ld.py b/src/gentropy/datasource/pan_ukbb_ld/ld.py new file mode 100644 index 000000000..1926ddc9c --- /dev/null +++ b/src/gentropy/datasource/pan_ukbb_ld/ld.py @@ -0,0 +1,214 @@ +"""Step to import filtered version of a LD matrix (block matrix).""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import hail as hl +import numpy as np +import pyspark.sql.functions as f +from hail.linalg import BlockMatrix +from pyspark.sql.window import Window + +from gentropy.common.session import Session +from gentropy.config import PanUKBBConfig + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, Row + + +class PanUKBBLDMatrix: + """Toolset to work with Pan UKBB LD matrices.""" + + def __init__( + self, + pan_ukbb_ht_path: str = PanUKBBConfig().pan_ukbb_ht_path, + pan_ukbb_bm_path: str = PanUKBBConfig().pan_ukbb_bm_path, + ld_populations: list[str] = PanUKBBConfig().pan_ukbb_pops, + ukbb_annotation_path: str = PanUKBBConfig().ukbb_annotation_path, + ): + """Initialize. + + Datasets are in hail native format. + + Args: + pan_ukbb_ht_path (str): Path to hail table, source: gs://ukb-diverse-pops-public/ld_release + pan_ukbb_bm_path (str): Path to hail block matrix + ld_populations (list[str]): List of populations + ukbb_annotation_path (str): Path to pan-ukbb variant LD index with alleles flipped to match the order in OT variant annotation + Default values are set in PanUKBBConfig. + """ + self.pan_ukbb_ht_path = pan_ukbb_ht_path + self.pan_ukbb_bm_path = pan_ukbb_bm_path + self.ld_populations = ld_populations + self.ukbb_annotation_output_path = ukbb_annotation_path + + def align_ld_index_alleles( + self, + variant_annotation: DataFrame, + population: str, + hail_table_path: str = PanUKBBConfig.pan_ukbb_ht_path, + hail_table_output: str = PanUKBBConfig.ukbb_annotation_path, + ) -> None: + """Align Pan-UKBB variant LD index alleles with the Open Targets variant annotation. + + Args: + variant_annotation (DataFrame): Open Targets variant annotation DataFrame + population (str): Population label + hail_table_path (str): Path to hail table with Pan-UKBB variant LD index + hail_table_output (str): Path to output the aligned Pan-UKBB variant LD index with alleles in the correct order + """ + ht = hl.read_table(hail_table_path.format(POP=population)) + ht = ( + ht.to_spark() + .select( + "`locus.contig`", + "`locus.position`", + "`alleles`", + "`idx`", + ) + .withColumns( + { + "chromosome": f.split("`locus.contig`", "chr")[1], + "position": f.col("`locus.position`"), + "referenceAllele": f.element_at("`alleles`", 1), + "alternateAllele": f.element_at("`alleles`", 2), + } + ) + .drop("locus.contig", "locus.position", "alleles") + .dropDuplicates( + ["chromosome", "position", "referenceAllele", "alternateAllele"] + ) + ) + ht_va = ( + ht.alias("ukbb") + .join( + variant_annotation.select( + "chromosome", + "position", + f.col("referenceAllele").alias("va_ref"), + f.col("alternateAllele").alias("va_alt"), + ).dropDuplicates(["chromosome", "position", "va_ref", "va_alt"]), + on=["chromosome", "position"], + how="left", + ) + .filter( + ( + (f.col("referenceAllele") == f.col("va_ref")) + & (f.col("alternateAllele") == f.col("va_alt")) + ) + | ( + (f.col("referenceAllele") == f.col("va_alt")) + & (f.col("alternateAllele") == f.col("va_ref")) + ) + | (f.col("va_ref").isNull() | f.col("va_alt").isNull()) + ) + .withColumns( + { + "alleleOrder": f.when( + (f.col("referenceAllele") == f.col("va_alt")) + & (f.col("alternateAllele") == f.col("va_ref")), + -1, + ).otherwise(1), + "new_referenceAllele": f.when( + (f.col("referenceAllele") == f.col("va_alt")) + & (f.col("alternateAllele") == f.col("va_ref")), + f.col("va_ref"), + ).otherwise(f.col("referenceAllele")), + "new_alternateAllele": f.when( + (f.col("alternateAllele") == f.col("va_ref")) + & (f.col("referenceAllele") == f.col("va_alt")), + f.col("va_alt"), + ).otherwise(f.col("alternateAllele")), + } + ) + .select( + f.concat_ws( + "_", + "chromosome", + "position", + "new_referenceAllele", + "new_alternateAllele", + ).alias("variantId"), + "chromosome", + "position", + f.col("new_referenceAllele").alias("referenceAllele"), + f.col("new_alternateAllele").alias("alternateAllele"), + "alleleOrder", + "idx", + ) + ) + window_spec = Window.partitionBy("idx").orderBy(f.col("alleleOrder").desc()) + ht_va = ( + ht_va.withColumn("rank", f.rank().over(window_spec)) + .filter(f.col("rank") == 1) + .drop("rank") + ) + ht_va.write.mode("overwrite").parquet(hail_table_output.format(POP=population)) + + def get_numpy_matrix( + self: PanUKBBLDMatrix, + locus_index: DataFrame, + ancestry: str, + ) -> np.ndarray: + """Extract the LD block matrix for a locus. + + Args: + locus_index (DataFrame): hail matrix variant index table + ancestry (str): Ancestry label + + Returns: + np.ndarray: LD block matrix for the locus + """ + idx = [row["idx"] for row in locus_index.select("idx").collect()] + + half_matrix = ( + BlockMatrix.read(self.pan_ukbb_bm_path.format(POP=ancestry)) + .filter(idx, idx) + .to_numpy() + ) + + alleleOrder = [ + row["alleleOrder"] for row in locus_index.select("alleleOrder").collect() + ] + outer_allele_order = np.outer(alleleOrder, alleleOrder) + np.fill_diagonal(outer_allele_order, 1) + + ld_matrix = (half_matrix + half_matrix.T) - np.diag(np.diag(half_matrix)) + ld_matrix = ld_matrix * outer_allele_order + np.fill_diagonal(ld_matrix, 1) + + return ld_matrix + + def get_locus_index_boundaries( + self, + session: Session, + study_locus_row: Row, + ancestry: str = "EUR", + ) -> DataFrame: + """Extract hail matrix index from StudyLocus rows. + + Args: + session (Session): Session object + study_locus_row (Row): Study-locus row + ancestry (str): Major population, default is "EUR" + + Returns: + DataFrame: Returns the index of the pan-ukbb matrix for the locus + + """ + chromosome = str(study_locus_row["chromosome"]) + start = int(study_locus_row["locusStart"]) + end = int(study_locus_row["locusEnd"]) + + index_file = session.spark.read.parquet( + self.ukbb_annotation_output_path.format(POP=ancestry) + ) + + index_file = index_file.filter( + (f.col("chromosome") == chromosome) + & (f.col("position") >= start) + & (f.col("position") <= end) + ).sort("idx") + + return index_file diff --git a/src/gentropy/datasource/ukb_ppp_eur/__init__.py b/src/gentropy/datasource/ukb_ppp_eur/__init__.py new file mode 100644 index 000000000..784877a26 --- /dev/null +++ b/src/gentropy/datasource/ukb_ppp_eur/__init__.py @@ -0,0 +1,3 @@ +"""UKB PPP (EUR) data source.""" + +from __future__ import annotations diff --git a/src/gentropy/datasource/ukb_ppp_eur/study_index.py b/src/gentropy/datasource/ukb_ppp_eur/study_index.py new file mode 100644 index 000000000..890630e54 --- /dev/null +++ b/src/gentropy/datasource/ukb_ppp_eur/study_index.py @@ -0,0 +1,75 @@ +"""Study Index for Finngen data source.""" + +from __future__ import annotations + +import pyspark.sql.functions as f +from pyspark.sql import SparkSession + +from gentropy.dataset.study_index import StudyIndex + + +class UkbPppEurStudyIndex(StudyIndex): + """Study index dataset from UKB PPP (EUR).""" + + @classmethod + def from_source( + cls: type[UkbPppEurStudyIndex], + spark: SparkSession, + raw_study_index_path_from_tsv: str, + raw_summary_stats_path: str, + ) -> StudyIndex: + """This function ingests study level metadata from UKB PPP (EUR). + + Args: + spark (SparkSession): Spark session object. + raw_study_index_path_from_tsv (str): Raw study index path. + raw_summary_stats_path (str): Raw summary stats path. + + Returns: + StudyIndex: Parsed and annotated UKB PPP (EUR) study table. + """ + # In order to populate the nSamples column, we need to peek inside the summary stats dataframe. + num_of_samples = ( + spark.read.parquet(raw_summary_stats_path) + .filter(f.col("chromosome") == "22") + .groupBy("studyId") + .agg(f.first("N").cast("integer").alias("nSamples")) + .select("*") + ) + # Now we can read the raw study index and complete the processing. + study_index_df = ( + spark.read.csv(raw_study_index_path_from_tsv, sep="\t", header=True) + .select( + f.lit("pqtl").alias("studyType"), + f.lit("UKB_PPP_EUR").alias("projectId"), + f.col("_gentropy_study_id").alias("studyId"), + f.col("UKBPPP_ProteinID").alias("traitFromSource"), + f.lit("UBERON_0001969").alias("biosampleFromSourceId"), + f.col("ensembl_id").alias("geneId"), + f.lit(True).alias("hasSumstats"), + f.col("_gentropy_summary_stats_link").alias("summarystatsLocation"), + ) + .join(num_of_samples, "studyId", "inner") + ) + # Add population structure. + study_index_df = ( + study_index_df.withColumn( + "discoverySamples", + f.array( + f.struct( + f.col("nSamples").cast("integer").alias("sampleSize"), + f.lit("European").alias("ancestry"), + ) + ), + ) + .withColumn( + "ldPopulationStructure", + cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + ) + .withColumn("biosampleFromSourceId", f.lit("UBERON_0001969")) + ) + + return StudyIndex( + _df=study_index_df, + _schema=StudyIndex.get_schema(), + ) diff --git a/src/gentropy/datasource/ukb_ppp_eur/summary_stats.py b/src/gentropy/datasource/ukb_ppp_eur/summary_stats.py new file mode 100644 index 000000000..5ded9c891 --- /dev/null +++ b/src/gentropy/datasource/ukb_ppp_eur/summary_stats.py @@ -0,0 +1,58 @@ +"""Summary statistics ingestion for UKB PPP (EUR).""" + +from __future__ import annotations + +from dataclasses import dataclass + +from pyspark.sql import SparkSession + +from gentropy.common.harmonise import harmonise_summary_stats +from gentropy.dataset.summary_statistics import SummaryStatistics + + +@dataclass +class UkbPppEurSummaryStats: + """Summary statistics dataset for UKB PPP (EUR).""" + + @classmethod + def from_source( + cls: type[UkbPppEurSummaryStats], + spark: SparkSession, + raw_summary_stats_path: str, + tmp_variant_annotation_path: str, + chromosome: str, + study_index_path: str, + ) -> SummaryStatistics: + """Ingest and harmonise all summary stats for UKB PPP (EUR) data. + + Args: + spark (SparkSession): Spark session object. + raw_summary_stats_path (str): Input raw summary stats path. + tmp_variant_annotation_path (str): Input variant annotation dataset path. + chromosome (str): Which chromosome to process. + study_index_path (str): The path to study index, which is necessary in some cases to populate the sample size column. + + Returns: + SummaryStatistics: Processed summary statistics dataset for a given chromosome. + """ + df = harmonise_summary_stats( + spark, + raw_summary_stats_path, + tmp_variant_annotation_path, + chromosome, + colname_position="GENPOS", + colname_allele0="ALLELE0", + colname_allele1="ALLELE1", + colname_a1freq="A1FREQ", + colname_info="INFO", + colname_beta="BETA", + colname_se="SE", + colname_mlog10p="LOG10P", + colname_n="N", + ) + + # Create the summary statistics object. + return SummaryStatistics( + _df=df, + _schema=SummaryStatistics.get_schema(), + ) diff --git a/src/gentropy/datasource/ukbiobank/__init__.py b/src/gentropy/datasource/ukbiobank/__init__.py index 544779b18..910603703 100644 --- a/src/gentropy/datasource/ukbiobank/__init__.py +++ b/src/gentropy/datasource/ukbiobank/__init__.py @@ -1,3 +1,3 @@ -"""GWAS Catalog Data Source.""" +"""UK biobank.""" from __future__ import annotations diff --git a/src/gentropy/eqtl_catalogue.py b/src/gentropy/eqtl_catalogue.py index 22c8880f0..3ad61ddea 100644 --- a/src/gentropy/eqtl_catalogue.py +++ b/src/gentropy/eqtl_catalogue.py @@ -1,62 +1,79 @@ -"""Step to run eQTL Catalogue study table ingestion.""" +"""Step to run eQTL Catalogue credible set and study index ingestion.""" from __future__ import annotations from gentropy.common.session import Session +from gentropy.config import EqtlCatalogueConfig +from gentropy.datasource.eqtl_catalogue.finemapping import EqtlCatalogueFinemapping from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex -from gentropy.datasource.eqtl_catalogue.summary_stats import EqtlCatalogueSummaryStats class EqtlCatalogueStep: - """eQTL Catalogue ingestion step.""" + """eQTL Catalogue ingestion step. + + From SuSIE fine mapping results (available at [their FTP](https://ftp.ebi.ac.uk/pub/databases/spot/eQTL/susie/) ), we extract credible sets and study index datasets from gene expression QTL studies. + """ def __init__( self, session: Session, + mqtl_quantification_methods_blacklist: list[str], eqtl_catalogue_paths_imported: str, eqtl_catalogue_study_index_out: str, - eqtl_catalogue_summary_stats_out: str, + eqtl_catalogue_credible_sets_out: str, + eqtl_lead_pvalue_threshold: float = EqtlCatalogueConfig().eqtl_lead_pvalue_threshold, ) -> None: """Run eQTL Catalogue ingestion step. Args: session (Session): Session object. - eqtl_catalogue_paths_imported (str): Input eQTL Catalogue study index path. + mqtl_quantification_methods_blacklist (list[str]): Molecular trait quantification methods that we don't want to ingest. Available options in https://github.com/eQTL-Catalogue/eQTL-Catalogue-resources/blob/master/data_tables/dataset_metadata.tsv + eqtl_catalogue_paths_imported (str): Input eQTL Catalogue fine mapping results path. eqtl_catalogue_study_index_out (str): Output eQTL Catalogue study index path. - eqtl_catalogue_summary_stats_out (str): Output eQTL Catalogue summary stats path. + eqtl_catalogue_credible_sets_out (str): Output eQTL Catalogue credible sets path. + eqtl_lead_pvalue_threshold (float, optional): Lead p-value threshold. Defaults to EqtlCatalogueConfig().eqtl_lead_pvalue_threshold. """ - # Fetch study index. - df = session.spark.read.option("delimiter", "\t").csv( - eqtl_catalogue_paths_imported, header=True + # Extract + studies_metadata = EqtlCatalogueStudyIndex.read_studies_from_source( + session, list(mqtl_quantification_methods_blacklist) + ) + + # Load raw data only for the studies we are interested in ingestion. This makes the proces much lighter. + studies_to_ingest = EqtlCatalogueStudyIndex.get_studies_of_interest( + studies_metadata ) - # Process partial study index. At this point, it is not complete because we don't have the gene IDs, which we - # will only get once the summary stats are ingested. - study_index_df = EqtlCatalogueStudyIndex.from_source(df).df - - # Fetch summary stats. - input_filenames = [row.summarystatsLocation for row in study_index_df.collect()] - summary_stats_df = ( - session.spark.read.option("delimiter", "\t") - .csv(input_filenames, header=True) - .repartition(1280) + credible_sets_df = EqtlCatalogueFinemapping.read_credible_set_from_source( + session, + credible_set_path=[ + f"{eqtl_catalogue_paths_imported}/{qtd_id}.credible_sets.tsv" + for qtd_id in studies_to_ingest + ], ) - # Process summary stats. - summary_stats_df = EqtlCatalogueSummaryStats.from_source(summary_stats_df).df - - # Add geneId column to the study index. - study_index_df = EqtlCatalogueStudyIndex.add_gene_to_study_id( - study_index_df, - summary_stats_df, - ).df - - # Write study index. - study_index_df.write.mode(session.write_mode).parquet( - eqtl_catalogue_study_index_out + lbf_df = EqtlCatalogueFinemapping.read_lbf_from_source( + session, + lbf_path=[ + f"{eqtl_catalogue_paths_imported}/{qtd_id}.lbf_variable.txt" + for qtd_id in studies_to_ingest + ], + ) + + # Transform + processed_susie_df = EqtlCatalogueFinemapping.parse_susie_results( + credible_sets_df, lbf_df, studies_metadata ) - # Write summary stats. + + ( + EqtlCatalogueStudyIndex.from_susie_results(processed_susie_df) + # Writing the output: + .df.write.mode(session.write_mode) + .parquet(eqtl_catalogue_study_index_out) + ) + ( - summary_stats_df.sortWithinPartitions("position") - .write.partitionBy("chromosome") - .mode(session.write_mode) - .parquet(eqtl_catalogue_summary_stats_out) + EqtlCatalogueFinemapping.from_susie_results(processed_susie_df) + # Flagging sub-significnat loci: + .validate_lead_pvalue(pvalue_cutoff=eqtl_lead_pvalue_threshold) + # Writing the output: + .df.write.mode(session.write_mode) + .parquet(eqtl_catalogue_credible_sets_out) ) diff --git a/src/gentropy/finemapping_simulations.py b/src/gentropy/finemapping_simulations.py new file mode 100644 index 000000000..92b30566c --- /dev/null +++ b/src/gentropy/finemapping_simulations.py @@ -0,0 +1,267 @@ +"""Step/stash of functions to run a simulations to benchmark finemapping.""" + +from typing import Any + +import numpy as np +import pandas as pd +from pyspark.sql import DataFrame +from pyspark.sql.functions import array_contains, col, when +from pyspark.sql.types import DoubleType, StringType, StructField, StructType +from scipy.stats import chi2 + +from gentropy.common.session import Session +from gentropy.susie_finemapper import SusieFineMapperStep + + +class FineMappingSimulations: + """The module describes functions for running fine-mapping simulations and benchmarking.""" + + @staticmethod + def ProvideSummary(cred_sets: DataFrame, n_causal: int) -> dict[str, Any]: + """Provides summary for the simulation results. + + Args: + cred_sets (DataFrame): DataFrame containing the credible sets. + n_causal (int): Number of causal SNPs. + + Returns: + dict[str, Any]: Dictionary containing the summary. + """ + return { + "successful_runs": cred_sets["studyId"].nunique(), + "number_of_cs": len(cred_sets["is_in_X"]), + "expected_results": n_causal * cred_sets["studyId"].nunique(), + "false_positives": (len(cred_sets["is_in_X"]) - sum(cred_sets["is_in_X"])) + / len(cred_sets["is_in_X"]), + "accuracy": sum(cred_sets["is_in_X"]) / len(cred_sets["is_in_X"]), + "accuracy_lead": sum(cred_sets["is_in_lead"]) + / len(cred_sets["is_in_lead"]), + "sensitivity": sum(cred_sets["is_in_X"]) + / (n_causal * cred_sets["studyId"].nunique()), + } + + @staticmethod + def SimulationLoop( + n_iter: int, + ld_index: DataFrame, + n_causal: int, + ld_matrix_for_sim: np.ndarray, + session: Session, + he2_reggen: float, + sample_size: int, + noise: bool = False, + scale_noise: float = 1, + run_carma: bool = False, + run_sumstat_imputation: bool = False, + prop_of_snps_to_noise: float = 0.1, + ) -> DataFrame: + """Run a simulation cycle. + + Args: + n_iter (int): Number of iterations. + ld_index (DataFrame): DataFrame containing the LD index. + n_causal (int): Number of causal SNPs. + ld_matrix_for_sim (np.ndarray): LD matrix. + session (Session): Session object. + he2_reggen (float): Heritability explained by the combined effect of the region and gene. + sample_size (int): Sample size. + noise (bool, optional): Add noise to the simulation. Defaults to False. + scale_noise (float, optional): Scale of the noise. Defaults to 1. + run_carma (bool, optional): Run CARMA. Defaults to False. + run_sumstat_imputation (bool, optional): Run summary statistics imputation. Defaults to False. + prop_of_snps_to_noise (float, optional): Proportion of SNPs to add noise to. Defaults to 0.1. + + Returns: + DataFrame: DataFrame containing the credible sets. + """ + pd.DataFrame.iteritems = pd.DataFrame.items + + ld_index_pd = ld_index.toPandas() + counter = 1 + cred_sets = None + iteration = 0 + column_list = [ + "credibleSetIndex", + "studyLocusId", + "studyId", + "region", + "exploded_locus", + "variantId", + "chromosome", + "position", + "credibleSetlog10BF", + "purityMeanR2", + "purityMinR2", + "zScore", + "pValueMantissa", + "pValueExponent", + "is_in_X", + "is_in_lead", + ] + for iteration in range(n_iter): + x_cycle = FineMappingSimulations.SimSumStatFromLD( + n_causal=n_causal, + he2_reggen=he2_reggen, + n=sample_size, + U=ld_matrix_for_sim, + noise=noise, + scale_noise=scale_noise, + ) + + if sum(x_cycle["P"] <= 5e-8) > 0: + df = pd.DataFrame( + {"z": x_cycle["Z"], "variantId": ld_index_pd["variantId"]} + ) + schema = StructType( + [ + StructField("z", DoubleType(), True), + StructField("variantId", StringType(), True), + ] + ) + df_spark = session.spark.createDataFrame(df, schema=schema) + + j = "" + for ii in ld_index_pd["variantId"][x_cycle["indexes"]].tolist(): + j = j + str(ii) + "," + + CS_sim = SusieFineMapperStep.susie_finemapper_from_prepared_dataframes( + GWAS_df=df_spark, + ld_index=ld_index, + gnomad_ld=ld_matrix_for_sim, + L=10, + session=session, + studyId="sim" + str(iteration), + region=j, + susie_est_tausq=False, + run_carma=run_carma, + run_sumstat_imputation=run_sumstat_imputation, + carma_time_limit=600, + imputed_r2_threshold=0.9, + ld_score_threshold=5, + sum_pips=0.99, + lead_pval_threshold=1, + purity_mean_r2_threshold=0, + purity_min_r2_threshold=0, + cs_lbf_thr=2, + ld_min_r2=0.9, + locusStart=1, + locusEnd=2, + ) + + if CS_sim is not None: + cs_sl = CS_sim["study_locus"] + cred_set = cs_sl.df + + X = ld_index_pd["variantId"][x_cycle["indexes"]].tolist() + + cred_set = cred_set.withColumn( + "exploded_locus", col("locus.variantId") + ) + # Create a condition for each element in X + conditions = [array_contains(col("exploded_locus"), x) for x in X] + # Combine the conditions using the | operator + combined_condition = conditions[0] + for condition in conditions[1:]: + combined_condition = combined_condition | condition + # Create a new column that is True if any condition is True and False otherwise + cred_set = cred_set.withColumn("is_in_X", combined_condition) + + cred_set = cred_set.withColumn( + "is_in_lead", when(col("variantId").isin(X), 1).otherwise(0) + ) + + cred_set = cred_set.toPandas() + cred_set = cred_set[column_list] + + if counter == 1: + cred_sets = cred_set + else: + # cred_sets = cred_sets.unionByName(cred_set) + cred_sets = pd.concat([cred_sets, cred_set], axis=0) + # cred_sets=cred_sets.merge(cred_set) + counter = counter + 1 + + return cred_sets + + @staticmethod + def SimSumStatFromLD( + n_causal: int, + he2_reggen: float, + U: np.ndarray, + n: int, + noise: bool = False, + scale_noise: float = 1, + ) -> dict[str, Any]: + """Simulates summary statistics (vector of Z-scores) using numbr of causla SNPs and LD matrix as input. + + Args: + n_causal (int): number of causal snps. + he2_reggen (float): Heritability explained by the combined effect of the region and gene. + U (np.ndarray): LD. + n (int): Sample size. + noise (bool, optional): Add noise to the simulation. Defaults to False. + scale_noise (float, optional): Scale of the noise. Defaults to 1. + + Returns: + dict[str, Any]: Dictionary containing the simulated summary statistics. + """ + # Calculate the total number of SNPs in analysis + M = U.shape[0] + + # Calculate heritability explained by one causal SNP + Tau = n * he2_reggen / n_causal + + # Simulate the causal status of SNPs + indexes = np.random.choice(np.arange(M), size=n_causal, replace=False) + cc = np.repeat(0, M) + cc[indexes] = 1 + + # Simulate joint z-statistics + jz = np.zeros(M) + x = np.random.normal(loc=0, scale=1, size=n_causal) + jz[cc == 1] = x * np.sqrt(Tau) + + # Simulate GWAS z-statistics + muz = U @ jz + GWASz = np.random.multivariate_normal(mean=muz, cov=U, size=1) + + GWASz = GWASz.flatten() + + if noise: + # M1 = int(M * prop_of_snps_to_noise) + # indexes_causal = indexes[ + # np.random.choice(np.arange(len(indexes)), size=1, replace=False) + # ] + # indexes_noise = np.random.choice(np.arange(M), size=M1, replace=False) + # combined = np.concatenate((indexes_causal, indexes_noise)) + # unique_elements = np.unique(combined) + # GWASz[unique_elements] = GWASz[unique_elements] + np.random.normal( + # loc=0, scale=scale_noise, size=len(unique_elements) + # ) + indexes_causal = indexes[ + np.random.choice(np.arange(len(indexes)), size=1, replace=False) + ] + x_tmp = U[indexes_causal, :] + x_tmp = np.abs(x_tmp) + x_tmp = x_tmp.flatten() + x_tmp[indexes_causal] = 0 + ind_tmp = np.where(x_tmp > 0.5) + ind_tmp = ind_tmp[0] + if len(ind_tmp) >= 2: + indexes_noise = ind_tmp[ + np.random.choice(np.arange(len(ind_tmp)), size=2, replace=False) + ] + else: + indexes_noise = np.random.choice(M, size=2, replace=False) + GWASz[indexes_noise] = GWASz[indexes_noise] + np.random.normal( + loc=0, scale=scale_noise, size=len(indexes_noise) + ) + + GWASp = chi2.sf(GWASz**2, df=1) # convert Z to Pval + + return { + "Z": GWASz.flatten(), + "P": GWASp.flatten(), + "Tau": Tau, + "indexes": indexes, + } diff --git a/src/gentropy/finngen_finemapping_ingestion.py b/src/gentropy/finngen_finemapping_ingestion.py index d70316b5e..c093bdb3d 100644 --- a/src/gentropy/finngen_finemapping_ingestion.py +++ b/src/gentropy/finngen_finemapping_ingestion.py @@ -6,7 +6,9 @@ from dataclasses import dataclass from gentropy.common.session import Session +from gentropy.config import FinngenFinemappingConfig from gentropy.datasource.finngen.finemapping import FinnGenFinemapping +from gentropy.datasource.finngen.study_index import FinnGenStudyIndex @dataclass @@ -16,30 +18,38 @@ class FinnGenFinemappingIngestionStep(FinnGenFinemapping): def __init__( self, session: Session, - finngen_finemapping_results_path: str, - finngen_finemapping_summaries_path: str, - finngen_release_prefix: str, finngen_finemapping_out: str, + finngen_susie_finemapping_snp_files: str = FinngenFinemappingConfig().finngen_susie_finemapping_snp_files, + finngen_susie_finemapping_cs_summary_files: str = FinngenFinemappingConfig().finngen_susie_finemapping_cs_summary_files, + finngen_finemapping_lead_pvalue_threshold: float = FinngenFinemappingConfig().finngen_finemapping_lead_pvalue_threshold, + finngen_release_prefix: str = FinngenFinemappingConfig().finngen_release_prefix, ) -> None: """Run FinnGen finemapping ingestion step. Args: session (Session): Session object. - finngen_finemapping_results_path (str): Path to the FinnGen SuSIE finemapping results. - finngen_finemapping_summaries_path (str): FinnGen SuSIE summaries for CS filters(LBF>2). - finngen_release_prefix (str): Release prefix for FinnGen. finngen_finemapping_out (str): Output path for the finemapping results in StudyLocus format. + finngen_susie_finemapping_snp_files(str): Path to the FinnGen SuSIE finemapping results. + finngen_susie_finemapping_cs_summary_files (str): FinnGen SuSIE summaries for CS filters(LBF>2). + finngen_finemapping_lead_pvalue_threshold (float): Lead p-value threshold. + finngen_release_prefix (str): Finngen project release prefix. Should look like FINNGEN_R*. """ # Read finemapping outputs from the input paths. - - finngen_finemapping_df = FinnGenFinemapping.from_finngen_susie_finemapping( - spark=session.spark, - finngen_finemapping_df=finngen_finemapping_results_path, - finngen_finemapping_summaries=finngen_finemapping_summaries_path, - finngen_release_prefix=finngen_release_prefix, - ) - - # Write the output. - finngen_finemapping_df.df.write.mode(session.write_mode).parquet( - finngen_finemapping_out + finngen_release_prefix = FinnGenStudyIndex.validate_release_prefix( + finngen_release_prefix + )["prefix"] + ( + FinnGenFinemapping.from_finngen_susie_finemapping( + spark=session.spark, + finngen_susie_finemapping_snp_files=finngen_susie_finemapping_snp_files, + finngen_susie_finemapping_cs_summary_files=finngen_susie_finemapping_cs_summary_files, + finngen_release_prefix=finngen_release_prefix, + ) + # Flagging sub-significnat loci: + .validate_lead_pvalue( + pvalue_cutoff=finngen_finemapping_lead_pvalue_threshold + ) + # Writing the output: + .df.write.mode(session.write_mode) + .parquet(finngen_finemapping_out) ) diff --git a/src/gentropy/finngen_studies.py b/src/gentropy/finngen_studies.py index c1869b736..d7fd558ef 100644 --- a/src/gentropy/finngen_studies.py +++ b/src/gentropy/finngen_studies.py @@ -3,20 +3,57 @@ from __future__ import annotations from gentropy.common.session import Session +from gentropy.config import FinngenStudiesConfig from gentropy.datasource.finngen.study_index import FinnGenStudyIndex class FinnGenStudiesStep: """FinnGen study index generation step.""" - def __init__(self, session: Session, finngen_study_index_out: str) -> None: + def __init__( + self, + session: Session, + finngen_study_index_out: str, + finngen_phenotype_table_url: str = FinngenStudiesConfig().finngen_phenotype_table_url, + finngen_release_prefix: str = FinngenStudiesConfig().finngen_release_prefix, + finngen_summary_stats_url_prefix: str = FinngenStudiesConfig().finngen_summary_stats_url_prefix, + finngen_summary_stats_url_suffix: str = FinngenStudiesConfig().finngen_summary_stats_url_suffix, + efo_curation_mapping_url: str = FinngenStudiesConfig().efo_curation_mapping_url, + sample_size: int = FinngenStudiesConfig().sample_size, + ) -> None: """Run FinnGen study index generation step. Args: session (Session): Session object. finngen_study_index_out (str): Output FinnGen study index path. + finngen_phenotype_table_url (str): URL to the FinnGen phenotype table. + finngen_release_prefix (str): FinnGen release prefix. + finngen_summary_stats_url_prefix (str): FinnGen summary stats URL prefix. + finngen_summary_stats_url_suffix (str): FinnGen summary stats URL suffix. + efo_curation_mapping_url (str): URL to the EFO curation mapping file + sample_size (int): Number of individuals that participated in sample collection, derived from finngen release metadata. """ - # Fetch study index. - FinnGenStudyIndex.from_source(session.spark).df.write.mode( - session.write_mode - ).parquet(finngen_study_index_out) + _match = FinnGenStudyIndex.validate_release_prefix(finngen_release_prefix) + release_prefix = _match["prefix"] + release = _match["release"] + + efo_curation_df = FinnGenStudyIndex.read_efo_curation( + session.spark, + efo_curation_mapping_url, + ) + study_index = FinnGenStudyIndex.from_source( + session.spark, + finngen_phenotype_table_url, + release_prefix, + finngen_summary_stats_url_prefix, + finngen_summary_stats_url_suffix, + sample_size, + ) + study_index_with_efo = FinnGenStudyIndex.join_efo_mapping( + study_index, + efo_curation_df, + release, + ) + study_index_with_efo.df.write.mode(session.write_mode).parquet( + finngen_study_index_out + ) diff --git a/src/gentropy/finngen_ukb_meta.py b/src/gentropy/finngen_ukb_meta.py new file mode 100644 index 000000000..eafd2a659 --- /dev/null +++ b/src/gentropy/finngen_ukb_meta.py @@ -0,0 +1,49 @@ +"""Step to run FinnGen UKB meta-analysis data ingestion.""" + +from __future__ import annotations + +from gentropy.common.per_chromosome import ( + prepare_va, + process_summary_stats_per_chromosome, +) +from gentropy.common.session import Session +from gentropy.datasource.finngen_ukb_meta.study_index import FinngenUkbMetaStudyIndex +from gentropy.datasource.finngen_ukb_meta.summary_stats import ( + FinngenUkbMetaSummaryStats, +) + + +class FinngenUkbMetaIngestionStep: + """FinnGen UKB meta-analysis data ingestion and harmonisation.""" + + def __init__( + self, session: Session, raw_study_index_path_from_tsv: str, raw_summary_stats_path: str, variant_annotation_path: str, tmp_variant_annotation_path: str, study_index_output_path: str, summary_stats_output_path: str + ) -> None: + """Data ingestion and harmonisation step for FinnGen UKB meta-analysis. + + Args: + session (Session): Session object. + raw_study_index_path_from_tsv (str): Input raw study index path. + raw_summary_stats_path (str): Input raw summary stats path. + variant_annotation_path (str): Input variant annotation dataset path. + tmp_variant_annotation_path (str): Temporary output path for variant annotation dataset. + study_index_output_path (str): Study index output path. + summary_stats_output_path (str): Summary stats output path. + """ + session.logger.info("Pre-compute the direct and flipped variant annotation dataset.") + prepare_va(session, variant_annotation_path, tmp_variant_annotation_path) + + session.logger.info("Process study index.") + ( + FinngenUkbMetaStudyIndex.from_source( + spark=session.spark, + raw_study_index_path_from_tsv=raw_study_index_path_from_tsv, + ) + .df + .write + .mode(session.write_mode) + .parquet(study_index_output_path) + ) + + session.logger.info("Process and harmonise summary stats.") + process_summary_stats_per_chromosome(session, FinngenUkbMetaSummaryStats, raw_summary_stats_path, tmp_variant_annotation_path, summary_stats_output_path, study_index_output_path) diff --git a/src/gentropy/gnomad_ingestion.py b/src/gentropy/gnomad_ingestion.py new file mode 100644 index 000000000..8d2cd92f9 --- /dev/null +++ b/src/gentropy/gnomad_ingestion.py @@ -0,0 +1,119 @@ +"""Step to dump a filtered version of a LD matrix (block matrix) and GnomAD variants.""" + +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.common.types import LD_Population, VariantPopulation +from gentropy.common.version_engine import VersionEngine +from gentropy.config import GnomadVariantConfig, LDIndexConfig +from gentropy.datasource.gnomad.ld import GnomADLDMatrix +from gentropy.datasource.gnomad.variants import GnomADVariants + + +class LDIndexStep: + """LD index step. + + !!! warning "This step is resource intensive" + + Suggested params: high memory machine, 5TB of boot disk, no SSDs. + + """ + + def __init__( + self, + session: Session, + ld_index_out: str, + min_r2: float = LDIndexConfig().min_r2, + ld_matrix_template: str = LDIndexConfig().ld_matrix_template, + ld_index_raw_template: str = LDIndexConfig().ld_index_raw_template, + ld_populations: list[LD_Population | str] = LDIndexConfig().ld_populations, + liftover_ht_path: str = LDIndexConfig().liftover_ht_path, + grch37_to_grch38_chain_path: str = LDIndexConfig().grch37_to_grch38_chain_path, + use_version_from_input: bool = LDIndexConfig().use_version_from_input, + ) -> None: + """Run step. + + Args: + session (Session): Session object. + ld_index_out (str): Output LD index path. (required) + min_r2 (float): Minimum r2 to consider when considering variants within a window. + ld_matrix_template (str): Input path to the gnomAD ld file with placeholder for population + ld_index_raw_template (str): Input path to the raw gnomAD LD indices file with placeholder for population string + ld_populations (list[LD_Population | str]): Population names derived from the ld file paths + liftover_ht_path (str): Path to the liftover ht file + grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates. + use_version_from_input (bool): Append version derived from input ld_matrix_template to the output ld_index_out. Defaults to False. + + In case use_version_from_input is set to True, + data source version inferred from ld_matrix_temolate is appended as the last path segment to the output path. + Default values are provided in LDIndexConfig. + """ + if use_version_from_input: + # amend data source version to output path + ld_index_out = VersionEngine("gnomad").amend_version( + ld_matrix_template, ld_index_out + ) + ( + GnomADLDMatrix( + ld_matrix_template=ld_matrix_template, + ld_index_raw_template=ld_index_raw_template, + grch37_to_grch38_chain_path=grch37_to_grch38_chain_path, + ld_populations=ld_populations, + liftover_ht_path=liftover_ht_path, + ) + .as_ld_index(min_r2) + .df.write.partitionBy("chromosome") + .mode(session.write_mode) + .parquet(ld_index_out) + ) + session.logger.info(ld_index_out) + + +class GnomadVariantIndexStep: + """A step to generate variant index dataset from gnomad data. + + Variant annotation step produces a dataset of the type `VariantIndex` derived from gnomADs `gnomad.genomes.vX.X.X.sites.ht` Hail's table. + This dataset is used to validate variants and as a source of annotation. + """ + + def __init__( + self, + session: Session, + variant_annotation_path: str = GnomadVariantConfig().variant_annotation_path, + gnomad_genomes_path: str = GnomadVariantConfig().gnomad_genomes_path, + gnomad_variant_populations: list[ + VariantPopulation | str + ] = GnomadVariantConfig().gnomad_variant_populations, + use_version_from_input: bool = GnomadVariantConfig().use_version_from_input, + ) -> None: + """Run Variant Annotation step. + + Args: + session (Session): Session object. + variant_annotation_path (str): Path to resulting dataset. + gnomad_genomes_path (str): Path to gnomAD genomes hail table, e.g. `gs://gcp-public-data--gnomad/release/4.0/ht/genomes/gnomad.genomes.v4.0.sites.ht/`. + gnomad_variant_populations (list[VariantPopulation | str]): List of populations to include. + use_version_from_input (bool): Append version derived from input gnomad_genomes_path to the output variant_annotation_path. Defaults to False. + + In case use_version_from_input is set to True, + data source version inferred from gnomad_genomes_path is appended as the last path segment to the output path. + All defaults are stored in the GnomadVariantConfig. + """ + # amend data source version to output path + if use_version_from_input: + variant_annotation_path = VersionEngine("gnomad").amend_version( + gnomad_genomes_path, variant_annotation_path + ) + + # Parse variant info from source. + ( + GnomADVariants( + gnomad_genomes_path=gnomad_genomes_path, + gnomad_variant_populations=gnomad_variant_populations, + ) + # Convert data to variant index: + .as_variant_index() + # Write file: + .df.write.mode(session.write_mode) + .parquet(variant_annotation_path) + ) diff --git a/src/gentropy/gwas_catalog_ingestion.py b/src/gentropy/gwas_catalog_ingestion.py deleted file mode 100644 index 6930a2df9..000000000 --- a/src/gentropy/gwas_catalog_ingestion.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Step to process GWAS Catalog associations and study table.""" -from __future__ import annotations - -from gentropy.common.session import Session -from gentropy.dataset.variant_annotation import VariantAnnotation -from gentropy.datasource.gwas_catalog.associations import ( - GWASCatalogCuratedAssociationsParser, -) -from gentropy.datasource.gwas_catalog.study_index import ( - StudyIndexGWASCatalogParser, - read_curation_table, -) -from gentropy.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter - - -class GWASCatalogIngestionStep: - """GWAS Catalog ingestion step to extract GWASCatalog Study and StudyLocus tables. - - !!! note This step currently only processes the GWAS Catalog curated list of top hits. - """ - - def __init__( - self, - session: Session, - catalog_study_files: list[str], - catalog_ancestry_files: list[str], - catalog_sumstats_lut: str, - catalog_associations_file: str, - variant_annotation_path: str, - catalog_studies_out: str, - catalog_associations_out: str, - gwas_catalog_study_curation_file: str | None = None, - inclusion_list_path: str | None = None, - ) -> None: - """Run step. - - Args: - session (Session): Session object. - catalog_study_files (list[str]): List of raw GWAS catalog studies file. - catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. - catalog_sumstats_lut (str): GWAS Catalog summary statistics lookup table. - catalog_associations_file (str): Raw GWAS catalog associations file. - variant_annotation_path (str): Input variant annotation path. - catalog_studies_out (str): Output GWAS catalog studies path. - catalog_associations_out (str): Output GWAS catalog associations path. - gwas_catalog_study_curation_file (str | None): file of the curation table. Optional. - inclusion_list_path (str | None): optional inclusion list (parquet) - """ - # Extract - va = VariantAnnotation.from_parquet(session, variant_annotation_path) - catalog_studies = session.spark.read.csv( - list(catalog_study_files), sep="\t", header=True - ) - ancestry_lut = session.spark.read.csv( - list(catalog_ancestry_files), sep="\t", header=True - ) - sumstats_lut = session.spark.read.csv( - catalog_sumstats_lut, sep="\t", header=False - ) - catalog_associations = session.spark.read.csv( - catalog_associations_file, sep="\t", header=True - ).persist() - gwas_catalog_study_curation = read_curation_table( - gwas_catalog_study_curation_file, session - ) - - # Transform - study_index, study_locus = GWASCatalogStudySplitter.split( - StudyIndexGWASCatalogParser.from_source( - catalog_studies, ancestry_lut, sumstats_lut - ).annotate_from_study_curation(gwas_catalog_study_curation), - GWASCatalogCuratedAssociationsParser.from_source(catalog_associations, va), - ) - - # if inclusion list is provided apply filter: - if inclusion_list_path: - inclusion_list = session.spark.read.parquet( - inclusion_list_path, sep="\t", header=True - ) - - study_index = study_index.apply_inclusion_list(inclusion_list) - study_locus = study_locus.apply_inclusion_list(inclusion_list) - - # Load - study_index.df.write.mode(session.write_mode).parquet(catalog_studies_out) - study_locus.df.write.mode(session.write_mode).parquet(catalog_associations_out) diff --git a/src/gentropy/gwas_catalog_study_curation.py b/src/gentropy/gwas_catalog_study_curation.py index 7329a1679..530e03ea6 100644 --- a/src/gentropy/gwas_catalog_study_curation.py +++ b/src/gentropy/gwas_catalog_study_curation.py @@ -1,10 +1,13 @@ """Step to update GWAS Catalog study curation file based on newly released GWAS Catalog dataset.""" + from __future__ import annotations from gentropy.common.session import Session from gentropy.datasource.gwas_catalog.study_index import ( StudyIndexGWASCatalogParser, - read_curation_table, +) +from gentropy.datasource.gwas_catalog.study_index_ot_curation import ( + StudyIndexGWASCatalogOTCuration, ) @@ -16,7 +19,6 @@ def __init__( session: Session, catalog_study_files: list[str], catalog_ancestry_files: list[str], - catalog_sumstats_lut: str, gwas_catalog_study_curation_out: str, gwas_catalog_study_curation_file: str | None, ) -> None: @@ -26,9 +28,11 @@ def __init__( session (Session): Session object. catalog_study_files (list[str]): List of raw GWAS catalog studies file. catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. - catalog_sumstats_lut (str): GWAS Catalog summary statistics lookup table. gwas_catalog_study_curation_out (str): Path for the updated curation table. gwas_catalog_study_curation_file (str | None): Path to the original curation table. Optinal + + Raises: + ValueError: If the curation file is provided but not a CSV file or URL. """ catalog_studies = session.spark.read.csv( list(catalog_study_files), sep="\t", header=True @@ -36,18 +40,24 @@ def __init__( ancestry_lut = session.spark.read.csv( list(catalog_ancestry_files), sep="\t", header=True ) - sumstats_lut = session.spark.read.csv( - catalog_sumstats_lut, sep="\t", header=False - ) - gwas_catalog_study_curation = read_curation_table( - gwas_catalog_study_curation_file, session - ) + + if gwas_catalog_study_curation_file: + if gwas_catalog_study_curation_file.endswith(".csv"): + gwas_catalog_study_curation = StudyIndexGWASCatalogOTCuration.from_csv( + session, gwas_catalog_study_curation_file + ) + elif gwas_catalog_study_curation_file.startswith("http"): + gwas_catalog_study_curation = StudyIndexGWASCatalogOTCuration.from_url( + session, gwas_catalog_study_curation_file + ) + else: + raise ValueError( + "Only CSV files or URLs are accepted as curation file." + ) # Process GWAS Catalog studies and get list of studies for curation: ( - StudyIndexGWASCatalogParser.from_source( - catalog_studies, ancestry_lut, sumstats_lut - ) + StudyIndexGWASCatalogParser.from_source(catalog_studies, ancestry_lut) # Adding existing curation: .annotate_from_study_curation(gwas_catalog_study_curation) # Extract new studies for curation: diff --git a/src/gentropy/gwas_catalog_study_inclusion.py b/src/gentropy/gwas_catalog_study_inclusion.py deleted file mode 100644 index 872177601..000000000 --- a/src/gentropy/gwas_catalog_study_inclusion.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Step to generate an GWAS Catalog study identifier inclusion and exclusion list.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -from pyspark.sql import functions as f - -from gentropy.common.session import Session -from gentropy.dataset.variant_annotation import VariantAnnotation -from gentropy.datasource.gwas_catalog.associations import ( - GWASCatalogCuratedAssociationsParser, -) -from gentropy.datasource.gwas_catalog.study_index import ( - StudyIndexGWASCatalog, - StudyIndexGWASCatalogParser, - read_curation_table, -) -from gentropy.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter - -if TYPE_CHECKING: - from pyspark.sql import Column, DataFrame - - -class GWASCatalogStudyInclusionGenerator: - """GWAS Catalog study eligibility for ingestion based on curation and the provided criteria.""" - - @staticmethod - def flag_eligible_studies( - study_index: StudyIndexGWASCatalog, criteria: str - ) -> DataFrame: - """Apply filter on GWAS Catalog studies based on the provided criteria. - - Args: - study_index (StudyIndexGWASCatalog): complete study index to be filtered based on the provided filter set - criteria (str): name of the filter set to be applied. - - Raises: - ValueError: if the provided filter set is not in the accepted values. - - Returns: - DataFrame: filtered dataframe containing only eligible studies. - """ - filters: dict[str, Column] = { - # Filters applied on studies for ingesting curated associations: - "curation": (study_index.is_gwas() & study_index.has_mapped_trait()), - # Filters applied on studies for ingesting summary statistics: - "summary_stats": ( - study_index.is_gwas() - & study_index.has_mapped_trait() - & (~study_index.is_quality_flagged()) - & study_index.has_summarystats() - ), - } - - if criteria not in filters: - raise ValueError( - f'Wrong value as filter set ({criteria}). Accepted: {",".join(filters.keys())}' - ) - - # Applying the relevant filter to the study: - return study_index.df.select( - "studyId", - "studyType", - "traitFromSource", - "traitFromSourceMappedIds", - "qualityControls", - "hasSumstats", - filters[criteria].alias("isEligible"), - ) - - @staticmethod - def process_harmonised_list(studies: list[str], session: Session) -> DataFrame: - """Generate spark dataframe from the provided list. - - Args: - studies (list[str]): list of path pointing to harmonised summary statistics. - session (Session): session - - Returns: - DataFrame: column name is consistent with original implementatin - """ - return session.spark.createDataFrame([{"_c0": path} for path in studies]) - - @staticmethod - def get_gwas_catalog_study_index( - session: Session, - variant_annotation_path: str, - catalog_study_files: list[str], - catalog_ancestry_files: list[str], - harmonised_study_file: str, - catalog_associations_file: str, - gwas_catalog_study_curation_file: str, - ) -> StudyIndexGWASCatalog: - """Return GWAS Catalog study index. - - Args: - session (Session): Session object. - variant_annotation_path (str): Input variant annotation path. - catalog_study_files (list[str]): List of raw GWAS catalog studies file. - catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. - harmonised_study_file (str): GWAS Catalog summary statistics lookup table. - catalog_associations_file (str): Raw GWAS catalog associations file. - gwas_catalog_study_curation_file (str): file of the curation table. Optional. - - Returns: - StudyIndexGWASCatalog: Completely processed and fully annotated study index. - """ - # Extract - va = VariantAnnotation.from_parquet(session, variant_annotation_path) - catalog_studies = session.spark.read.csv( - list(catalog_study_files), sep="\t", header=True - ) - ancestry_lut = session.spark.read.csv( - list(catalog_ancestry_files), sep="\t", header=True - ) - sumstats_lut = session.spark.read.csv( - harmonised_study_file, sep="\t", header=False - ) - catalog_associations = session.spark.read.csv( - catalog_associations_file, sep="\t", header=True - ).persist() - gwas_catalog_study_curation = read_curation_table( - gwas_catalog_study_curation_file, session - ) - - # Transform - study_index, _ = GWASCatalogStudySplitter.split( - StudyIndexGWASCatalogParser.from_source( - catalog_studies, - ancestry_lut, - sumstats_lut, - ).annotate_from_study_curation(gwas_catalog_study_curation), - GWASCatalogCuratedAssociationsParser.from_source(catalog_associations, va), - ) - - return study_index - - def __init__( - self, - session: Session, - catalog_study_files: list[str], - catalog_ancestry_files: list[str], - catalog_associations_file: str, - gwas_catalog_study_curation_file: str, - variant_annotation_path: str, - harmonised_study_file: str, - criteria: str, - inclusion_list_path: str, - exclusion_list_path: str, - ) -> None: - """Run step. - - Args: - session (Session): Session object. - catalog_study_files (list[str]): List of raw GWAS catalog studies file. - catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. - catalog_associations_file (str): Raw GWAS catalog associations file. - gwas_catalog_study_curation_file (str): file of the curation table. Optional. - variant_annotation_path (str): Input variant annotation path. - harmonised_study_file (str): GWAS Catalog summary statistics lookup table. - criteria (str): name of the filter set to be applied. - inclusion_list_path (str): Output path for the inclusion list. - exclusion_list_path (str): Output path for the exclusion list. - """ - # Create study index: - study_index = self.get_gwas_catalog_study_index( - session, - variant_annotation_path, - catalog_study_files, - catalog_ancestry_files, - harmonised_study_file, - catalog_associations_file, - gwas_catalog_study_curation_file, - ) - - # Get study indices for inclusion: - flagged_studies = self.flag_eligible_studies(study_index, criteria) - - # Output inclusion list: - eligible = ( - flagged_studies.filter(f.col("isEligible")).select("studyId").persist() - ) - eligible.write.mode(session.write_mode).parquet(inclusion_list_path) - - # Output exclusion list: - excluded = flagged_studies.filter(~f.col("isEligible")).persist() - excluded.write.mode(session.write_mode).parquet(exclusion_list_path) diff --git a/src/gentropy/gwas_catalog_study_index.py b/src/gentropy/gwas_catalog_study_index.py new file mode 100644 index 000000000..6c19b6909 --- /dev/null +++ b/src/gentropy/gwas_catalog_study_index.py @@ -0,0 +1,99 @@ +"""Step to generate an GWAS Catalog study identifier inclusion and exclusion list.""" + +from __future__ import annotations + +from pyspark.sql.types import DoubleType, LongType, StringType, StructField, StructType + +from gentropy.common.session import Session +from gentropy.datasource.gwas_catalog.study_index import StudyIndexGWASCatalogParser +from gentropy.datasource.gwas_catalog.study_index_ot_curation import ( + StudyIndexGWASCatalogOTCuration, +) + + +class GWASCatalogStudyIndexGenerationStep: + """GWAS Catalog study index generation. + + This step generates a study index from the GWAS Catalog studies and ancestry files. It can also add additional curation information and summary statistics QC information when available. + + ''' warning + This step does not generate study index for gwas catalog top hits. + + This step provides several optional arguments to add additional information to the study index: + + - gwas_catalog_study_curation_file: csv file or URL containing the curation table. If provided it annotates the study index with the additional curation information performed by the Open Targets team. + - sumstats_qc_path: Path to the summary statistics QC table. If provided it annotates the study index with the summary statistics QC information in the `sumStatQCValues` columns (e.g. `n_variants`, `n_variants_sig` etc.). + """ + + def __init__( + self, + session: Session, + catalog_study_files: list[str], + catalog_ancestry_files: list[str], + study_index_path: str, + gwas_catalog_study_curation_file: str | None = None, + sumstats_qc_path: str | None = None, + ) -> None: + """Run step. + + Args: + session (Session): Session objecct. + catalog_study_files (list[str]): List of raw GWAS catalog studies file. + catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. + study_index_path (str): Output GWAS catalog studies path. + gwas_catalog_study_curation_file (str | None): csv file or URL containing the curation table. Optional. + sumstats_qc_path (str | None): Path to the summary statistics QC table. Optional. + + Raises: + ValueError: If the curation file is provided but not a CSV file or URL. + """ + # Core Study Index Generation: + study_index = StudyIndexGWASCatalogParser.from_source( + session.spark.read.csv(list(catalog_study_files), sep="\t", header=True), + session.spark.read.csv(list(catalog_ancestry_files), sep="\t", header=True), + ) + + # Annotate with curation if provided: + if gwas_catalog_study_curation_file: + if gwas_catalog_study_curation_file.endswith( + ".tsv" + ) | gwas_catalog_study_curation_file.endswith(".tsv"): + gwas_catalog_study_curation = StudyIndexGWASCatalogOTCuration.from_csv( + session, gwas_catalog_study_curation_file + ) + elif gwas_catalog_study_curation_file.startswith("http"): + gwas_catalog_study_curation = StudyIndexGWASCatalogOTCuration.from_url( + session, gwas_catalog_study_curation_file + ) + else: + raise ValueError( + "Only CSV/TSV files or URLs are accepted as curation file." + ) + study_index = study_index.annotate_from_study_curation( + gwas_catalog_study_curation + ) + + # Annotate with sumstats QC if provided: + if sumstats_qc_path: + schema = StructType( + [ + StructField("studyId", StringType(), True), + StructField("mean_beta", DoubleType(), True), + StructField("mean_diff_pz", DoubleType(), True), + StructField("se_diff_pz", DoubleType(), True), + StructField("gc_lambda", DoubleType(), True), + StructField("n_variants", LongType(), True), + StructField("n_variants_sig", LongType(), True), + ] + ) + sumstats_qc = session.spark.read.schema(schema).parquet( + sumstats_qc_path, recursiveFileLookup=True + ) + study_index_with_qc = study_index.annotate_sumstats_qc(sumstats_qc) + + # Write the study + study_index_with_qc.df.write.mode(session.write_mode).parquet( + study_index_path + ) + else: + study_index.df.write.mode(session.write_mode).parquet(study_index_path) diff --git a/src/gentropy/gwas_catalog_sumstat_preprocess.py b/src/gentropy/gwas_catalog_sumstat_preprocess.py index 6ac5e2bf8..2a4a4ce99 100644 --- a/src/gentropy/gwas_catalog_sumstat_preprocess.py +++ b/src/gentropy/gwas_catalog_sumstat_preprocess.py @@ -8,7 +8,10 @@ class GWASCatalogSumstatsPreprocessStep: - """Step to preprocess GWAS Catalog harmonised summary stats.""" + """Step to preprocess GWAS Catalog harmonised summary stats. + + It additionally performs sanity filter of GWAS before saving it. + """ def __init__( self, session: Session, raw_sumstats_path: str, out_sumstats_path: str @@ -23,5 +26,5 @@ def __init__( # Processing dataset: GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( session.spark, raw_sumstats_path - ).df.write.mode(session.write_mode).parquet(out_sumstats_path) + ).sanity_filter().df.write.mode(session.write_mode).parquet(out_sumstats_path) session.logger.info("Processing dataset successfully completed.") diff --git a/src/gentropy/gwas_catalog_top_hits.py b/src/gentropy/gwas_catalog_top_hits.py new file mode 100644 index 000000000..2295900e8 --- /dev/null +++ b/src/gentropy/gwas_catalog_top_hits.py @@ -0,0 +1,76 @@ +"""Step to process GWAS Catalog associations and study table.""" + +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.config import WindowBasedClumpingStepConfig +from gentropy.dataset.variant_index import VariantIndex +from gentropy.datasource.gwas_catalog.associations import ( + GWASCatalogCuratedAssociationsParser, +) +from gentropy.datasource.gwas_catalog.study_index import ( + StudyIndexGWASCatalogParser, +) +from gentropy.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter + + +class GWASCatalogTopHitIngestionStep: + """GWAS Catalog ingestion step to extract GWASCatalog top hits.""" + + def __init__( + self, + session: Session, + catalog_study_files: list[str], + catalog_ancestry_files: list[str], + catalog_associations_file: str, + variant_annotation_path: str, + catalog_studies_out: str, + catalog_associations_out: str, + distance: int = WindowBasedClumpingStepConfig().distance, + ) -> None: + """Run step. + + Args: + session (Session): Session object. + catalog_study_files (list[str]): List of raw GWAS catalog studies file. + catalog_ancestry_files (list[str]): List of raw ancestry annotations files from GWAS Catalog. + catalog_associations_file (str): Raw GWAS catalog associations file. + variant_annotation_path (str): Path to GnomAD variants. + catalog_studies_out (str): Output GWAS catalog studies path. + catalog_associations_out (str): Output GWAS catalog associations path. + distance (int): Distance, within which tagging variants are collected around the semi-index. + """ + # Extract + gnomad_variants = VariantIndex.from_parquet(session, variant_annotation_path) + catalog_studies = session.spark.read.csv( + list(catalog_study_files), sep="\t", header=True + ) + ancestry_lut = session.spark.read.csv( + list(catalog_ancestry_files), sep="\t", header=True + ) + catalog_associations = session.spark.read.csv( + catalog_associations_file, sep="\t", header=True + ).persist() + + # Transform + study_index, study_locus = GWASCatalogStudySplitter.split( + StudyIndexGWASCatalogParser.from_source(catalog_studies, ancestry_lut), + GWASCatalogCuratedAssociationsParser.from_source( + catalog_associations, gnomad_variants + ), + ) + # Load + ( + study_index + # Flag all studies without sumstats + .add_no_sumstats_flag() + # Save dataset: + .df.write.mode(session.write_mode) + .parquet(catalog_studies_out) + ) + + ( + study_locus.window_based_clumping(distance) + .df.write.mode(session.write_mode) + .parquet(catalog_associations_out) + ) diff --git a/src/gentropy/l2g.py b/src/gentropy/l2g.py index d00a91596..b585166c1 100644 --- a/src/gentropy/l2g.py +++ b/src/gentropy/l2g.py @@ -1,176 +1,385 @@ """Step to run Locus to Gene either for inference or for training.""" + from __future__ import annotations from typing import Any import pyspark.sql.functions as f -import sklearn -from xgboost.spark import SparkXGBClassifier +from sklearn.ensemble import GradientBoostingClassifier +from wandb import login as wandb_login from gentropy.common.session import Session +from gentropy.common.spark_helpers import calculate_harmonic_sum +from gentropy.common.utils import access_gcp_secret from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.l2g_gold_standard import L2GGoldStandard from gentropy.dataset.l2g_prediction import L2GPrediction from gentropy.dataset.study_index import StudyIndex from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.v2g import V2G +from gentropy.dataset.variant_index import VariantIndex +from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader from gentropy.method.l2g.model import LocusToGeneModel from gentropy.method.l2g.trainer import LocusToGeneTrainer +class LocusToGeneFeatureMatrixStep: + """Annotate credible set with functional genomics features.""" + + def __init__( + self, + session: Session, + *, + features_list: list[str], + credible_set_path: str, + variant_index_path: str | None = None, + colocalisation_path: str | None = None, + study_index_path: str | None = None, + gene_index_path: str | None = None, + feature_matrix_path: str, + ) -> None: + """Initialise the step and run the logic based on mode. + + Args: + session (Session): Session object that contains the Spark session + features_list (list[str]): List of features to use for the model + credible_set_path (str): Path to the credible set dataset necessary to build the feature matrix + variant_index_path (str | None): Path to the variant index dataset + colocalisation_path (str | None): Path to the colocalisation dataset + study_index_path (str | None): Path to the study index dataset + gene_index_path (str | None): Path to the gene index dataset + feature_matrix_path (str): Path to the L2G feature matrix output dataset + """ + credible_set = StudyLocus.from_parquet( + session, credible_set_path, recursiveFileLookup=True + ) + studies = ( + StudyIndex.from_parquet(session, study_index_path, recursiveFileLookup=True) + if study_index_path + else None + ) + variant_index = ( + VariantIndex.from_parquet(session, variant_index_path) + if variant_index_path + else None + ) + coloc = ( + Colocalisation.from_parquet( + session, colocalisation_path, recursiveFileLookup=True + ) + if colocalisation_path + else None + ) + gene_index = ( + GeneIndex.from_parquet(session, gene_index_path, recursiveFileLookup=True) + if gene_index_path + else None + ) + features_input_loader = L2GFeatureInputLoader( + variant_index=variant_index, + colocalisation=coloc, + study_index=studies, + study_locus=credible_set, + gene_index=gene_index, + ) + + fm = credible_set.filter(f.col("studyType") == "gwas").build_feature_matrix( + features_list, features_input_loader + ) + fm._df.write.mode(session.write_mode).parquet(feature_matrix_path) + + class LocusToGeneStep: """Locus to gene step.""" def __init__( self, session: Session, + hyperparameters: dict[str, Any], + *, run_mode: str, - model_path: str, - predictions_path: str, - credible_set_path: str, - variant_gene_path: str, - colocalisation_path: str, - study_index_path: str, - gold_standard_curation_path: str, - gene_interactions_path: str, features_list: list[str], - hyperparameters: dict[str, Any], - wandb_run_name: str | None = None, - perform_cross_validation: bool = False, + download_from_hub: bool, + wandb_run_name: str, + credible_set_path: str, + feature_matrix_path: str, + model_path: str | None = None, + gold_standard_curation_path: str | None = None, + variant_index_path: str | None = None, + gene_interactions_path: str | None = None, + predictions_path: str | None = None, + hf_hub_repo_id: str | None, ) -> None: - """Run step. + """Initialise the step and run the logic based on mode. Args: - session (Session): Session object. - run_mode (str): One of "train" or "predict". - model_path (str): Path to save the model. - predictions_path (str): Path to save the predictions. - credible_set_path (str): Path to credible set Parquet files. - variant_gene_path (str): Path to variant to gene Parquet files. - colocalisation_path (str): Path to colocalisation Parquet files. - study_index_path (str): Path to study index Parquet files. - gold_standard_curation_path (str): Path to gold standard curation JSON files. - gene_interactions_path (str): Path to gene interactions Parquet files. - features_list (list[str]): List of features to use. - hyperparameters (dict[str, Any]): Hyperparameters for the model. - wandb_run_name (str | None): Name of the run to be tracked on W&B. - perform_cross_validation (bool): Whether to perform cross validation. + session (Session): Session object that contains the Spark session + hyperparameters (dict[str, Any]): Hyperparameters for the model + run_mode (str): Run mode, either 'train' or 'predict' + features_list (list[str]): List of features to use for the model + download_from_hub (bool): Whether to download the model from Hugging Face Hub + wandb_run_name (str): Name of the run to track model training in Weights and Biases + credible_set_path (str): Path to the credible set dataset necessary to build the feature matrix + feature_matrix_path (str): Path to the L2G feature matrix input dataset + model_path (str | None): Path to the model. It can be either in the filesystem or the name on the Hugging Face Hub (in the form of username/repo_name). + gold_standard_curation_path (str | None): Path to the gold standard curation file + variant_index_path (str | None): Path to the variant index + gene_interactions_path (str | None): Path to the gene interactions dataset + predictions_path (str | None): Path to the L2G predictions output dataset + hf_hub_repo_id (str | None): Hugging Face Hub repository ID. If provided, the model will be uploaded to Hugging Face. Raises: - ValueError: if run_mode is not one of "train" or "predict". + ValueError: If run_mode is not 'train' or 'predict' """ - print("Sci-kit learn version: ", sklearn.__version__) # noqa: T201 if run_mode not in ["train", "predict"]: raise ValueError( f"run_mode must be one of 'train' or 'predict', got {run_mode}" ) + + self.session = session + self.run_mode = run_mode + self.model_path = model_path + self.predictions_path = predictions_path + self.features_list = list(features_list) + self.hyperparameters = dict(hyperparameters) + self.wandb_run_name = wandb_run_name + self.hf_hub_repo_id = hf_hub_repo_id + self.download_from_hub = download_from_hub + # Load common inputs - credible_set = StudyLocus.from_parquet( + self.credible_set = StudyLocus.from_parquet( session, credible_set_path, recursiveFileLookup=True ) - studies = StudyIndex.from_parquet( - session, study_index_path, recursiveFileLookup=True + self.feature_matrix = L2GFeatureMatrix( + _df=session.load_data(feature_matrix_path), features_list=self.features_list + ) + self.variant_index = ( + VariantIndex.from_parquet(session, variant_index_path) + if variant_index_path + else None ) - v2g = V2G.from_parquet(session, variant_gene_path) - coloc = Colocalisation.from_parquet(session, colocalisation_path) if run_mode == "predict": - if not model_path or not predictions_path: - raise ValueError( - "model_path and predictions_path must be set for predict mode." - ) - predictions = L2GPrediction.from_credible_set( - model_path, list(features_list), credible_set, studies, v2g, coloc + self.run_predict() + elif run_mode == "train": + self.gs_curation = ( + self.session.spark.read.json(gold_standard_curation_path) + if gold_standard_curation_path + else None ) - predictions.df.write.mode(session.write_mode).parquet(predictions_path) - session.logger.info(predictions_path) - elif ( - run_mode == "train" - and gold_standard_curation_path - and gene_interactions_path + self.interactions = ( + self.session.spark.read.parquet(gene_interactions_path) + if gene_interactions_path + else None + ) + self.run_train() + + def run_predict(self) -> None: + """Run the prediction step. + + Raises: + ValueError: If predictions_path is not provided for prediction mode + """ + if not self.predictions_path: + raise ValueError("predictions_path must be provided for prediction mode") + predictions = L2GPrediction.from_credible_set( + self.session, + self.credible_set, + self.feature_matrix, + self.features_list, + model_path=self.model_path, + hf_token=access_gcp_secret("hfhub-key", "open-targets-genetics-dev"), + download_from_hub=self.download_from_hub, + ) + predictions.add_locus_to_gene_features(self.feature_matrix).df.write.mode( + self.session.write_mode + ).parquet(self.predictions_path) + self.session.logger.info("L2G predictions saved successfully.") + + def run_train(self) -> None: + """Run the training step.""" + if ( + self.gs_curation + and self.interactions + and self.wandb_run_name + and self.model_path ): - # Process gold standard and L2G features - gs_curation = session.spark.read.json(gold_standard_curation_path).persist() - interactions = session.spark.read.parquet(gene_interactions_path) + wandb_key = access_gcp_secret("wandb-key", "open-targets-genetics-dev") + + # Instantiate classifier and train model + l2g_model = LocusToGeneModel( + model=GradientBoostingClassifier(random_state=42), + hyperparameters=self.hyperparameters, + ) + wandb_login(key=wandb_key) + trained_model = LocusToGeneTrainer( + model=l2g_model, + feature_matrix=self._annotate_gold_standards_w_feature_matrix(), + ).train(self.wandb_run_name) + if trained_model.training_data and trained_model.model and self.model_path: + trained_model.save(self.model_path) + if self.hf_hub_repo_id: + hf_hub_token = access_gcp_secret( + "hfhub-key", "open-targets-genetics-dev" + ) + trained_model.export_to_hugging_face_hub( + # we upload the model in the filesystem + self.model_path.split("/")[-1], + hf_hub_token, + data=trained_model.training_data._df.drop( + "goldStandardSet", "geneId" + ).toPandas(), + repo_id=self.hf_hub_repo_id, + commit_message="chore: update model", + ) + + def _annotate_gold_standards_w_feature_matrix(self) -> L2GFeatureMatrix: + """Generate the feature matrix of annotated gold standards. + + Returns: + L2GFeatureMatrix: Feature matrix with gold standards annotated with features. + + Raises: + ValueError: Not all training dependencies are defined + """ + if self.gs_curation and self.interactions and self.variant_index: study_locus_overlap = StudyLocus( - # We just extract overlaps of associations in the gold standard. This parsing is a duplication of the one in the gold standard curation, - # but we need to do it here to be able to parse gold standards later - _df=credible_set.df.join( - f.broadcast( - gs_curation.select( - StudyLocus.assign_study_locus_id( - f.col("association_info.otg_id"), # studyId - f.concat_ws( # variantId - "_", - f.col("sentinel_variant.locus_GRCh38.chromosome"), - f.col("sentinel_variant.locus_GRCh38.position"), - f.col("sentinel_variant.alleles.reference"), - f.col("sentinel_variant.alleles.alternative"), - ), - ).alias("studyLocusId"), - ) + _df=self.credible_set.df.join( + self.gs_curation.select( + f.concat_ws( + "_", + f.col("sentinel_variant.locus_GRCh38.chromosome"), + f.col("sentinel_variant.locus_GRCh38.position"), + f.col("sentinel_variant.alleles.reference"), + f.col("sentinel_variant.alleles.alternative"), + ).alias("variantId"), + f.col("association_info.otg_id").alias("studyId"), ), - "studyLocusId", - "inner", + on=[ + "studyId", + "variantId", + ], + how="inner", ), _schema=StudyLocus.get_schema(), - ).find_overlaps(studies) + ).find_overlaps() gold_standards = L2GGoldStandard.from_otg_curation( - gold_standard_curation=gs_curation, - v2g=v2g, + gold_standard_curation=self.gs_curation, + variant_index=self.variant_index, study_locus_overlap=study_locus_overlap, - interactions=interactions, + interactions=self.interactions, ) - fm = L2GFeatureMatrix.generate_features( - features_list=features_list, - study_locus=credible_set, - study_index=studies, - variant_gene=v2g, - colocalisation=coloc, + return ( + gold_standards.build_feature_matrix( + self.feature_matrix, self.credible_set + ) + .select_features(self.features_list) + .persist() ) + raise ValueError("Dependencies for train mode not set.") - # Join and fill null values with 0 - data = L2GFeatureMatrix( - _df=fm.df.join( - f.broadcast( - gold_standards.df.drop("variantId", "studyId", "sources") - ), - on=["studyLocusId", "geneId"], - how="inner", - ), - _schema=L2GFeatureMatrix.get_schema(), - ).fill_na() - - # Instantiate classifier - estimator = SparkXGBClassifier( - eval_metric="logloss", - features_col="features", - label_col="label", - max_depth=5, + +class LocusToGeneEvidenceStep: + """Locus to gene evidence step.""" + + def __init__( + self, + session: Session, + locus_to_gene_predictions_path: str, + credible_set_path: str, + study_index_path: str, + evidence_output_path: str, + locus_to_gene_threshold: float, + ) -> None: + """Initialise the step and generate disease/target evidence. + + Args: + session (Session): Session object that contains the Spark session + locus_to_gene_predictions_path (str): Path to the L2G predictions dataset + credible_set_path (str): Path to the credible set dataset + study_index_path (str): Path to the study index dataset + evidence_output_path (str): Path to the L2G evidence output dataset + locus_to_gene_threshold (float, optional): Threshold to consider a gene as a target. Defaults to 0.05. + """ + # Reading the predictions + locus_to_gene_prediction = L2GPrediction.from_parquet( + session, locus_to_gene_predictions_path + ) + # Reading the credible set + credible_sets = StudyLocus.from_parquet(session, credible_set_path) + + # Reading the study index + study_index = StudyIndex.from_parquet(session, study_index_path) + + # Generate evidence and save file: + ( + locus_to_gene_prediction.to_disease_target_evidence( + credible_sets, study_index, locus_to_gene_threshold ) - l2g_model = LocusToGeneModel( - features_list=list(features_list), estimator=estimator + .write.mode(session.write_mode) + .json(evidence_output_path) + ) + + +class LocusToGeneAssociationsStep: + """Locus to gene associations step.""" + + def __init__( + self, + session: Session, + evidence_input_path: str, + disease_index_path: str, + direct_associations_output_path: str, + indirect_associations_output_path: str, + ) -> None: + """Create direct and indirect association datasets. + + Args: + session (Session): Session object that contains the Spark session + evidence_input_path (str): Path to the L2G evidence input dataset + disease_index_path (str): Path to disease index file + direct_associations_output_path (str): Path to the direct associations output dataset + indirect_associations_output_path (str): Path to the indirect associations output dataset + """ + # Read in the disease index + disease_index = session.spark.read.parquet(disease_index_path).select( + f.col("id").alias("diseaseId"), + f.explode("ancestors").alias("ancestorDiseaseId"), + ) + + # Read in the L2G evidence + disease_target_evidence = session.spark.read.json(evidence_input_path).select( + f.col("targetFromSourceId").alias("targetId"), + f.col("diseaseFromSourceMappedId").alias("diseaseId"), + f.col("resourceScore"), + ) + + # Generate direct assocations and save file + ( + disease_target_evidence.groupBy("targetId", "diseaseId") + .agg(f.collect_set("resourceScore").alias("scores")) + .select( + "targetId", + "diseaseId", + calculate_harmonic_sum(f.col("scores")).alias("harmonicSum"), ) - if perform_cross_validation: - # Perform cross validation to extract what are the best hyperparameters - cv_folds = hyperparameters.get("cross_validation_folds", 5) - LocusToGeneTrainer.cross_validate( - l2g_model=l2g_model, - data=data, - num_folds=cv_folds, - ) - else: - # Train model - LocusToGeneTrainer.train( - data=data, - l2g_model=l2g_model, - features_list=list(features_list), - model_path=model_path, - evaluate=True, - wandb_run_name=wandb_run_name, - **hyperparameters, - ) - session.logger.info(model_path) + .write.mode(session.write_mode) + .parquet(direct_associations_output_path) + ) + + # Generate indirect assocations and save file + ( + disease_target_evidence.join(disease_index, on="diseaseId", how="inner") + .groupBy("targetId", "ancestorDiseaseId") + .agg(f.collect_set("resourceScore").alias("scores")) + .select( + "targetId", + "ancestorDiseaseId", + calculate_harmonic_sum(f.col("scores")).alias("harmonicSum"), + ) + .write.mode(session.write_mode) + .parquet(indirect_associations_output_path) + ) diff --git a/src/gentropy/ld_index.py b/src/gentropy/ld_index.py deleted file mode 100644 index cb260977d..000000000 --- a/src/gentropy/ld_index.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Step to dump a filtered version of a LD matrix (block matrix) as Parquet files.""" -from __future__ import annotations - -import hail as hl - -from gentropy.common.session import Session -from gentropy.datasource.gnomad.ld import GnomADLDMatrix - - -class LDIndexStep: - """LD index step. - - !!! warning "This step is resource intensive" - - Suggested params: high memory machine, 5TB of boot disk, no SSDs. - """ - - def __init__(self, session: Session, min_r2: float, ld_index_out: str) -> None: - """Run step. - - Args: - session (Session): Session object. - min_r2 (float): Minimum r2 to consider when considering variants within a window. - ld_index_out (str): Output LD index path. - """ - hl.init(sc=session.spark.sparkContext, log="/dev/null") - ( - GnomADLDMatrix() - .as_ld_index(min_r2) - .df.write.partitionBy("chromosome") - .mode(session.write_mode) - .parquet(ld_index_out) - ) - session.logger.info(ld_index_out) diff --git a/src/gentropy/locus_breaker_clumping.py b/src/gentropy/locus_breaker_clumping.py new file mode 100644 index 000000000..fde722354 --- /dev/null +++ b/src/gentropy/locus_breaker_clumping.py @@ -0,0 +1,78 @@ +"""Step to apply linkage based clumping on study-locus dataset.""" + +from __future__ import annotations + +from gentropy.common.genomic_region import GenomicRegion, KnownGenomicRegions +from gentropy.common.session import Session +from gentropy.dataset.summary_statistics import SummaryStatistics +from gentropy.method.locus_breaker_clumping import LocusBreakerClumping + + +class LocusBreakerClumpingStep: + """Step to perform locus-breaker clumping on a study.""" + + def __init__( + self, + session: Session, + summary_statistics_input_path: str, + clumped_study_locus_output_path: str, + lbc_baseline_pvalue: float, + lbc_distance_cutoff: int, + lbc_pvalue_threshold: float, + lbc_flanking_distance: int, + large_loci_size: int, + wbc_clump_distance: int, + wbc_pvalue_threshold: float, + collect_locus: bool = False, + remove_mhc: bool = True, + ) -> None: + """Run locus-breaker clumping step. + + This step will perform locus-breaker clumping on the full set of summary statistics. + StudyLocus larger than the large_loci_size, by distance, will be further clumped with window-based + clumping. + + Args: + session (Session): Session object. + summary_statistics_input_path (str): Path to the input study locus. + clumped_study_locus_output_path (str): path of the resulting, clumped study-locus dataset. + lbc_baseline_pvalue (float): Baseline p-value for locus breaker clumping. + lbc_distance_cutoff (int): Distance cutoff for locus breaker clumping. + lbc_pvalue_threshold (float): P-value threshold for locus breaker clumping. + lbc_flanking_distance (int): Flanking distance for locus breaker clumping. + large_loci_size (int): Threshold distance to define large loci for window-based clumping. + wbc_clump_distance (int): Clump distance for window breaker clumping. + wbc_pvalue_threshold (float): P-value threshold for window breaker clumping. + collect_locus (bool, optional): Whether to collect locus. Defaults to False. + remove_mhc (bool, optional): If true will use exclude_region() to remove the MHC region. + """ + sum_stats = SummaryStatistics.from_parquet( + session, + summary_statistics_input_path, + ) + lbc = sum_stats.locus_breaker_clumping( + lbc_baseline_pvalue, + lbc_distance_cutoff, + lbc_pvalue_threshold, + lbc_flanking_distance, + ) + wbc = sum_stats.window_based_clumping(wbc_clump_distance, wbc_pvalue_threshold) + + clumped_result = LocusBreakerClumping.process_locus_breaker_output( + lbc, + wbc, + large_loci_size, + ) + if remove_mhc: + clumped_result = clumped_result.exclude_region( + GenomicRegion.from_known_genomic_region(KnownGenomicRegions.MHC), + exclude_overlap=True, + ) + + if collect_locus: + clumped_result = clumped_result.annotate_locus_statistics_boundaries( + sum_stats + ) + clumped_result.df.write.partitionBy("studyLocusId").mode( + session.write_mode + ).parquet(clumped_study_locus_output_path) diff --git a/src/gentropy/method/carma.py b/src/gentropy/method/carma.py index 85722d24d..b46f23a56 100644 --- a/src/gentropy/method/carma.py +++ b/src/gentropy/method/carma.py @@ -1,6 +1,9 @@ """CARMA outlier detection method.""" + from __future__ import annotations +import concurrent.futures +import warnings from itertools import combinations from math import floor, lgamma from typing import Any @@ -14,6 +17,42 @@ class CARMA: """Implementation of CARMA outlier detection method.""" + @staticmethod + def time_limited_CARMA_spike_slab_noEM( + z: np.ndarray, + ld: np.ndarray, + sec_threshold: float = 600, + tau: float = 0.04, + ) -> dict[str, Any]: + """The wrapper for the CARMA_spike_slab_noEM function that runs the function in a separate thread and terminates it if it takes too long. + + Args: + z (np.ndarray): Numeric vector representing z-scores. + ld (np.ndarray): Numeric matrix representing the linkage disequilibrium (LD) matrix. + sec_threshold (float): The time threshold in seconds. + tau (float): Tuning parameter controlling the level of shrinkage of the LD matrix + + Returns: + dict[str, Any]: A dictionary containing the following results: + - PIPs: A numeric vector of posterior inclusion probabilities (PIPs) for all SNPs or None. + - B_list: A dataframe containing the marginal likelihoods and the corresponding model space or None. + - Outliers: A list of outlier SNPs or None. + """ + # Ignore pandas future warnings + warnings.simplefilter(action="ignore", category=FutureWarning) + try: + # Execute CARMA.CARMA_spike_slab_noEM with a timeout + with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: + future = executor.submit( + CARMA.CARMA_spike_slab_noEM, z=z, ld=ld, tau=tau + ) + result = future.result(timeout=sec_threshold) + except concurrent.futures.TimeoutError: + # If execution exceeds the timeout, return None + result = {"PIPs": None, "B_list": None, "Outliers": None} + + return result + @staticmethod def CARMA_spike_slab_noEM( z: np.ndarray, @@ -39,7 +78,7 @@ def CARMA_spike_slab_noEM( all_inner_iter (int): The number of inner iterations in each CARMA iteration. epsilon_threshold (float): Threshold for convergence in CARMA iterations. num_causal (int): Maximal number of causal variants to be selected in the final model. - tau (float): Tuning parameter controlling the degree of sparsity in the Spike-and-Slab prior. + tau (float): Tuning parameter controlling the level of shrinkage of the LD matrix. outlier_switch (bool): Whether to consider outlier detection in the analysis. outlier_BF_index (float): Bayes Factor threshold for identifying outliers. @@ -105,7 +144,6 @@ def CARMA_spike_slab_noEM( "Outliers": all_C_list["conditional_S_list"], } - return results_list @staticmethod @@ -573,7 +611,7 @@ def _MCS_modified( # noqa: C901 num_causal (int): Maximal number of causal variants to be selected in the final model. outlier_switch (bool): Whether to consider outlier detection in the analysis. input_conditional_S_list (list[int] | None): The conditional set. Defaults to None. - tau (float): Tuning parameter controlling the degree of sparsity in the Spike-and-Slab prior. + tau (float): Tuning parameter controlling the level of shrinkage of the LD matrix. epsilon (float): Threshold for convergence in CARMA iterations. inner_all_iter (int): The number of inner iterations in each CARMA iteration. outlier_BF_index (float | None): Bayes Factor threshold for identifying outliers. Defaults to None. @@ -826,9 +864,19 @@ def _MCS_modified( # noqa: C901 sec_sample = np.random.choice( range(0, 3), 1, p=np.exp(aa) / np.sum(np.exp(aa)) ) - S = set_gamma[sec_sample[0]][ - int(set_star["gamma_set_index"][sec_sample[0]]) - ].tolist() + if set_gamma[sec_sample[0]] is not None: + S = set_gamma[sec_sample[0]][ + int(set_star["gamma_set_index"][sec_sample[0]]) + ].tolist() + else: + sec_sample = np.random.choice( + range(1, 3), + 1, + p=np.exp(aa)[[1, 2]] / np.sum(np.exp(aa)[[1, 2]]), + ) + S = set_gamma[sec_sample[0]][ + int(set_star["gamma_set_index"][sec_sample[0]]) + ].tolist() for item in conditional_S: if item not in S: diff --git a/src/gentropy/method/clump.py b/src/gentropy/method/clump.py index d239c062c..442d9d611 100644 --- a/src/gentropy/method/clump.py +++ b/src/gentropy/method/clump.py @@ -1,6 +1,5 @@ """Clumps GWAS significant variants to generate a studyLocus dataset of independent variants.""" - from __future__ import annotations from typing import TYPE_CHECKING @@ -20,6 +19,7 @@ class LDclumping: @staticmethod def _is_lead_linked( study_id: Column, + chromosome: Column, variant_id: Column, p_value_exponent: Column, p_value_mantissa: Column, @@ -29,6 +29,7 @@ def _is_lead_linked( Args: study_id (Column): studyId + chromosome (Column): chromosome variant_id (Column): Lead variant id p_value_exponent (Column): p-value exponent p_value_mantissa (Column): p-value mantissa @@ -37,31 +38,31 @@ def _is_lead_linked( Returns: Column: Boolean in which True indicates that the lead is linked to another tag in the same dataset. """ - leads_in_study = f.collect_set(variant_id).over(Window.partitionBy(study_id)) - tags_in_studylocus = f.array_union( - # Get all tag variants from the credible set per studyLocusId - f.transform(ld_set, lambda x: x.tagVariantId), - # And append the lead variant so that the intersection is the same for all studyLocusIds in a study - f.array(variant_id), - ) - intersect_lead_tags = f.array_sort( - f.array_intersect(leads_in_study, tags_in_studylocus) + # Partitoning data by study and chromosome - this is the scope for looking for linked loci. + # Within the partition, we order the data by increasing p-value, and we collect the more significant lead variants in the window. + windowspec = ( + Window.partitionBy(study_id, chromosome) + .orderBy(p_value_exponent.asc(), p_value_mantissa.asc()) + .rowsBetween(Window.unboundedPreceding, Window.currentRow) ) - return ( - # If the lead is in the credible set, we rank the peaks by p-value - f.when( - f.size(intersect_lead_tags) > 0, - f.row_number().over( - Window.partitionBy(study_id, intersect_lead_tags).orderBy( - p_value_exponent, p_value_mantissa - ) - ) - > 1, + more_significant_leads = f.collect_set(variant_id).over(windowspec) + + # Collect all variants from the ld_set + adding the lead variant to the list to make sure that the lead is always in the list. + tags_in_studylocus = f.array_distinct( + f.array_union( + f.array(variant_id), + f.transform(ld_set, lambda x: x.getField("tagVariantId")), ) - # If the intersection is empty (lead is not in the credible set or cred set is empty), the association is not linked - .otherwise(f.lit(False)) ) + # If more than one tags of the ld_set can be found in the list of the more significant leads, the lead is linked. + # Study loci without variantId is considered as not linked. + # Also leads that were not found in the LD index is also considered as not linked. + return f.when( + variant_id.isNotNull(), + f.size(f.array_intersect(more_significant_leads, tags_in_studylocus)) > 1, + ).otherwise(f.lit(False)) + @classmethod def clump(cls: type[LDclumping], associations: StudyLocus) -> StudyLocus: """Perform clumping on studyLocus dataset. diff --git a/src/gentropy/method/colocalisation.py b/src/gentropy/method/colocalisation.py index fd56398f0..c20f4909c 100644 --- a/src/gentropy/method/colocalisation.py +++ b/src/gentropy/method/colocalisation.py @@ -2,29 +2,109 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Protocol import numpy as np import pyspark.ml.functions as fml import pyspark.sql.functions as f +import pyspark.sql.types as t from pyspark.ml.linalg import DenseVector, Vectors, VectorUDT from pyspark.sql.types import DoubleType +from gentropy.common.utils import get_logsum from gentropy.dataset.colocalisation import Colocalisation if TYPE_CHECKING: + from typing import Any + from numpy.typing import NDArray from pyspark.sql import Column from gentropy.dataset.study_locus_overlap import StudyLocusOverlap -class ECaviar: +def get_tag_variant_source(statistics: Column) -> Column: + """Get the source of the tag variant for a locus-overlap row. + + Args: + statistics (Column): statistics column + + Returns: + Column: source of the tag variant + + Examples: + >>> data = [('a', 'b'),(None, 'b'),('a', None),] + >>> ( + ... spark.createDataFrame(data, ['a', 'b']) + ... .select( + ... 'a', 'b', + ... get_tag_variant_source( + ... f.struct( + ... f.col('a').alias('left_posteriorProbability'), + ... f.col('b').alias('right_posteriorProbability'), + ... ) + ... ).alias('source') + ... ) + ... .show() + ... ) + +----+----+------+ + | a| b|source| + +----+----+------+ + | a| b| both| + |null| b| right| + | a|null| left| + +----+----+------+ + + """ + return ( + # Both posterior probabilities are not null: + f.when( + statistics.left_posteriorProbability.isNotNull() + & statistics.right_posteriorProbability.isNotNull(), + f.lit("both"), + ) + # Only the left posterior probability is not null: + .when(statistics.left_posteriorProbability.isNotNull(), f.lit("left")) + # It must be right only: + .otherwise(f.lit("right")) + ) + + +class ColocalisationMethodInterface(Protocol): + """Colocalisation method interface.""" + + METHOD_NAME: str + METHOD_METRIC: str + + @classmethod + def colocalise( + cls, overlapping_signals: StudyLocusOverlap, **kwargs: Any + ) -> Colocalisation: + """Method to generate the colocalisation. + + Args: + overlapping_signals (StudyLocusOverlap): Overlapping study loci. + **kwargs (Any): Additional keyword arguments to the colocalise method. + + + Returns: + Colocalisation: loci colocalisation + + Raises: + NotImplementedError: Implement in derivative classes. + """ + raise NotImplementedError("Implement in derivative classes.") + + +class ECaviar(ColocalisationMethodInterface): """ECaviar-based colocalisation analysis. It extends [CAVIAR](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5142122/#bib18)Β framework to explicitly estimate the posterior probability that the same variant is causal in 2 studies while accounting for the uncertainty of LD. eCAVIAR computes the colocalization posterior probability (**CLPP**) by utilizing the marginal posterior probabilities. This framework allows for **multiple variants to be causal** in a single locus. """ + METHOD_NAME: str = "eCAVIAR" + METHOD_METRIC: str = "clpp" + @staticmethod def _get_clpp(left_pp: Column, right_pp: Column) -> Column: """Calculate the colocalisation posterior probability (CLPP). @@ -56,37 +136,60 @@ def _get_clpp(left_pp: Column, right_pp: Column) -> Column: @classmethod def colocalise( - cls: type[ECaviar], overlapping_signals: StudyLocusOverlap + cls: type[ECaviar], + overlapping_signals: StudyLocusOverlap, + **kwargs: Any, ) -> Colocalisation: """Calculate bayesian colocalisation based on overlapping signals. Args: overlapping_signals (StudyLocusOverlap): overlapping signals. + **kwargs (Any): Additional parameters passed to the colocalise method. Returns: Colocalisation: colocalisation results based on eCAVIAR. """ return Colocalisation( _df=( - overlapping_signals.df.withColumn( - "clpp", - ECaviar._get_clpp( - f.col("statistics.left_posteriorProbability"), - f.col("statistics.right_posteriorProbability"), - ), + overlapping_signals.df.withColumns( + { + "clpp": ECaviar._get_clpp( + f.col("statistics.left_posteriorProbability"), + f.col("statistics.right_posteriorProbability"), + ), + "tagVariantSource": get_tag_variant_source(f.col("statistics")), + } + ) + .groupBy( + "leftStudyLocusId", + "rightStudyLocusId", + "rightStudyType", + "chromosome", ) - .groupBy("leftStudyLocusId", "rightStudyLocusId", "chromosome") .agg( - f.count("*").alias("numberColocalisingVariants"), + # Count the number of tag variants that can be found in both loci: + f.size( + f.filter( + f.collect_list(f.col("tagVariantSource")), + lambda x: x == "both", + ) + ) + .cast(t.LongType()) + .alias("numberColocalisingVariants"), f.sum(f.col("clpp")).alias("clpp"), ) - .withColumn("colocalisationMethod", f.lit("eCAVIAR")) + .withColumn("colocalisationMethod", f.lit(cls.METHOD_NAME)) + .join( + overlapping_signals.calculate_beta_ratio(), + on=["leftStudyLocusId", "rightStudyLocusId","chromosome"], + how="left" + ) ), _schema=Colocalisation.get_schema(), ) -class Coloc: +class Coloc(ColocalisationMethodInterface): """Calculate bayesian colocalisation based on overlapping signals from credible sets. Based on the [R COLOC package](https://github.com/chr1swallace/coloc/blob/main/R/claudia.R), which uses the Bayes factors from the credible set to estimate the posterior probability of colocalisation. This method makes the simplifying assumption that **only one single causal variant** exists for any given trait in any genomic region. @@ -103,29 +206,13 @@ class Coloc: Coloc requires the availability of Bayes factors (BF) for each variant in the credible set (`logBF` column). + Attributes: + PSEUDOCOUNT (float): Pseudocount to avoid log(0). Defaults to 1e-10. """ - @staticmethod - def _get_logsum(log_bf: NDArray[np.float64]) -> float: - """Calculates logsum of vector. - - This function calculates the log of the sum of the exponentiated - logs taking out the max, i.e. insuring that the sum is not Inf - - Args: - log_bf (NDArray[np.float64]): log bayes factor - - Returns: - float: logsum - - Example: - >>> l = [0.2, 0.1, 0.05, 0] - >>> round(Coloc._get_logsum(l), 6) - 1.476557 - """ - themax = np.max(log_bf) - result = themax + np.log(np.sum(np.exp(log_bf - themax))) - return float(result) + METHOD_NAME: str = "COLOC" + METHOD_METRIC: str = "h4" + PSEUDOCOUNT: float = 1e-10 @staticmethod def _get_posteriors(all_bfs: NDArray[np.float64]) -> DenseVector: @@ -142,7 +229,7 @@ def _get_posteriors(all_bfs: NDArray[np.float64]) -> DenseVector: >>> Coloc._get_posteriors(l) DenseVector([0.279, 0.2524, 0.2401, 0.2284]) """ - diff = all_bfs - Coloc._get_logsum(all_bfs) + diff = all_bfs - get_logsum(all_bfs) bfs_posteriors = np.exp(diff) return Vectors.dense(bfs_posteriors) @@ -150,44 +237,74 @@ def _get_posteriors(all_bfs: NDArray[np.float64]) -> DenseVector: def colocalise( cls: type[Coloc], overlapping_signals: StudyLocusOverlap, - priorc1: float = 1e-4, - priorc2: float = 1e-4, - priorc12: float = 1e-5, + **kwargs: float, ) -> Colocalisation: """Calculate bayesian colocalisation based on overlapping signals. Args: overlapping_signals (StudyLocusOverlap): overlapping peaks + **kwargs (float): Additional parameters passed to the colocalise method. + + Keyword Args: priorc1 (float): Prior on variant being causal for trait 1. Defaults to 1e-4. priorc2 (float): Prior on variant being causal for trait 2. Defaults to 1e-4. priorc12 (float): Prior on variant being causal for traits 1 and 2. Defaults to 1e-5. Returns: Colocalisation: Colocalisation results + + Raises: + TypeError: When passed incorrect prior argument types. """ + # Ensure priors are always present, even if not passed + priorc1 = kwargs.get("priorc1") or 1e-4 + priorc2 = kwargs.get("priorc2") or 1e-4 + priorc12 = kwargs.get("priorc12") or 1e-5 + priors = [priorc1, priorc2, priorc12] + if any(not isinstance(prior, float) for prior in priors): + raise TypeError( + "Passed incorrect type(s) for prior parameters. got %s", + {type(p): p for p in priors}, + ) + # register udfs - logsum = f.udf(Coloc._get_logsum, DoubleType()) + logsum = f.udf(get_logsum, DoubleType()) posteriors = f.udf(Coloc._get_posteriors, VectorUDT()) return Colocalisation( _df=( - overlapping_signals.df + overlapping_signals.df.withColumn( + "tagVariantSource", get_tag_variant_source(f.col("statistics")) + ) + .select("*", "statistics.*") # Before summing log_BF columns nulls need to be filled with 0: - .fillna(0, subset=["statistics.left_logBF", "statistics.right_logBF"]) + .fillna(0, subset=["left_logBF", "right_logBF"]) # Sum of log_BFs for each pair of signals .withColumn( "sum_log_bf", - f.col("statistics.left_logBF") + f.col("statistics.right_logBF"), + f.col("left_logBF") + f.col("right_logBF"), ) # Group by overlapping peak and generating dense vectors of log_BF: - .groupBy("chromosome", "leftStudyLocusId", "rightStudyLocusId") + .groupBy( + "chromosome", + "leftStudyLocusId", + "rightStudyLocusId", + "rightStudyType", + ) .agg( - f.count("*").alias("numberColocalisingVariants"), - fml.array_to_vector( - f.collect_list(f.col("statistics.left_logBF")) - ).alias("left_logBF"), - fml.array_to_vector( - f.collect_list(f.col("statistics.right_logBF")) - ).alias("right_logBF"), + f.size( + f.filter( + f.collect_list(f.col("tagVariantSource")), + lambda x: x == "both", + ) + ) + .cast(t.LongType()) + .alias("numberColocalisingVariants"), + fml.array_to_vector(f.collect_list(f.col("left_logBF"))).alias( + "left_logBF" + ), + fml.array_to_vector(f.collect_list(f.col("right_logBF"))).alias( + "right_logBF" + ), fml.array_to_vector(f.collect_list(f.col("sum_log_bf"))).alias( "sum_log_bf" ), @@ -209,12 +326,12 @@ def colocalise( .withColumn("lH2bf", f.log(f.col("priorc2")) + f.col("logsum2")) # h3 .withColumn("sumlogsum", f.col("logsum1") + f.col("logsum2")) - # exclude null H3/H4s: due to sumlogsum == logsum12 - .filter(f.col("sumlogsum") != f.col("logsum12")) .withColumn("max", f.greatest("sumlogsum", "logsum12")) .withColumn( "logdiff", - ( + f.when( + f.col("sumlogsum") == f.col("logsum12"), Coloc.PSEUDOCOUNT + ).otherwise( f.col("max") + f.log( f.exp(f.col("sumlogsum") - f.col("max")) @@ -256,20 +373,22 @@ def colocalise( .withColumn("h2", f.col("posteriors").getItem(2)) .withColumn("h3", f.col("posteriors").getItem(3)) .withColumn("h4", f.col("posteriors").getItem(4)) - .withColumn("h4h3", f.col("h4") / f.col("h3")) - .withColumn("log2h4h3", f.log2(f.col("h4h3"))) # clean up .drop( "posteriors", "allBF", - "h4h3", "lH0bf", "lH1bf", "lH2bf", "lH3bf", "lH4bf", ) - .withColumn("colocalisationMethod", f.lit("COLOC")) + .withColumn("colocalisationMethod", f.lit(cls.METHOD_NAME)) + .join( + overlapping_signals.calculate_beta_ratio(), + on=["leftStudyLocusId", "rightStudyLocusId","chromosome"], + how="left" + ) ), _schema=Colocalisation.get_schema(), ) diff --git a/src/gentropy/method/l2g/evaluator.py b/src/gentropy/method/l2g/evaluator.py deleted file mode 100644 index f41b1d45e..000000000 --- a/src/gentropy/method/l2g/evaluator.py +++ /dev/null @@ -1,204 +0,0 @@ -"""Module that integrates Spark ML Evaluators with W&B for experiment tracking.""" -from __future__ import annotations - -import itertools -from typing import TYPE_CHECKING, Any, Dict - -from pyspark import keyword_only -from pyspark.ml.evaluation import ( - BinaryClassificationEvaluator, - Evaluator, - MulticlassClassificationEvaluator, -) -from pyspark.ml.param import Param, Params, TypeConverters -from wandb.sdk.wandb_run import Run - -if TYPE_CHECKING: - from pyspark.sql import DataFrame - - -class WandbEvaluator(Evaluator): - """Wrapper for pyspark Evaluators. It is expected that the user will provide an Evaluators, and this wrapper will log metrics from said evaluator to W&B.""" - - spark_ml_evaluator: Param[Evaluator] = Param( - Params._dummy(), "spark_ml_evaluator", "evaluator from pyspark.ml.evaluation" - ) - - wandb_run: Param[Run] = Param( - Params._dummy(), - "wandb_run", - "wandb run. Expects an already initialized run. You should set this, or wandb_run_kwargs, NOT BOTH", - ) - - wandb_run_kwargs: Param[Any] = Param( - Params._dummy(), - "wandb_run_kwargs", - "kwargs to be passed to wandb.init. You should set this, or wandb_runId, NOT BOTH. Setting this is useful when using with WandbCrossValdidator", - ) - - wandb_runId: Param[str] = Param( # noqa: N815 - Params._dummy(), - "wandb_runId", - "wandb run id. if not providing an intialized run to wandb_run, a run with id wandb_runId will be resumed", - ) - - wandb_project_name: Param[str] = Param( - Params._dummy(), - "wandb_project_name", - "name of W&B project", - typeConverter=TypeConverters.toString, - ) - - label_values: Param[list[str]] = Param( - Params._dummy(), - "label_values", - "for classification and multiclass classification, this is a list of values the label can assume\nIf provided Multiclass or Multilabel evaluator without label_values, we'll figure it out from dataset passed through to evaluate.", - ) - - _input_kwargs: Dict[str, Any] - - @keyword_only - def __init__( - self: WandbEvaluator, - label_values: list[str] | None = None, - **kwargs: BinaryClassificationEvaluator - | MulticlassClassificationEvaluator - | Run, - ) -> None: - """Initialize a WandbEvaluator. - - Args: - label_values (list[str] | None): List of label values. - **kwargs (BinaryClassificationEvaluator | MulticlassClassificationEvaluator | Run): Keyword arguments. - """ - if label_values is None: - label_values = [] - super(Evaluator, self).__init__() - - self.metrics = { - MulticlassClassificationEvaluator: [ - "f1", - "accuracy", - "weightedPrecision", - "weightedRecall", - "weightedTruePositiveRate", - "weightedFalsePositiveRate", - "weightedFMeasure", - "truePositiveRateByLabel", - "falsePositiveRateByLabel", - "precisionByLabel", - "recallByLabel", - "fMeasureByLabel", - "logLoss", - "hammingLoss", - ], - BinaryClassificationEvaluator: ["areaUnderROC", "areaUnderPR"], - } - - self._setDefault(label_values=[]) - kwargs = self._input_kwargs - self._set(**kwargs) - - def setspark_ml_evaluator(self: WandbEvaluator, value: Evaluator) -> None: - """Set the spark_ml_evaluator parameter. - - Args: - value (Evaluator): Spark ML evaluator. - """ - self._set(spark_ml_evaluator=value) - - def setlabel_values(self: WandbEvaluator, value: list[str]) -> None: - """Set the label_values parameter. - - Args: - value (list[str]): List of label values. - """ - self._set(label_values=value) - - def getspark_ml_evaluator(self: WandbEvaluator) -> Evaluator: - """Get the spark_ml_evaluator parameter. - - Returns: - Evaluator: Spark ML evaluator. - """ - return self.getOrDefault(self.spark_ml_evaluator) - - def getwandb_run(self: WandbEvaluator) -> Run: - """Get the wandb_run parameter. - - Returns: - Run: Wandb run object. - """ - return self.getOrDefault(self.wandb_run) - - def getwandb_project_name(self: WandbEvaluator) -> Any: - """Get the wandb_project_name parameter. - - Returns: - Any: Name of the W&B project. - """ - return self.getOrDefault(self.wandb_project_name) - - def getlabel_values(self: WandbEvaluator) -> list[str]: - """Get the label_values parameter. - - Returns: - list[str]: List of label values. - """ - return self.getOrDefault(self.label_values) - - def _evaluate(self: WandbEvaluator, dataset: DataFrame) -> float: - """Evaluate the model on the given dataset. - - Args: - dataset (DataFrame): Dataset to evaluate the model on. - - Returns: - float: Metric value. - """ - dataset.persist() - metric_values: list[tuple[str, Any]] = [] - label_values = self.getlabel_values() - spark_ml_evaluator: BinaryClassificationEvaluator | MulticlassClassificationEvaluator = ( - self.getspark_ml_evaluator() # type: ignore[assignment, unused-ignore] - ) - run = self.getwandb_run() - evaluator_type = type(spark_ml_evaluator) - for metric in self.metrics[evaluator_type]: - if "ByLabel" in metric and label_values == []: - print( # noqa: T201 - "no label_values for the target have been provided and will be determined by the dataset. This could take some time" - ) - label_values = [ - r[spark_ml_evaluator.getLabelCol()] - for r in dataset.select(spark_ml_evaluator.getLabelCol()) - .distinct() - .collect() - ] - if isinstance(label_values[0], list): - merged = list(itertools.chain(*label_values)) - label_values = list(dict.fromkeys(merged).keys()) - self.setlabel_values(label_values) - for label in label_values: - out = spark_ml_evaluator.evaluate( - dataset, - { - spark_ml_evaluator.metricLabel: label, # type: ignore[assignment, unused-ignore] - spark_ml_evaluator.metricName: metric, - }, - ) - metric_values.append((f"{metric}:{label}", out)) - out = spark_ml_evaluator.evaluate( - dataset, {spark_ml_evaluator.metricName: metric} - ) - metric_values.append((f"{metric}", out)) - run.log(dict(metric_values)) - config = [ - (f"{k.parent.split('_')[0]}.{k.name}", v) - for k, v in spark_ml_evaluator.extractParamMap().items() - if "metric" not in k.name - ] - run.config.update(dict(config)) - return_metric = spark_ml_evaluator.evaluate(dataset) - dataset.unpersist() - return return_metric diff --git a/src/gentropy/method/l2g/feature_factory.py b/src/gentropy/method/l2g/feature_factory.py index a3dba6688..fe792058a 100644 --- a/src/gentropy/method/l2g/feature_factory.py +++ b/src/gentropy/method/l2g/feature_factory.py @@ -1,392 +1,196 @@ -"""Collection of methods that extract features from the gentropy datasets to be fed in L2G.""" -from __future__ import annotations - -from functools import reduce -from typing import TYPE_CHECKING +# isort: skip_file +"""Factory that computes features based on an input list.""" -import pyspark.sql.functions as f +from __future__ import annotations -from gentropy.common.spark_helpers import ( - convert_from_wide_to_long, - get_record_with_maximum_value, +from typing import Any, Iterator, Mapping + +from gentropy.dataset.l2g_features.colocalisation import ( + EQtlColocClppMaximumFeature, + EQtlColocClppMaximumNeighbourhoodFeature, + EQtlColocH4MaximumFeature, + EQtlColocH4MaximumNeighbourhoodFeature, + PQtlColocClppMaximumFeature, + PQtlColocClppMaximumNeighbourhoodFeature, + PQtlColocH4MaximumFeature, + PQtlColocH4MaximumNeighbourhoodFeature, + SQtlColocClppMaximumFeature, + SQtlColocClppMaximumNeighbourhoodFeature, + SQtlColocH4MaximumFeature, + SQtlColocH4MaximumNeighbourhoodFeature, +) +from gentropy.dataset.l2g_features.distance import ( + DistanceFootprintMeanFeature, + DistanceFootprintMeanNeighbourhoodFeature, + DistanceSentinelFootprintFeature, + DistanceSentinelFootprintNeighbourhoodFeature, + DistanceSentinelTssFeature, + DistanceSentinelTssNeighbourhoodFeature, + DistanceTssMeanFeature, + DistanceTssMeanNeighbourhoodFeature, ) -from gentropy.dataset.l2g_feature import L2GFeature -from gentropy.dataset.study_locus import CredibleInterval, StudyLocus +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_features.other import ( + CredibleSetConfidenceFeature, + GeneCountFeature, + ProteinGeneCountFeature, + ProteinCodingFeature, +) +from gentropy.dataset.l2g_features.vep import ( + VepMaximumFeature, + VepMaximumNeighbourhoodFeature, + VepMeanFeature, + VepMeanNeighbourhoodFeature, +) +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_locus import StudyLocus -if TYPE_CHECKING: - from pyspark.sql import Column, DataFrame - from gentropy.dataset.colocalisation import Colocalisation - from gentropy.dataset.study_index import StudyIndex - from gentropy.dataset.v2g import V2G +class L2GFeatureInputLoader: + """Loads all input datasets required for the L2GFeature dataset.""" + def __init__( + self, + **kwargs: Any, + ) -> None: + """Initializes L2GFeatureInputLoader with the provided inputs and returns loaded dependencies as a dictionary. -class ColocalisationFactory: - """Feature extraction in colocalisation.""" + Args: + **kwargs (Any): keyword arguments with the name of the dependency and the dependency itself. + """ + self.input_dependencies = {k: v for k, v in kwargs.items() if v is not None} - @staticmethod - def _get_max_coloc_per_study_locus( - study_locus: StudyLocus, - studies: StudyIndex, - colocalisation: Colocalisation, - colocalisation_method: str, - ) -> L2GFeature: - """Get the maximum colocalisation posterior probability for each pair of overlapping study-locus per type of colocalisation method and QTL type. + def get_dependency_by_type( + self, dependency_type: list[Any] | Any + ) -> dict[str, Any]: + """Returns the dependency that matches the provided type. Args: - study_locus (StudyLocus): Study locus dataset - studies (StudyIndex): Study index dataset - colocalisation (Colocalisation): Colocalisation dataset - colocalisation_method (str): Colocalisation method to extract the max from + dependency_type (list[Any] | Any): type(s) of the dependency to return. Returns: - L2GFeature: Stores the features with the max coloc probabilities for each pair of study-locus - - Raises: - ValueError: If the colocalisation method is not supported + dict[str, Any]: dictionary of dependenci(es) that match the provided type(s). """ - if colocalisation_method not in ["COLOC", "eCAVIAR"]: - raise ValueError( - f"Colocalisation method {colocalisation_method} not supported" - ) - if colocalisation_method == "COLOC": - coloc_score_col_name = "log2h4h3" - coloc_feature_col_template = "ColocLlrMaximum" + if not isinstance(dependency_type, list): + dependency_type = [dependency_type] + return { + k: v + for k, v in self.input_dependencies.items() + if isinstance(v, tuple(dependency_type)) + } - elif colocalisation_method == "eCAVIAR": - coloc_score_col_name = "clpp" - coloc_feature_col_template = "ColocClppMaximum" + def __iter__(self) -> Iterator[tuple[str, Any]]: + """Make the class iterable, returning an iterator over key-value pairs. - colocalising_study_locus = ( - study_locus.df.select("studyLocusId", "studyId") - # annotate studyLoci with overlapping IDs on the left - to just keep GWAS associations - .join( - colocalisation.df.selectExpr( - "leftStudyLocusId as studyLocusId", - "rightStudyLocusId", - "colocalisationMethod", - f"{coloc_score_col_name} as coloc_score", - ), - on="studyLocusId", - how="inner", - ) - # bring study metadata to just keep QTL studies on the right - .join( - study_locus.df.selectExpr( - "studyLocusId as rightStudyLocusId", "studyId as right_studyId" - ), - on="rightStudyLocusId", - how="inner", - ) - .join( - f.broadcast( - studies.df.selectExpr( - "studyId as right_studyId", - "studyType as right_studyType", - "geneId", - ) - ), - on="right_studyId", - how="inner", - ) - .filter( - (f.col("colocalisationMethod") == colocalisation_method) - & (f.col("right_studyType") != "gwas") - ) - .select("studyLocusId", "right_studyType", "geneId", "coloc_score") - ) - - # Max PP calculation per studyLocus AND type of QTL - local_max = get_record_with_maximum_value( - colocalising_study_locus, - ["studyLocusId", "right_studyType", "geneId"], - "coloc_score", - ).persist() - - intercept = 0.0001 - neighbourhood_max = ( - ( - local_max.selectExpr( - "studyLocusId", "coloc_score as coloc_local_max", "geneId" - ) - .join( - # Add maximum in the neighborhood - get_record_with_maximum_value( - colocalising_study_locus.withColumnRenamed( - "coloc_score", "coloc_neighborhood_max" - ), - ["studyLocusId", "right_studyType"], - "coloc_neighborhood_max", - ).drop("geneId"), - on="studyLocusId", - ) - .withColumn( - f"{coloc_feature_col_template}Neighborhood", - f.log10( - f.abs( - f.col("coloc_local_max") - - f.col("coloc_neighborhood_max") - + f.lit(intercept) - ) - ), - ) - ) - .drop("coloc_neighborhood_max", "coloc_local_max") - .persist() - ) - - # Split feature per molQTL - local_dfs = [] - nbh_dfs = [] - qtl_types: list[str] = ( - colocalising_study_locus.select("right_studyType") - .distinct() - .toPandas()["right_studyType"] - .tolist() - ) or ["eqtl", "pqtl", "sqtl"] - for qtl_type in qtl_types: - filtered_local_max = ( - local_max.filter(f.col("right_studyType") == qtl_type) - .withColumnRenamed( - "coloc_score", - f"{qtl_type}{coloc_feature_col_template}", - ) - .drop("right_studyType") - ) - local_dfs.append(filtered_local_max) - - filtered_neighbourhood_max = ( - neighbourhood_max.filter(f.col("right_studyType") == qtl_type) - .withColumnRenamed( - f"{coloc_feature_col_template}Neighborhood", - f"{qtl_type}{coloc_feature_col_template}Neighborhood", - ) - .drop("right_studyType") - ) - nbh_dfs.append(filtered_neighbourhood_max) - - wide_dfs = reduce( - lambda x, y: x.unionByName(y, allowMissingColumns=True), - local_dfs + nbh_dfs, - ) - - return L2GFeature( - _df=convert_from_wide_to_long( - wide_dfs.groupBy("studyLocusId", "geneId").agg( - *( - f.first(f.col(c), ignorenulls=True).alias(c) - for c in wide_dfs.columns - if c - not in [ - "studyLocusId", - "geneId", - ] - ) - ), - id_vars=("studyLocusId", "geneId"), - var_name="featureName", - value_name="featureValue", - ), - _schema=L2GFeature.get_schema(), - ) - - @staticmethod - def _get_coloc_features( - study_locus: StudyLocus, studies: StudyIndex, colocalisation: Colocalisation - ) -> L2GFeature: - """Calls _get_max_coloc_per_study_locus for both methods and concatenates the results. + Returns: + Iterator[tuple[str, Any]]: iterator over the dictionary's key-value pairs. + """ + return iter(self.input_dependencies.items()) - !!! note "Colocalisation features are only available for the eCAVIAR results for now." + def __repr__(self) -> str: + """Return a string representation of the input dependencies. - Args: - study_locus (StudyLocus): Study locus dataset - studies (StudyIndex): Study index dataset - colocalisation (Colocalisation): Colocalisation dataset + Useful for understanding the loader content without having to print the object attribute. Returns: - L2GFeature: Stores the features with the max coloc probabilities for each pair of study-locus + str: string representation of the input dependencies. """ - coloc_clpp = ColocalisationFactory._get_max_coloc_per_study_locus( - study_locus, - studies, - colocalisation, - "eCAVIAR", - ) + return repr(self.input_dependencies) + + +class FeatureFactory: + """Factory class for creating features.""" + + feature_mapper: Mapping[str, type[L2GFeature]] = { + "distanceSentinelTss": DistanceSentinelTssFeature, + "distanceSentinelTssNeighbourhood": DistanceSentinelTssNeighbourhoodFeature, + "distanceSentinelFootprint": DistanceSentinelFootprintFeature, + "distanceSentinelFootprintNeighbourhood": DistanceSentinelFootprintNeighbourhoodFeature, + "distanceTssMean": DistanceTssMeanFeature, + "distanceTssMeanNeighbourhood": DistanceTssMeanNeighbourhoodFeature, + "distanceFootprintMean": DistanceFootprintMeanFeature, + "distanceFootprintMeanNeighbourhood": DistanceFootprintMeanNeighbourhoodFeature, + "eQtlColocClppMaximum": EQtlColocClppMaximumFeature, + "eQtlColocClppMaximumNeighbourhood": EQtlColocClppMaximumNeighbourhoodFeature, + "pQtlColocClppMaximum": PQtlColocClppMaximumFeature, + "pQtlColocClppMaximumNeighbourhood": PQtlColocClppMaximumNeighbourhoodFeature, + "sQtlColocClppMaximum": SQtlColocClppMaximumFeature, + "sQtlColocClppMaximumNeighbourhood": SQtlColocClppMaximumNeighbourhoodFeature, + "eQtlColocH4Maximum": EQtlColocH4MaximumFeature, + "eQtlColocH4MaximumNeighbourhood": EQtlColocH4MaximumNeighbourhoodFeature, + "pQtlColocH4Maximum": PQtlColocH4MaximumFeature, + "pQtlColocH4MaximumNeighbourhood": PQtlColocH4MaximumNeighbourhoodFeature, + "sQtlColocH4Maximum": SQtlColocH4MaximumFeature, + "sQtlColocH4MaximumNeighbourhood": SQtlColocH4MaximumNeighbourhoodFeature, + "vepMean": VepMeanFeature, + "vepMeanNeighbourhood": VepMeanNeighbourhoodFeature, + "vepMaximum": VepMaximumFeature, + "vepMaximumNeighbourhood": VepMaximumNeighbourhoodFeature, + "geneCount500kb": GeneCountFeature, + "proteinGeneCount500kb": ProteinGeneCountFeature, + "isProteinCoding": ProteinCodingFeature, + "credibleSetConfidence": CredibleSetConfidenceFeature, + } + + def __init__( + self: FeatureFactory, + study_loci_to_annotate: StudyLocus | L2GGoldStandard, + features_list: list[str], + ) -> None: + """Initializes the factory. - return L2GFeature( - _df=coloc_clpp.df, - _schema=L2GFeature.get_schema(), - ) - - -class StudyLocusFactory(StudyLocus): - """Feature extraction in study locus.""" + Args: + study_loci_to_annotate (StudyLocus | L2GGoldStandard): The dataset containing study loci that will be used for annotation + features_list (list[str]): list of features to compute. + """ + self.study_loci_to_annotate = study_loci_to_annotate + self.features_list = features_list - @staticmethod - def _get_tss_distance_features( - study_locus: StudyLocus, distances: V2G - ) -> L2GFeature: - """Joins StudyLocus with the V2G to extract the minimum distance to a gene TSS of all variants in a StudyLocus credible set. + def generate_features( + self: FeatureFactory, + features_input_loader: L2GFeatureInputLoader, + ) -> list[L2GFeature]: + """Generates a feature matrix by reading an object with instructions on how to create the features. Args: - study_locus (StudyLocus): Study locus dataset - distances (V2G): Dataframe containing the distances of all variants to all genes TSS within a region + features_input_loader (L2GFeatureInputLoader): object with required features dependencies. Returns: - L2GFeature: Stores the features with the minimum distance among all variants in the credible set and a gene TSS. + list[L2GFeature]: list of computed features. + Raises: + ValueError: If feature not found. """ - wide_df = ( - study_locus.filter_credible_set(CredibleInterval.IS95) - .df.select( - "studyLocusId", - "variantId", - f.explode("locus.variantId").alias("tagVariantId"), - ) - .join( - distances.df.selectExpr( - "variantId as tagVariantId", "geneId", "distance" - ), - on="tagVariantId", - how="inner", - ) - .groupBy("studyLocusId", "geneId") - .agg( - f.min("distance").alias("distanceTssMinimum"), - f.mean("distance").alias("distanceTssMean"), - ) - ) - - return L2GFeature( - _df=convert_from_wide_to_long( - wide_df, - id_vars=("studyLocusId", "geneId"), - var_name="featureName", - value_name="featureValue", - ), - _schema=L2GFeature.get_schema(), - ) - - @staticmethod - def _get_vep_features( - credible_set: StudyLocus, - v2g: V2G, + computed_features = [] + for feature in self.features_list: + if feature in self.feature_mapper: + computed_features.append( + self.compute_feature(feature, features_input_loader) + ) + else: + raise ValueError(f"Feature {feature} not found.") + return computed_features + + def compute_feature( + self: FeatureFactory, + feature_name: str, + features_input_loader: L2GFeatureInputLoader, ) -> L2GFeature: - """Get the maximum VEP score for all variants in a locus's 95% credible set. - - This informs about functional impact of the variants in the locus. For more information on variant consequences, see: https://www.ensembl.org/info/genome/variation/prediction/predicted_data.html - Two metrics: max VEP score per study locus and gene, and max VEP score per study locus. - + """Instantiates feature class. Args: - credible_set (StudyLocus): Study locus dataset with the associations to be annotated - v2g (V2G): V2G dataset with the variant/gene relationships and their consequences + feature_name (str): name of the feature + features_input_loader (L2GFeatureInputLoader): Object that contais features input. Returns: - L2GFeature: Stores the features with the max VEP score. + L2GFeature: instantiated feature object """ - - def _aggregate_vep_feature( - df: DataFrame, - aggregation_expr: Column, - aggregation_cols: list[str], - feature_name: str, - ) -> DataFrame: - """Extracts the maximum or average VEP score after grouping by the given columns. Different aggregations return different predictive annotations. - - If the group_cols include "geneId", the maximum/mean VEP score per gene is returned. - Otherwise, the maximum/mean VEP score for all genes in the neighborhood of the locus is returned. - - Args: - df (DataFrame): DataFrame with the VEP scores for each variant in a studyLocus - aggregation_expr (Column): Aggregation expression to apply - aggregation_cols (list[str]): Columns to group by - feature_name (str): Name of the feature to be returned - - Returns: - DataFrame: DataFrame with the maximum VEP score per locus or per locus/gene - """ - if "geneId" in aggregation_cols: - return df.groupBy(aggregation_cols).agg( - aggregation_expr.alias(feature_name) - ) - return ( - df.groupBy(aggregation_cols) - .agg( - aggregation_expr.alias(feature_name), - f.collect_set("geneId").alias("geneId"), - ) - .withColumn("geneId", f.explode("geneId")) - ) - - credible_set_w_variant_consequences = ( - credible_set.filter_credible_set(CredibleInterval.IS95) - .df.withColumn("variantInLocusId", f.explode(f.col("locus.variantId"))) - .withColumn( - "variantInLocusPosteriorProbability", - f.explode(f.col("locus.posteriorProbability")), - ) - .join( - # Join with V2G to get variant consequences - v2g.df.filter( - f.col("datasourceId") == "variantConsequence" - ).withColumnRenamed("variantId", "variantInLocusId"), - on="variantInLocusId", - ) - .withColumn( - "weightedScore", - f.col("score") * f.col("variantInLocusPosteriorProbability"), - ) - .select( - "studyLocusId", - "variantId", - "studyId", - "geneId", - "score", - "weightedScore", - ) - .distinct() - .persist() - ) - - return L2GFeature( - _df=convert_from_wide_to_long( - reduce( - lambda x, y: x.unionByName(y, allowMissingColumns=True), - [ - # Calculate overall max VEP score for all genes in the vicinity - credible_set_w_variant_consequences.transform( - _aggregate_vep_feature, - f.max("score"), - ["studyLocusId"], - "vepMaximumNeighborhood", - ), - # Calculate overall max VEP score per gene - credible_set_w_variant_consequences.transform( - _aggregate_vep_feature, - f.max("score"), - ["studyLocusId", "geneId"], - "vepMaximum", - ), - # Calculate mean VEP score for all genes in the vicinity - credible_set_w_variant_consequences.transform( - _aggregate_vep_feature, - f.mean("weightedScore"), - ["studyLocusId"], - "vepMeanNeighborhood", - ), - # Calculate mean VEP score per gene - credible_set_w_variant_consequences.transform( - _aggregate_vep_feature, - f.mean("weightedScore"), - ["studyLocusId", "geneId"], - "vepMean", - ), - ], - ), - id_vars=("studyLocusId", "geneId"), - var_name="featureName", - value_name="featureValue", - ).filter(f.col("featureValue").isNotNull()), - _schema=L2GFeature.get_schema(), + # Extract feature class and dependency type + feature_cls = self.feature_mapper[feature_name] + feature_dependency_type = feature_cls.feature_dependency_type + return feature_cls.compute( + study_loci_to_annotate=self.study_loci_to_annotate, + feature_dependency=features_input_loader.get_dependency_by_type( + feature_dependency_type + ), ) diff --git a/src/gentropy/method/l2g/model.py b/src/gentropy/method/l2g/model.py index 5df189d33..e35e255a2 100644 --- a/src/gentropy/method/l2g/model.py +++ b/src/gentropy/method/l2g/model.py @@ -2,304 +2,261 @@ from __future__ import annotations -from dataclasses import dataclass +import json +from dataclasses import dataclass, field +from pathlib import Path from typing import TYPE_CHECKING, Any, Type -from pyspark.ml import Pipeline, PipelineModel -from pyspark.ml.evaluation import ( - BinaryClassificationEvaluator, - MulticlassClassificationEvaluator, -) -from pyspark.ml.feature import StringIndexer, VectorAssembler -from pyspark.ml.tuning import ParamGridBuilder -from wandb.data_types import Table -from wandb.sdk import init as wandb_init -from wandb.wandb_run import Run -from xgboost.spark.core import SparkXGBClassifierModel - -from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix -from gentropy.method.l2g.evaluator import WandbEvaluator +import pandas as pd +import skops.io as sio +from pandas import DataFrame as pd_dataframe +from pandas import to_numeric as pd_to_numeric +from sklearn.ensemble import GradientBoostingClassifier +from skops import hub_utils + +from gentropy.common.session import Session +from gentropy.common.utils import copy_to_gcs if TYPE_CHECKING: - from pyspark.ml import Transformer - from pyspark.sql import DataFrame + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix + from gentropy.dataset.l2g_prediction import L2GPrediction @dataclass class LocusToGeneModel: """Wrapper for the Locus to Gene classifier.""" - features_list: list[str] - estimator: Any = None - pipeline: Pipeline = Pipeline(stages=[]) - model: PipelineModel | None = None - wandb_l2g_project_name: str = "otg_l2g" + model: Any = GradientBoostingClassifier(random_state=42) + hyperparameters: dict[str, Any] | None = None + training_data: L2GFeatureMatrix | None = None + label_encoder: dict[str, int] = field( + default_factory=lambda: { + "negative": 0, + "positive": 1, + } + ) def __post_init__(self: LocusToGeneModel) -> None: - """Post init that adds the model to the ML pipeline.""" - label_indexer = StringIndexer( - inputCol="goldStandardSet", outputCol="label", handleInvalid="keep" - ) - vector_assembler = LocusToGeneModel.features_vector_assembler( - self.features_list - ) - - self.pipeline = Pipeline( - stages=[ - label_indexer, - vector_assembler, - ] - ) + """Post-initialisation to fit the estimator with the provided params.""" + if self.hyperparameters: + self.model.set_params(**self.hyperparameters_dict) - def save(self: LocusToGeneModel, path: str) -> None: - """Saves fitted pipeline model to disk. + @classmethod + def load_from_disk( + cls: Type[LocusToGeneModel], path: str | Path + ) -> LocusToGeneModel: + """Load a fitted model from disk. Args: - path (str): Path to save the model to + path (str | Path): Path to the model + + Returns: + LocusToGeneModel: L2G model loaded from disk Raises: ValueError: If the model has not been fitted yet """ - if self.model is None: + loaded_model = sio.load(path, trusted=sio.get_untrusted_types(file=path)) + if not loaded_model._is_fitted(): raise ValueError("Model has not been fitted yet.") - self.model.write().overwrite().save(path) + return cls(model=loaded_model) - @property - def classifier(self: LocusToGeneModel) -> Any: - """Return the model. - - Returns: - Any: An estimator object from Spark ML - """ - return self.estimator - - @staticmethod - def features_vector_assembler(features_cols: list[str]) -> VectorAssembler: - """Spark transformer to assemble the feature columns into a vector. + @classmethod + def load_from_hub( + cls: Type[LocusToGeneModel], + model_id: str, + hf_token: str | None = None, + model_name: str = "classifier.skops", + ) -> LocusToGeneModel: + """Load a model from the Hugging Face Hub. This will download the model from the hub and load it from disk. Args: - features_cols (list[str]): List of feature columns to assemble + model_id (str): Model ID on the Hugging Face Hub + hf_token (str | None): Hugging Face Hub token to download the model (only required if private) + model_name (str): Name of the persisted model to load. Defaults to "classifier.skops". Returns: - VectorAssembler: Spark transformer to assemble the feature columns into a vector - - Examples: - >>> from pyspark.ml.feature import VectorAssembler - >>> df = spark.createDataFrame([(5.2, 3.5)], schema="feature_1 FLOAT, feature_2 FLOAT") - >>> assembler = LocusToGeneModel.features_vector_assembler(["feature_1", "feature_2"]) - >>> assembler.transform(df).show() - +---------+---------+--------------------+ - |feature_1|feature_2| features| - +---------+---------+--------------------+ - | 5.2| 3.5|[5.19999980926513...| - +---------+---------+--------------------+ - + LocusToGeneModel: L2G model loaded from the Hugging Face Hub """ - return ( - VectorAssembler(handleInvalid="error") - .setInputCols(features_cols) - .setOutputCol("features") - ) + local_path = Path(model_id) + hub_utils.download(repo_id=model_id, dst=local_path, token=hf_token) + return cls.load_from_disk(Path(local_path) / model_name) - def log_to_wandb( - self: LocusToGeneModel, - results: DataFrame, - training_data: L2GFeatureMatrix, - evaluators: list[ - BinaryClassificationEvaluator | MulticlassClassificationEvaluator - ], - wandb_run: Run, - ) -> None: - """Log evaluation results and feature importance to W&B. + @property + def hyperparameters_dict(self) -> dict[str, Any]: + """Return hyperparameters as a dictionary. - Args: - results (DataFrame): Dataframe containing the predictions - training_data (L2GFeatureMatrix): Training data used for the model. If provided, the table and the number of positive and negative labels will be logged to W&B - evaluators (list[BinaryClassificationEvaluator | MulticlassClassificationEvaluator]): List of Spark ML evaluators to use for evaluation - wandb_run (Run): W&B run to log the results to + Returns: + dict[str, Any]: Hyperparameters + + Raises: + ValueError: If hyperparameters have not been set """ - ## Track evaluation metrics - for evaluator in evaluators: - wandb_evaluator = WandbEvaluator( - spark_ml_evaluator=evaluator, wandb_run=wandb_run - ) - wandb_evaluator.evaluate(results) - ## Track feature importance - wandb_run.log({"importances": self.get_feature_importance()}) - ## Track training set - training_table = Table(dataframe=training_data.df.toPandas()) - wandb_run.log({"trainingSet": training_table}) - # Count number of positive and negative labels - gs_counts_dict = { - "goldStandard" + row["goldStandardSet"].capitalize(): row["count"] - for row in training_data.df.groupBy("goldStandardSet").count().collect() - } - wandb_run.log(gs_counts_dict) - # Missingness rates - wandb_run.log( - {"missingnessRates": training_data.calculate_feature_missingness_rate()} - ) + if not self.hyperparameters: + raise ValueError("Hyperparameters have not been set.") + elif isinstance(self.hyperparameters, dict): + return self.hyperparameters + return self.hyperparameters.default_factory() - @classmethod - def load_from_disk( - cls: Type[LocusToGeneModel], path: str, features_list: list[str] - ) -> LocusToGeneModel: - """Load a fitted pipeline model from disk. + def predict( + self: LocusToGeneModel, + feature_matrix: L2GFeatureMatrix, + session: Session, + ) -> L2GPrediction: + """Apply the model to a given feature matrix dataframe. The feature matrix needs to be preprocessed first. Args: - path (str): Path to the model - features_list (list[str]): List of features used for the model + feature_matrix (L2GFeatureMatrix): Feature matrix to apply the model to. + session (Session): Session object to convert data to Spark Returns: - LocusToGeneModel: L2G model loaded from disk + L2GPrediction: Dataset containing credible sets and their L2G scores """ - return cls(model=PipelineModel.load(path), features_list=features_list) + from gentropy.dataset.l2g_prediction import L2GPrediction + + pd_dataframe.iteritems = pd_dataframe.items + + feature_matrix_pdf = feature_matrix._df.toPandas() + # L2G score is the probability the classifier assigns to the positive class (the second element in the probability array) + feature_matrix_pdf["score"] = self.model.predict_proba( + # We drop the fixed columns to only pass the feature values to the classifier + feature_matrix_pdf.drop(feature_matrix.fixed_cols, axis=1) + .apply(pd_to_numeric) + .values + )[:, 1] + output_cols = [field.name for field in L2GPrediction.get_schema().fields] + return L2GPrediction( + _df=session.spark.createDataFrame(feature_matrix_pdf.filter(output_cols)), + _schema=L2GPrediction.get_schema(), + ) - @classifier.setter # type: ignore - def classifier(self: LocusToGeneModel, new_estimator: Any) -> None: - """Set the model. + def save(self: LocusToGeneModel, path: str) -> None: + """Saves fitted model to disk using the skops persistence format. Args: - new_estimator (Any): An estimator object from Spark ML - """ - self.estimator = new_estimator - - def get_param_grid(self: LocusToGeneModel) -> list[Any]: - """Return the parameter grid for the model. + path (str): Path to save the persisted model. Should end with .skops - Returns: - list[Any]: List of parameter maps to use for cross validation + Raises: + ValueError: If the model has not been fitted yet or if the path does not end with .skops """ - return ( - ParamGridBuilder() - .addGrid(self.estimator.max_depth, [3, 5, 7]) - .addGrid(self.estimator.learning_rate, [0.01, 0.1, 1.0]) - .build() - ) + if self.model is None: + raise ValueError("Model has not been fitted yet.") + if not path.endswith(".skops"): + raise ValueError("Path should end with .skops") + if path.startswith("gs://"): + local_path = path.split("/")[-1] + sio.dump(self.model, local_path) + copy_to_gcs(local_path, path) + else: + sio.dump(self.model, path) - def add_pipeline_stage( - self: LocusToGeneModel, transformer: Transformer - ) -> LocusToGeneModel: - """Adds a stage to the L2G pipeline. + @staticmethod + def load_feature_matrix_from_wandb(wandb_run_name: str) -> pd.DataFrame: + """Loads dataset of feature matrix used during a wandb run. Args: - transformer (Transformer): Spark transformer to add to the pipeline + wandb_run_name (str): Name of the wandb run to load the feature matrix from Returns: - LocusToGeneModel: L2G model with the new transformer - - Examples: - >>> from pyspark.ml.regression import LinearRegression - >>> estimator = LinearRegression() - >>> test_model = LocusToGeneModel(features_list=["a", "b"]) - >>> print(len(test_model.pipeline.getStages())) - 2 - >>> print(len(test_model.add_pipeline_stage(estimator).pipeline.getStages())) - 3 + pd.DataFrame: Feature matrix used during the wandb run """ - pipeline_stages = self.pipeline.getStages() - new_stages = pipeline_stages + [transformer] - self.pipeline = Pipeline(stages=new_stages) - return self + with open(wandb_run_name) as f: + raw_data = json.load(f) - def evaluate( + data = raw_data["data"] + columns = raw_data["columns"] + return pd.DataFrame(data, columns=columns) + + def _create_hugging_face_model_card( self: LocusToGeneModel, - results: DataFrame, - hyperparameters: dict[str, Any], - wandb_run_name: str | None, - training_data: L2GFeatureMatrix | None = None, + local_repo: str, ) -> None: - """Perform evaluation of the model predictions for the test set and track the results with W&B. + """Create a model card to document the model in the hub. The model card is saved in the local repo before pushing it to the hub. Args: - results (DataFrame): Dataframe containing the predictions - hyperparameters (dict[str, Any]): Hyperparameters used for the model - wandb_run_name (str | None): Descriptive name for the run to be tracked with W&B - training_data (L2GFeatureMatrix | None): Training data used for the model. If provided, the ratio of positive to negative labels will be logged to W&B + local_repo (str): Path to the folder where the README file will be saved to be pushed to the Hugging Face Hub """ - binary_evaluator = BinaryClassificationEvaluator( - rawPredictionCol="rawPrediction", labelCol="label" - ) - multi_evaluator = MulticlassClassificationEvaluator( - labelCol="label", predictionCol="prediction" - ) - - if wandb_run_name and training_data: - run = wandb_init( - project=self.wandb_l2g_project_name, - config=hyperparameters, - name=wandb_run_name, - ) - if isinstance(run, Run): - self.log_to_wandb( - results, training_data, [binary_evaluator, multi_evaluator], run - ) - run.finish() + from skops import card - @property - def feature_name_map(self: LocusToGeneModel) -> dict[str, str]: - """Return a dictionary mapping encoded feature names to the original names. + # Define card metadata + description = """The locus-to-gene (L2G) model derives features to prioritise likely causal genes at each GWAS locus based on genetic and functional genomics features. The main categories of predictive features are: - Returns: - dict[str, str]: Feature name map of the model + - Distance: (from credible set variants to gene) + - Molecular QTL Colocalization + - Chromatin Interaction: (e.g., promoter-capture Hi-C) + - Variant Pathogenicity: (from VEP) - Raises: - ValueError: If the model has not been fitted yet + More information at: https://opentargets.github.io/gentropy/python_api/methods/l2g/_l2g/ """ - if not self.model: - raise ValueError("Model not fitted yet. `fit()` has to be called first.") - elif isinstance(self.model.stages[1], VectorAssembler): - feature_names = self.model.stages[1].getInputCols() - return {f"f{i}": feature_name for i, feature_name in enumerate(feature_names)} - - def get_feature_importance(self: LocusToGeneModel) -> dict[str, float]: - """Return dictionary with relative importances of every feature in the model. Feature names are encoded and have to be mapped back to their original names. + how_to = """To use the model, you can load it using the `LocusToGeneModel.load_from_hub` method. This will return a `LocusToGeneModel` object that can be used to make predictions on a feature matrix. + The model can then be used to make predictions using the `predict` method. - Returns: - dict[str, float]: Dictionary mapping feature names to their importance - - Raises: - ValueError: If the model has not been fitted yet or is not an XGBoost model + More information can be found at: https://opentargets.github.io/gentropy/python_api/methods/l2g/model/ """ - if not self.model or not isinstance( - self.model.stages[-1], SparkXGBClassifierModel - ): - raise ValueError( - f"Model type {type(self.model)} not supported for feature importance." - ) - importance_map = self.model.stages[-1].get_feature_importances() - return {self.feature_name_map[k]: v for k, v in importance_map.items()} - - def fit( - self: LocusToGeneModel, - feature_matrix: L2GFeatureMatrix, - ) -> LocusToGeneModel: - """Fit the pipeline to the feature matrix dataframe. - - Args: - feature_matrix (L2GFeatureMatrix): Feature matrix dataframe to fit the model to - - Returns: - LocusToGeneModel: Fitted model - """ - self.model = self.pipeline.fit(feature_matrix.df) - return self + model_card = card.Card( + self.model, + metadata=card.metadata_from_config(Path(local_repo)), + ) + model_card.add( + **{ + "Model description": description, + "Model description/Training Procedure": "Gradient Boosting Classifier", + "How to Get Started with the Model": how_to, + "Model Card Authors": "Open Targets", + "License": "MIT", + "Citation": "https://doi.org/10.1038/s41588-021-00945-5", + } + ) + model_card.delete("Model description/Training Procedure/Model Plot") + model_card.delete("Model description/Evaluation Results") + model_card.delete("Model Card Authors") + model_card.delete("Model Card Contact") + model_card.save(Path(local_repo) / "README.md") - def predict( + def export_to_hugging_face_hub( self: LocusToGeneModel, - feature_matrix: L2GFeatureMatrix, - ) -> DataFrame: - """Apply the model to a given feature matrix dataframe. The feature matrix needs to be preprocessed first. + model_path: str, + hf_hub_token: str, + data: pd_dataframe, + commit_message: str, + repo_id: str = "opentargets/locus_to_gene", + local_repo: str = "locus_to_gene", + ) -> None: + """Share the model on Hugging Face Hub. Args: - feature_matrix (L2GFeatureMatrix): Feature matrix dataframe to apply the model to - - Returns: - DataFrame: Dataframe with predictions + model_path (str): The path to the L2G model file. + hf_hub_token (str): Hugging Face Hub token + data (pd_dataframe): Data used to train the model. This is used to have an example input for the model and to store the column order. + commit_message (str): Commit message for the push + repo_id (str): The Hugging Face Hub repo id where the model will be stored. + local_repo (str): Path to the folder where the contents of the model repo + the documentation are located. This is used to push the model to the Hugging Face Hub. Raises: - ValueError: If the model has not been fitted yet + RuntimeError: If the push to the Hugging Face Hub fails """ - if not self.model: - raise ValueError("Model not fitted yet. `fit()` has to be called first.") - return self.model.transform(feature_matrix.df) + from sklearn import __version__ as sklearn_version + + try: + hub_utils.init( + model=model_path, + requirements=[f"scikit-learn={sklearn_version}"], + dst=local_repo, + task="tabular-classification", + data=data, + ) + self._create_hugging_face_model_card(local_repo) + hub_utils.push( + repo_id=repo_id, + source=local_repo, + token=hf_hub_token, + commit_message=commit_message, + create_remote=True, + ) + except Exception as e: + # remove the local repo if the push fails + if Path(local_repo).exists(): + for p in Path(local_repo).glob("*"): + p.unlink() + Path(local_repo).rmdir() + raise RuntimeError from e diff --git a/src/gentropy/method/l2g/trainer.py b/src/gentropy/method/l2g/trainer.py index 8d2b3d7aa..fe56b3f42 100644 --- a/src/gentropy/method/l2g/trainer.py +++ b/src/gentropy/method/l2g/trainer.py @@ -2,111 +2,293 @@ from __future__ import annotations +import os from dataclasses import dataclass -from typing import Any, Optional +from functools import partial +from typing import TYPE_CHECKING, Any -from pyspark.ml.evaluation import MulticlassClassificationEvaluator -from pyspark.ml.tuning import CrossValidator +import matplotlib.pyplot as plt +import pandas as pd +import shap +from sklearn.metrics import ( + accuracy_score, + f1_score, + precision_score, + recall_score, + roc_auc_score, +) +from sklearn.model_selection import train_test_split +from wandb.data_types import Image, Table +from wandb.errors.term import termlog as wandb_termlog +from wandb.sdk.wandb_init import init as wandb_init +from wandb.sdk.wandb_sweep import sweep as wandb_sweep +from wandb.sklearn import plot_classifier +from wandb.wandb_agent import agent as wandb_agent from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.method.l2g.model import LocusToGeneModel +if TYPE_CHECKING: + from matplotlib.axes._axes import Axes + from shap._explanation import Explanation + from wandb.sdk.wandb_run import Run + @dataclass class LocusToGeneTrainer: """Modelling of what is the most likely causal gene associated with a given locus.""" - _model: LocusToGeneModel - train_set: L2GFeatureMatrix + model: LocusToGeneModel + feature_matrix: L2GFeatureMatrix - @classmethod - def train( - cls: type[LocusToGeneTrainer], - data: L2GFeatureMatrix, - l2g_model: LocusToGeneModel, - features_list: list[str], - evaluate: bool, - wandb_run_name: str | None = None, - model_path: str | None = None, - **hyperparams: dict[str, Any], - ) -> LocusToGeneModel: - """Train the Locus to Gene model. + # Initialise vars + features_list: list[str] | None = None + label_col: str = "goldStandardSet" + x_train: pd.DataFrame | None = None + y_train: pd.Series | None = None + x_test: pd.DataFrame | None = None + y_test: pd.Series | None = None + run: Run | None = None + wandb_l2g_project_name: str = "gentropy-locus-to-gene" - Args: - data (L2GFeatureMatrix): Feature matrix containing the data - l2g_model (LocusToGeneModel): Model to fit to the data on - features_list (list[str]): List of features to use for the model - evaluate (bool): Whether to evaluate the model on a test set - wandb_run_name (str | None): Descriptive name for the run to be tracked with W&B - model_path (str | None): Path to save the model to - **hyperparams (dict[str, Any]): Hyperparameters to use for the model + def __post_init__(self) -> None: + """Set default features_list to feature_matrix's features_list if not provided.""" + self.features_list = ( + self.feature_matrix.features_list + if self.features_list is None + else self.features_list + ) + + def fit( + self: LocusToGeneTrainer, + ) -> LocusToGeneModel: + """Fit the pipeline to the feature matrix dataframe. Returns: - LocusToGeneModel: Trained model + LocusToGeneModel: Fitted model + + Raises: + ValueError: Train data not set, nothing to fit. """ - train, test = data.select_features(features_list).train_test_split(fraction=0.8) + if self.x_train is not None and self.y_train is not None: + assert ( + not self.x_train.empty and not self.y_train.empty + ), "Train data not set, nothing to fit." + fitted_model = self.model.model.fit(X=self.x_train.values, y=self.y_train) + self.model = LocusToGeneModel( + model=fitted_model, + hyperparameters=fitted_model.get_params(), + training_data=self.feature_matrix, + ) + return self.model + raise ValueError("Train data not set, nothing to fit.") - model = l2g_model.add_pipeline_stage(l2g_model.estimator).fit(train) + def _get_shap_explanation( + self: LocusToGeneTrainer, + model: LocusToGeneModel, + ) -> Explanation: + """Get the SHAP values for the given model and data. We pass the full X matrix (without the labels) to interpret their shap values. - if evaluate: - l2g_model.evaluate( - results=model.predict(test), - hyperparameters=hyperparams, - wandb_run_name=wandb_run_name, - training_data=train, + Args: + model (LocusToGeneModel): Model to explain. + + Returns: + Explanation: SHAP values for the given model and data. + + Raises: + ValueError: Train data not set, cannot get SHAP values. + """ + if self.x_train is not None and self.x_test is not None: + training_data = pd.concat([self.x_train, self.x_test], ignore_index=True) + explainer = shap.TreeExplainer( + model.model, + data=training_data, + feature_perturbation="interventional", ) - if model_path: - l2g_model.save(model_path) - return l2g_model - - @classmethod - def cross_validate( - cls: type[LocusToGeneTrainer], - l2g_model: LocusToGeneModel, - data: L2GFeatureMatrix, - num_folds: int, - param_grid: Optional[list] = None, # type: ignore - ) -> LocusToGeneModel: - """Perform k-fold cross validation on the model. + return explainer(training_data) + raise ValueError("Train data not set.") - By providing a model with a parameter grid, this method will perform k-fold cross validation on the model for each - combination of parameters and return the best model. + def log_plot_image_to_wandb( + self: LocusToGeneTrainer, title: str, plot: Axes + ) -> None: + """Accepts a plot object, and saves the fig to PNG to then log it in W&B. Args: - l2g_model (LocusToGeneModel): Model to fit to the data on - data (L2GFeatureMatrix): Data to perform cross validation on - num_folds (int): Number of folds to use for cross validation - param_grid (Optional[list]): List of parameter maps to use for cross validation + title (str): Title of the plot. + plot (Axes): Shap plot to log. - Returns: - LocusToGeneModel: Trained model fitted with the best hyperparameters + Raises: + ValueError: Run not set, cannot log to W&B. + """ + if self.run is None: + raise ValueError("Run not set, cannot log to W&B.") + if not plot: + # Scatter plot returns none, so we need to handle this case + plt.savefig("tmp.png", bbox_inches="tight") + else: + plot.figure.savefig("tmp.png", bbox_inches="tight") + self.run.log({title: Image("tmp.png")}) + plt.close() + os.remove("tmp.png") + + def log_to_wandb( + self: LocusToGeneTrainer, + wandb_run_name: str, + ) -> None: + """Log evaluation results and feature importance to W&B to compare between different L2G runs. + + Dashboard is available at https://wandb.ai/open-targets/gentropy-locus-to-gene?nw=nwuseropentargets + Credentials to access W&B are available at the OT central login sheet. + + Args: + wandb_run_name (str): Name of the W&B run Raises: - ValueError: Parameter grid is empty. Cannot perform cross-validation. - ValueError: Unable to retrieve the best model. + ValueError: If dependencies are not available. """ - evaluator = MulticlassClassificationEvaluator() - params_grid = param_grid or l2g_model.get_param_grid() - if not param_grid: - raise ValueError( - "Parameter grid is empty. Cannot perform cross-validation." + if ( + self.x_train is not None + and self.x_test is not None + and self.y_train is not None + and self.y_test is not None + and self.features_list is not None + ): + assert ( + not self.x_train.empty and not self.y_train.empty + ), "Train data not set, nothing to evaluate." + fitted_classifier = self.model.model + y_predicted = fitted_classifier.predict(self.x_test.values) + y_probas = fitted_classifier.predict_proba(self.x_test.values) + self.run = wandb_init( + project=self.wandb_l2g_project_name, + name=wandb_run_name, + config=fitted_classifier.get_params(), + ) + # Track classification plots + plot_classifier( + self.model.model, + self.x_train.values, + self.x_test.values, + self.y_train, + self.y_test, + y_predicted, + y_probas, + labels=list(self.model.label_encoder.values()), + model_name="L2G-classifier", + feature_names=self.features_list, + is_binary=True, ) - cv = CrossValidator( - numFolds=num_folds, - estimator=l2g_model.estimator, - estimatorParamMaps=params_grid, - evaluator=evaluator, - parallelism=2, - collectSubModels=False, - seed=42, + # Track evaluation metrics + self.run.log( + { + "areaUnderROC": roc_auc_score( + self.y_test, y_probas[:, 1], average="weighted" + ) + } + ) + self.run.log({"accuracy": accuracy_score(self.y_test, y_predicted)}) + self.run.log( + { + "weightedPrecision": precision_score( + self.y_test, y_predicted, average="weighted" + ) + } + ) + self.run.log( + { + "weightedRecall": recall_score( + self.y_test, y_predicted, average="weighted" + ) + } + ) + self.run.log({"f1": f1_score(self.y_test, y_predicted, average="weighted")}) + # Track gold standards and their features + self.run.log( + {"featureMatrix": Table(dataframe=self.feature_matrix._df.toPandas())} + ) + # Log feature missingness + self.run.log( + { + "missingnessRates": self.feature_matrix.calculate_feature_missingness_rate() + } + ) + # Plot marginal contribution of each feature + explanation = self._get_shap_explanation(self.model) + self.log_plot_image_to_wandb( + "Feature Contribution", + shap.plots.bar( + explanation, max_display=len(self.x_train.columns), show=False + ), + ) + self.log_plot_image_to_wandb( + "Beeswarm Plot", + shap.plots.beeswarm( + explanation, max_display=len(self.x_train.columns), show=False + ), + ) + # Plot correlation between feature values and their importance + for feature in self.features_list: + self.log_plot_image_to_wandb( + f"Effect of {feature} on the predictions", + shap.plots.scatter( + explanation[:, feature], + show=False, + ), + ) + wandb_termlog("Logged Shapley contributions.") + self.run.finish() + else: + raise ValueError("Something went wrong, couldn't log to W&B.") + + def train( + self: LocusToGeneTrainer, + wandb_run_name: str, + ) -> LocusToGeneModel: + """Train the Locus to Gene model. + + Args: + wandb_run_name (str): Name of the W&B run. Unless this is provided, the model will not be logged to W&B. + + Returns: + LocusToGeneModel: Fitted model + """ + data_df = self.feature_matrix._df.drop("geneId", "studyLocusId").toPandas() + + # Encode labels in `goldStandardSet` to a numeric value + data_df[self.label_col] = data_df[self.label_col].map(self.model.label_encoder) + + # Ensure all columns are numeric and split + data_df = data_df.apply(pd.to_numeric) + X = data_df[self.features_list].copy() + y = data_df[self.label_col].copy() + self.x_train, self.x_test, self.y_train, self.y_test = train_test_split( + X, y, test_size=0.2, random_state=42 ) - l2g_model.add_pipeline_stage(cv) # type: ignore[assignment, unused-ignore] + # Train + model = self.fit() - # Integrate the best model from the last stage of the pipeline - if (full_pipeline_model := l2g_model.fit(data).model) is None or not hasattr( - full_pipeline_model, "stages" - ): - raise ValueError("Unable to retrieve the best model.") - l2g_model.model = full_pipeline_model.stages[-1].bestModel # type: ignore[assignment, unused-ignore] - return l2g_model + # Evaluate + self.log_to_wandb( + wandb_run_name=wandb_run_name, + ) + + return model + + def hyperparameter_tuning( + self: LocusToGeneTrainer, wandb_run_name: str, parameter_grid: dict[str, Any] + ) -> None: + """Perform hyperparameter tuning on the model with W&B Sweeps. Metrics for every combination of hyperparameters will be logged to W&B for comparison. + + Args: + wandb_run_name (str): Name of the W&B run + parameter_grid (dict[str, Any]): Dictionary containing the hyperparameters to sweep over. The keys are the hyperparameter names, and the values are dictionaries containing the values to sweep over. + """ + sweep_config = { + "method": "grid", + "metric": {"name": "roc", "goal": "maximize"}, + "parameters": parameter_grid, + } + sweep_id = wandb_sweep(sweep_config, project=self.wandb_l2g_project_name) + + wandb_agent(sweep_id, partial(self.train, wandb_run_name=wandb_run_name)) diff --git a/src/gentropy/method/ld.py b/src/gentropy/method/ld.py index f0eab7c4b..64d47451d 100644 --- a/src/gentropy/method/ld.py +++ b/src/gentropy/method/ld.py @@ -1,10 +1,12 @@ """Performing linkage disequilibrium (LD) operations.""" + from __future__ import annotations from typing import TYPE_CHECKING from pyspark.sql import functions as f +from gentropy.common.spark_helpers import order_array_of_structs_by_field from gentropy.dataset.study_locus import StudyLocus, StudyLocusQualityCheck if TYPE_CHECKING: @@ -18,60 +20,64 @@ class LDAnnotator: """Class to annotate linkage disequilibrium (LD) operations from GnomAD.""" @staticmethod - def _calculate_weighted_r_overall(ld_set: Column) -> Column: - """Aggregation of weighted R information using ancestry proportions. + def _get_major_population(ordered_populations: Column) -> Column: + """Get major population based on an ldPopulationStructure array ordered by relativeSampleSize. + + If there is a tie for the major population, nfe is selected if it is one of the major populations. + The first population in the array is selected if there is no tie for the major population, or there is a tie but nfe is not one of the major populations. Args: - ld_set (Column): LD set + ordered_populations (Column): ldPopulationStructure array ordered by relativeSampleSize Returns: - Column: LD set with added 'r2Overall' field + Column: major population """ - return f.transform( - ld_set, - lambda x: f.struct( - x["tagVariantId"].alias("tagVariantId"), - # r2Overall is the accumulated sum of each r2 relative to the population size - f.aggregate( - x["rValues"], - f.lit(0.0), - lambda acc, y: acc - + f.coalesce( - f.pow(y["r"], 2) * y["relativeSampleSize"], f.lit(0.0) - ), # we use coalesce to avoid problems when r/relativeSampleSize is null - ).alias("r2Overall"), - ), + major_population_size = ordered_populations["relativeSampleSize"][0] + major_populations = f.filter( + ordered_populations, + lambda x: x["relativeSampleSize"] == major_population_size + ) + # Check if nfe (Non-Finnish European) is one of the major populations + has_nfe = f.filter( + major_populations, + lambda x: x["ldPopulation"] == "nfe" + ) + return f.when( + (f.size(major_populations) > 1) & (f.size(has_nfe) == 1), + f.lit("nfe") + ).otherwise( + ordered_populations["ldPopulation"][0] ) @staticmethod - def _add_population_size(ld_set: Column, study_populations: Column) -> Column: - """Add population size to each rValues entry in the ldSet. + def _calculate_r2_major(ld_set: Column, major_population: Column) -> Column: + """Calculate R2 using R of the major population in the study. Args: ld_set (Column): LD set - study_populations (Column): Study populations + major_population (Column): Major population of the study Returns: - Column: LD set with added 'relativeSampleSize' field + Column: LD set with added 'r2Overall' field """ - # Create a population to relativeSampleSize map from the struct - populations_map = f.map_from_arrays( - study_populations["ldPopulation"], - study_populations["relativeSampleSize"], - ) - return f.transform( + ld_set_with_major_pop = f.transform( ld_set, lambda x: f.struct( x["tagVariantId"].alias("tagVariantId"), - f.transform( + f.filter( x["rValues"], - lambda y: f.struct( - y["population"].alias("population"), - y["r"].alias("r"), - populations_map[y["population"]].alias("relativeSampleSize"), - ), - ).alias("rValues"), - ), + lambda y: y["population"] == major_population + ).alias("rValues") + ) + ) + return f.transform( + ld_set_with_major_pop, + lambda x: f.struct( + x["tagVariantId"].alias("tagVariantId"), + f.coalesce( + f.pow(x["rValues"]["r"][0], 2), f.lit(0.0) + ).alias("r2Overall") + ) ) @staticmethod @@ -120,21 +126,26 @@ def ld_annotate( associations: StudyLocus, studies: StudyIndex, ld_index: LDIndex, + r2_threshold: float = 0.5, ) -> StudyLocus: """Annotate linkage disequilibrium (LD) information to a set of studyLocus. This function: - 1. Annotates study locus with population structure information from the study index + 1. Annotates study locus with population structure information ordered by relativeSampleSize from the study index 2. Joins the LD index to the StudyLocus - 3. Adds the population size of the study to each rValues entry in the ldSet - 4. Calculates the overall R weighted by the ancestry proportions in every given study. + 3. Gets the major population from the population structure + 4. Calculates R2 by using the R of the major ancestry 5. Flags associations with variants that are not found in the LD reference 6. Rescues lead variant when no LD information is available but lead variant is available + !!! note + Because the LD index has a pre-set threshold of R2 = 0.5, this is the minimum threshold for the LD information to be included in the ldSet. + Args: associations (StudyLocus): Dataset to be LD annotated studies (StudyIndex): Dataset with study information ld_index (LDIndex): Dataset with LD information for every variant present in LD matrix + r2_threshold (float): R2 threshold to filter the LD set on. Default is 0.5. Returns: StudyLocus: including additional column with LD information. @@ -144,9 +155,14 @@ def ld_annotate( associations.df # Drop ldSet column if already available .select(*[col for col in associations.df.columns if col != "ldSet"]) - # Annotate study locus with population structure from study index + # Annotate study locus with population structure ordered by relativeSampleSize from study index .join( - studies.df.select("studyId", "ldPopulationStructure"), + studies.df.select( + "studyId", + order_array_of_structs_by_field( + "ldPopulationStructure", "relativeSampleSize" + ).alias("ldPopulationStructure") + ), on="studyId", how="left", ) @@ -156,25 +172,33 @@ def ld_annotate( on=["variantId", "chromosome"], how="left", ) - # Add population size to each rValues entry in the ldSet if population structure available: + # Get major population from population structure if population structure available .withColumn( - "ldSet", + "majorPopulation", f.when( f.col("ldPopulationStructure").isNotNull(), - cls._add_population_size( - f.col("ldSet"), f.col("ldPopulationStructure") - ), - ), + cls._get_major_population( + f.col("ldPopulationStructure") + ) + ) ) - # Aggregate weighted R information using ancestry proportions + # Calculate R2 using R of the major population .withColumn( "ldSet", f.when( f.col("ldPopulationStructure").isNotNull(), - cls._calculate_weighted_r_overall(f.col("ldSet")), - ), + cls._calculate_r2_major( + f.col("ldSet"), f.col("majorPopulation") + ) + ) + ) + .drop("ldPopulationStructure", "majorPopulation") + # Filter the LD set by the R2 threshold and set to null if no LD information passes the threshold + .withColumn( + "ldSet", + StudyLocus.filter_ld_set(f.col("ldSet"), r2_threshold), ) - .drop("ldPopulationStructure") + .withColumn("ldSet", f.when(f.size("ldSet") > 0, f.col("ldSet"))) # QC: Flag associations with variants that are not found in the LD reference .withColumn( "qualityControls", diff --git a/src/gentropy/method/ld_matrix_interface.py b/src/gentropy/method/ld_matrix_interface.py new file mode 100644 index 000000000..d0051101b --- /dev/null +++ b/src/gentropy/method/ld_matrix_interface.py @@ -0,0 +1,101 @@ +"""Step to import filtered version of a LD matrix (block matrix).""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +import pyspark.sql.functions as f + +from gentropy.common.session import Session +from gentropy.datasource.gnomad.ld import GnomADLDMatrix +from gentropy.datasource.pan_ukbb_ld.ld import PanUKBBLDMatrix + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, Row + + +class LDMatrixInterface: + """Toolset to interact with LD matrices.""" + + ancestry_map = { + "nfe": "EUR", + "csa": "CSA", + "afr": "AFR", + } + + @staticmethod + def get_locus_index_boundaries( + session: Session, + study_locus_row: Row, + ancestry: str = "nfe", + ) -> DataFrame: + """Extract hail matrix index from StudyLocus rows. + + Args: + session (Session): Session object + study_locus_row (Row): Study-locus row + ancestry (str): Major population to extract from gnomad matrix, default is "nfe" + + Returns: + DataFrame: Returns the index of the gnomad matrix for the locus + + """ + if ancestry in ("nfe", "csa", "afr"): + joined_index = PanUKBBLDMatrix().get_locus_index_boundaries( + session=session, + study_locus_row=study_locus_row, + ancestry=LDMatrixInterface.ancestry_map.get(ancestry, ancestry), + ) + else: + joined_index = ( + GnomADLDMatrix() + .get_locus_index_boundaries( + study_locus_row=study_locus_row, + major_population=ancestry, + ) + .withColumn( + "variantId", + f.concat( + f.regexp_replace(f.col("`locus.contig`"), "chr", ""), + f.lit("_"), + f.col("`locus.position`"), + f.lit("_"), + f.col("alleles").getItem(0), + f.lit("_"), + f.col("alleles").getItem(1), + ).cast("string"), + ) + ) + + return joined_index + + @staticmethod + def get_numpy_matrix( + locus_index: DataFrame, + ancestry: str = "nfe", + ) -> np.ndarray: + """Extract the LD block matrix for a locus. + + Args: + locus_index (DataFrame): hail matrix variant index table + ancestry (str): major ancestry label eg. `nfe` + + Returns: + np.ndarray: LD block matrix for the locus + """ + if ancestry in ( + "afr", + "csa", + "nfe", + ): + block_matrix = PanUKBBLDMatrix().get_numpy_matrix( + locus_index=locus_index, + ancestry=LDMatrixInterface.ancestry_map.get(ancestry, ancestry), + ) + else: + block_matrix = GnomADLDMatrix.get_numpy_matrix( + locus_index=locus_index, gnomad_ancestry=ancestry + ) + + return block_matrix diff --git a/src/gentropy/method/locus_breaker_clumping.py b/src/gentropy/method/locus_breaker_clumping.py new file mode 100644 index 000000000..3ab1e605a --- /dev/null +++ b/src/gentropy/method/locus_breaker_clumping.py @@ -0,0 +1,167 @@ +"""Locus-breaker clumping method.""" + +from __future__ import annotations + +import sys + +import numpy as np +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark.sql.window import Window + +from gentropy.common.spark_helpers import calculate_neglog_pvalue +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.summary_statistics import SummaryStatistics + + +class LocusBreakerClumping: + """Locus-breaker clumping method.""" + + @staticmethod + def locus_breaker( + summary_statistics: SummaryStatistics, + baseline_pvalue_cutoff: float, + distance_cutoff: int, + pvalue_cutoff: float, + flanking_distance: int, + ) -> StudyLocus: + """Identify GWAS associated loci based on the provided p-value and distance cutoff. + + - The GWAS associated loci identified by this method have a varying width, and are separated by a distance greater than the provided distance cutoff. + - The distance is only calculted between single point associations that reach the baseline p-value cutoff. + - As the width of the selected genomic region dynamically depends on the loci, the resulting StudyLocus object will contain the locus start and end position. + - To ensure completeness, the locus is extended by a flanking distance in both ends. + + Args: + summary_statistics (SummaryStatistics): Input summary statistics dataset. + baseline_pvalue_cutoff (float): baseline significance we consider for the locus. + distance_cutoff (int): minimum distance that separates two loci. + pvalue_cutoff (float): the minimum significance the locus should have. + flanking_distance (int): the distance to extend the locus in both directions. + + Returns: + StudyLocus: clumped study loci with locus start and end positions + lead variant from the locus. + """ + # Extract columns from the summary statistics: + columns_sumstats_columns = summary_statistics.df.columns + # Convert pvalue_cutoff to neglog scale: + neglog_pv_cutoff = -np.log10(pvalue_cutoff) + + # First window to calculate the distance between consecutive positions: + w1 = Window.partitionBy("studyId", "chromosome").orderBy("position") + + # Second window to calculate the locus start and end: + w2 = ( + Window.partitionBy("studyId", "chromosome", "locusStart") + .orderBy("position") + .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing) + ) + + # Third window to rank the variants within the locus based on neglog p-value to find top loci: + w3 = Window.partitionBy( + "studyId", "chromosome", "locusStart", "locusEnd" + ).orderBy(f.col("negLogPValue").desc()) + + return StudyLocus( + _df=( + # Applying the baseline p-value cutoff: + summary_statistics.pvalue_filter(baseline_pvalue_cutoff) + # Calculating the neglog p-value for easier sorting: + .df.withColumn( + "negLogPValue", + calculate_neglog_pvalue( + f.col("pValueMantissa"), f.col("pValueExponent") + ), + ) + # Calculating the distance between consecutive positions, then identifying the locus start and end: + .withColumn("next_position", f.lag(f.col("position")).over(w1)) + .withColumn("distance", f.col("position") - f.col("next_position")) + .withColumn( + "locusStart", + f.when( + (f.col("distance") > distance_cutoff) + | f.col("distance").isNull(), + f.col("position"), + ), + ) + .withColumn( + "locusStart", + f.when( + f.last(f.col("locusStart") - flanking_distance, True).over( + w1.rowsBetween(-sys.maxsize, 0) + ) + > 0, + f.last(f.col("locusStart") - flanking_distance, True).over( + w1.rowsBetween(-sys.maxsize, 0) + ), + ).otherwise(f.lit(0)), + ) + .withColumn( + "locusEnd", f.max(f.col("position") + flanking_distance).over(w2) + ) + .withColumn("rank", f.rank().over(w3)) + .filter( + (f.col("rank") == 1) & (f.col("negLogPValue") > neglog_pv_cutoff) + ) + .select( + *columns_sumstats_columns, + # To make sure that the type of locusStart and locusEnd follows schema of StudyLocus: + f.col("locusStart").cast(t.IntegerType()).alias("locusStart"), + f.col("locusEnd").cast(t.IntegerType()).alias("locusEnd"), + f.lit(None) + .cast(t.ArrayType(t.StringType())) + .alias("qualityControls"), + StudyLocus.assign_study_locus_id(["studyId", "variantId"]), + ) + ), + _schema=StudyLocus.get_schema(), + ) + + @staticmethod + def process_locus_breaker_output( + lbc: StudyLocus, + wbc: StudyLocus, + large_loci_size: int, + ) -> StudyLocus: + """Process the locus breaker method result, and run window-based clumping on large loci. + + Args: + lbc (StudyLocus): StudyLocus object from locus-breaker clumping. + wbc (StudyLocus): StudyLocus object from window-based clumping. + large_loci_size (int): the size to define large loci which should be broken with wbc. + + Returns: + StudyLocus: clumped study loci with large loci broken by window-based clumping. + """ + large_loci_size = int(large_loci_size) + small_loci = lbc.filter( + (f.col("locusEnd") - f.col("locusStart")) <= large_loci_size + ) + large_loci = lbc.filter( + (f.col("locusEnd") - f.col("locusStart")) > large_loci_size + ) + large_loci_wbc = StudyLocus( + wbc.df.alias("wbc") + .join( + large_loci.df.alias("ll"), + (f.col("wbc.studyId") == f.col("ll.studyId")) + & (f.col("wbc.chromosome") == f.col("ll.chromosome")) + & ( + f.col("wbc.position").between( + f.col("ll.locusStart"), f.col("ll.locusEnd") + ) + ), + "semi", + ) + .withColumns( + { + "locusStart": f.col("position") - large_loci_size // 2, + "locusEnd": f.col("position") + large_loci_size // 2, + } + ), + StudyLocus.get_schema(), + ) + return StudyLocus( + large_loci_wbc.df.unionByName(small_loci.df), + StudyLocus.get_schema(), + ) diff --git a/src/gentropy/method/pics.py b/src/gentropy/method/pics.py index e5ed5f2c6..918850527 100644 --- a/src/gentropy/method/pics.py +++ b/src/gentropy/method/pics.py @@ -17,6 +17,18 @@ class PICS: """Probabilistic Identification of Causal SNPs (PICS), an algorithm estimating the probability that an individual variant is causal considering the haplotype structure and observed pattern of association at the genetic locus.""" + # The fields for the picsed locus + ldSet tagVariantId is renamed to variantId: + PICSED_LOCUS_SCHEMA = t.ArrayType( + t.StructType( + [ + t.StructField("variantId", t.StringType(), True), + t.StructField("r2Overall", t.DoubleType(), True), + t.StructField("posteriorProbability", t.DoubleType(), True), + t.StructField("standardError", t.DoubleType(), True), + ] + ) + ) + @staticmethod def _pics_relative_posterior_probability( neglog_p: float, pics_snp_mu: float, pics_snp_std: float @@ -148,6 +160,10 @@ def _finemap( # If PICS cannot be calculated, we drop the variant from the credible set continue + # Chaing chema: + if "tagVariantId" in tag_dict: + tag_dict["variantId"] = tag_dict.pop("tagVariantId") + pics_snp_mu = PICS._pics_mu(lead_neglog_p, tag_dict["r2Overall"]) pics_snp_std = PICS._pics_standard_deviation( lead_neglog_p, tag_dict["r2Overall"], k @@ -195,36 +211,24 @@ def finemap( Returns: StudyLocus: Study locus with PICS results """ - # Register UDF by defining the structure of the output locus array of structs - # it also renames tagVariantId to variantId - - picsed_ldset_schema = t.ArrayType( - t.StructType( - [ - t.StructField("tagVariantId", t.StringType(), True), - t.StructField("r2Overall", t.DoubleType(), True), - t.StructField("posteriorProbability", t.DoubleType(), True), - t.StructField("standardError", t.DoubleType(), True), - ] - ) - ) - picsed_study_locus_schema = t.ArrayType( - t.StructType( - [ - t.StructField("variantId", t.StringType(), True), - t.StructField("r2Overall", t.DoubleType(), True), - t.StructField("posteriorProbability", t.DoubleType(), True), - t.StructField("standardError", t.DoubleType(), True), - ] - ) - ) - _finemap_udf = f.udf( - lambda locus, neglog_p: PICS._finemap(locus, neglog_p, k), - picsed_ldset_schema, + # Finemapping method is an optional column: + finemapping_method_expression = ( + f.lit("pics") + if "finemappingMethod" not in associations.df.columns + else f.coalesce(f.col("finemappingMethod"), f.lit("pics")) ) + + # Flagging expression for loci that do not qualify for PICS: non_picsable_expr = ( f.size(f.filter(f.col("ldSet"), lambda x: x.r2Overall >= 0.5)) == 0 ) + + # Registering the UDF to be used in the pipeline: + finemap_udf = f.udf( + lambda ld_set, neglog_p: cls._finemap(ld_set, neglog_p, k), + cls.PICSED_LOCUS_SCHEMA, + ) + return StudyLocus( _df=( associations.df @@ -237,11 +241,31 @@ def finemap( "locus", f.when( f.col("ldSet").isNotNull(), - _finemap_udf(f.col("ldSet"), f.col("neglog_pvalue")).cast( - picsed_study_locus_schema + finemap_udf(f.col("ldSet"), f.col("neglog_pvalue")), + ), + ) + # Updating single point statistics in the locus object for the lead variant: + .withColumn( + "locus", + f.transform( + f.col("locus"), + lambda tag: f.when( + f.col("variantId") == tag["variantId"], + tag.withField("pValueMantissa", f.col("pValueMantissa")) + .withField("pValueExponent", f.col("pValueExponent")) + .withField("beta", f.col("beta")), + ).otherwise( + tag.withField( + "pValueMantissa", f.lit(None).cast(t.FloatType()) + ) + .withField( + "pValueExponent", f.lit(None).cast(t.IntegerType()) + ) + .withField("beta", f.lit(None).cast(t.DoubleType())) ), ), ) + # Flagging loci that do not qualify for PICS: .withColumn( "qualityControls", StudyLocus.update_quality_flag( @@ -252,7 +276,13 @@ def finemap( ) .withColumn( "finemappingMethod", - f.coalesce(f.col("finemappingMethod"), f.lit("pics")), + finemapping_method_expression, + ) + .withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id( + ["studyId", "variantId", "finemappingMethod"] + ), ) .drop("neglog_pvalue") ), diff --git a/src/gentropy/method/sumstat_imputation.py b/src/gentropy/method/sumstat_imputation.py new file mode 100644 index 000000000..b53295560 --- /dev/null +++ b/src/gentropy/method/sumstat_imputation.py @@ -0,0 +1,172 @@ +"""RAISS summary statstics imputation model.""" + +from __future__ import annotations + +from typing import Any + +import numpy as np +import scipy.linalg + + +class SummaryStatisticsImputation: + """Implementation of RAISS summary statstics imputation model.""" + + @staticmethod + def raiss_model( + z_scores_known: np.ndarray, + ld_matrix_known: np.ndarray, + ld_matrix_known_missing: np.ndarray, + lamb: float = 0.01, + rtol: float = 0.01, + ) -> dict[str, Any]: + """Compute the imputation of the z-score using the RAISS model. + + Args: + z_scores_known (np.ndarray): the vector of known Z scores + ld_matrix_known (np.ndarray) : the matrix of known LD correlations + ld_matrix_known_missing (np.ndarray): LD matrix of known SNPs with other unknown SNPs in large matrix (similar to `ld[unknowns, :][:,known]`) + lamb (float): size of the small value added to the diagonal of the covariance matrix before inversion. Defaults to 0.01. + rtol (float): threshold to filter eigenvectos by its eigenvalue. It makes an inversion biased but much more numerically robust. Default to 0.01. + + Returns: + dict[str, Any]: + - var (np.ndarray): variance of the imputed SNPs + - mu (np.ndarray): the estimation of the zscore of the imputed SNPs + - ld_score (np.ndarray): the linkage disequilibrium score of the imputed SNPs + - condition_number (np.ndarray): the condition number of the correlation matrix + - correct_inversion (np.ndarray): a boolean array indicating if the inversion was successful + - imputation_r2 (np.ndarray): the R2 of the imputation + """ + sig_t_inv = SummaryStatisticsImputation._invert_sig_t( + ld_matrix_known, lamb, rtol + ) + if sig_t_inv is None: + return { + "var": None, + "mu": None, + "ld_score": None, + "condition_number": None, + "correct_inversion": None, + "imputation_r2": None, + } + else: + condition_number = np.array( + [np.linalg.cond(ld_matrix_known)] * ld_matrix_known_missing.shape[0] + ) + correct_inversion = np.array( + [ + SummaryStatisticsImputation._check_inversion( + ld_matrix_known, sig_t_inv + ) + ] + * ld_matrix_known_missing.shape[0] + ) + + var, ld_score = SummaryStatisticsImputation._compute_var( + ld_matrix_known_missing, sig_t_inv, lamb + ) + + mu = SummaryStatisticsImputation._compute_mu( + ld_matrix_known_missing, sig_t_inv, z_scores_known + ) + var_norm = SummaryStatisticsImputation._var_in_boundaries(var, lamb) + + R2 = (1 + lamb) - var_norm + + mu = mu / np.sqrt(R2) + return { + "var": var, + "mu": mu, + "ld_score": ld_score, + "condition_number": condition_number, + "correct_inversion": correct_inversion, + "imputation_r2": 1 - var, + } + + @staticmethod + def _compute_mu( + sig_i_t: np.ndarray, sig_t_inv: np.ndarray, zt: np.ndarray + ) -> np.ndarray: + """Compute the estimation of z-score from neighborring snp. + + Args: + sig_i_t (np.ndarray) : correlation matrix with line corresponding to unknown Snp (snp to impute) and column to known SNPs + sig_t_inv (np.ndarray): inverse of the correlation matrix of known matrix + zt (np.ndarray): Zscores of known snp + Returns: + np.ndarray: a vector of length i containing the estimate of zscore + + """ + return np.dot(sig_i_t, np.dot(sig_t_inv, zt)) + + @staticmethod + def _compute_var( + sig_i_t: np.ndarray, sig_t_inv: np.ndarray, lamb: float + ) -> tuple[np.ndarray, np.ndarray]: + """Compute the expected variance of the imputed SNPs. + + Args: + sig_i_t (np.ndarray) : correlation matrix with line corresponding to unknown Snp (snp to impute) and column to known SNPs + sig_t_inv (np.ndarray): inverse of the correlation matrix of known matrix + lamb (float): regularization term added to matrix + + Returns: + tuple[np.ndarray, np.ndarray]: a tuple containing the variance and the ld score + """ + var = (1 + lamb) - np.einsum( + "ij,jk,ki->i", sig_i_t, sig_t_inv, sig_i_t.transpose() + ) + ld_score = (sig_i_t**2).sum(1) + + return var, ld_score + + @staticmethod + def _check_inversion(sig_t: np.ndarray, sig_t_inv: np.ndarray) -> bool: + """Check if the inversion is correct. + + Args: + sig_t (np.ndarray): the correlation matrix + sig_t_inv (np.ndarray): the inverse of the correlation matrix + Returns: + bool: True if the inversion is correct, False otherwise + """ + return np.allclose(sig_t, np.dot(sig_t, np.dot(sig_t_inv, sig_t))) + + @staticmethod + def _var_in_boundaries(var: np.ndarray, lamb: float) -> np.ndarray: + """Forces the variance to be in the 0 to 1+lambda boundary. Theoritically we shouldn't have to do that. + + Args: + var (np.ndarray): the variance of the imputed SNPs + lamb (float): regularization term added to the diagonal of the sig_t matrix + + Returns: + np.ndarray: the variance of the imputed SNPs + """ + id_neg = np.where(var < 0) + var[id_neg] = 0 + id_inf = np.where(var > (0.99999 + lamb)) + var[id_inf] = 1 + + return var + + @staticmethod + def _invert_sig_t(sig_t: np.ndarray, lamb: float, rtol: float) -> np.ndarray: + """Invert the correlation matrix. If the provided regularization values are not enough to stabilize the inversion process for the given matrix, the function calls itself recursively, increasing lamb and rtol by 10%. + + Args: + sig_t (np.ndarray): the correlation matrix + lamb (float): regularization term added to the diagonal of the sig_t matrix + rtol (float): threshold to filter eigenvector with a eigenvalue under rtol make inversion biased but much more numerically robust + + Returns: + np.ndarray: the inverse of the correlation matrix + """ + try: + np.fill_diagonal(sig_t, (1 + lamb)) + sig_t_inv = scipy.linalg.pinv(sig_t, rtol=rtol, atol=0) + return sig_t_inv + except np.linalg.LinAlgError: + return SummaryStatisticsImputation._invert_sig_t( + sig_t, lamb * 1.1, rtol * 1.1 + ) diff --git a/src/gentropy/method/sumstat_quality_controls.py b/src/gentropy/method/sumstat_quality_controls.py new file mode 100644 index 000000000..eadfc58d6 --- /dev/null +++ b/src/gentropy/method/sumstat_quality_controls.py @@ -0,0 +1,263 @@ +"""Summary statistics qulity control methods.""" + +from __future__ import annotations + +import numpy as np +import pyspark.sql.functions as f +import pyspark.sql.types as t +import scipy as sc +from pyspark.sql import DataFrame +from pyspark.sql.functions import expr, log10, row_number +from pyspark.sql.window import Window +from scipy.stats import chi2 + +from gentropy.dataset.summary_statistics import SummaryStatistics + + +class SummaryStatisticsQC: + """Summary statistics QC methods. + + This module contains methods for quality control of GWAS summary statistics. + The list of methods includes: + + - sumstat_qc_beta_check: This is the mean beta check. The mean beta should be close to 0. + + - sumstat_qc_pz_check: This is the PZ check. It runs a linear regression between reported p-values and p-values inferred from z-scores. + + - sumstat_n_eff_check: This is the effective sample size check. It estimates the ratio between the effective sample size and the expected one and checks its distribution. + + - gc_lambda_check: This is the genomic control lambda check. + + - number_of_snps: This function calculates the number of SNPs and the number of SNPs with a p-value less than 5e-8. + """ + + @staticmethod + def sumstat_qc_beta_check( + gwas_for_qc: SummaryStatistics, + ) -> DataFrame: + """The mean beta check for QC of GWAS summary statstics. + + Args: + gwas_for_qc (SummaryStatistics): The instance of the SummaryStatistics class. + + Returns: + DataFrame: PySpark DataFrame with the mean beta for each study. + """ + gwas_df = gwas_for_qc._df + qc_c = gwas_df.groupBy("studyId").agg( + f.mean("beta").alias("mean_beta"), + ) + return qc_c + + @staticmethod + def _calculate_logpval(z2: float) -> float: + """Calculate negative log10-pval from Z-score. + + Args: + z2 (float): Z-score squared. + + Returns: + float: log10-pval. + + Examples: + >>> SummaryStatisticsQC._calculate_logpval(1.0) + 0.49851554582799334 + """ + logpval = -np.log10(sc.stats.chi2.sf((z2), 1)) + return float(logpval) + + @staticmethod + def sumstat_qc_pz_check( + gwas_for_qc: SummaryStatistics, + ) -> DataFrame: + """The PZ check for QC of GWAS summary statstics. It runs linear regression between reported p-values and p-values infered from z-scores. + + Args: + gwas_for_qc (SummaryStatistics): The instance of the SummaryStatistics class. + + Returns: + DataFrame: PySpark DataFrame with the results of the linear regression for each study. + """ + gwas_df = gwas_for_qc._df + + calculate_logpval_udf = f.udf( + SummaryStatisticsQC._calculate_logpval, t.DoubleType() + ) + + qc_c = ( + gwas_df.withColumn("Z2", (f.col("beta") / f.col("standardError")) ** 2) + .filter(f.col("Z2") <= 100) + .withColumn("new_logpval", calculate_logpval_udf(f.col("Z2"))) + .withColumn("log_mantissa", log10("pValueMantissa")) + .withColumn( + "diffpval", + -f.col("log_mantissa") - f.col("pValueExponent") - f.col("new_logpval"), + ) + .groupBy("studyId") + .agg( + f.mean("diffpval").alias("mean_diff_pz"), + f.stddev("diffpval").alias("se_diff_pz"), + ) + .select("studyId", "mean_diff_pz", "se_diff_pz") + ) + + return qc_c + + @staticmethod + def sumstat_n_eff_check( + gwas_for_qc: SummaryStatistics, + n_total: int = 100_000, + limit: int = 10_000_000, + min_count: int = 100, + ) -> DataFrame: + """The effective sample size check for QC of GWAS summary statstics. + + It estiamtes the ratio between effective sample size and the expected one and checks it's distribution. + It is possible to conduct only if the effective allele frequency is provided in the study. + The median rartio is always close to 1, but standard error could be inflated. + + Args: + gwas_for_qc (SummaryStatistics): The instance of the SummaryStatistics class. + n_total (int): The reported sample size of the study. The QC metrics is robust toward the sample size. + limit (int): The limit for the number of variants to be used for the estimation. + min_count (int): The minimum number of variants to be used for the estimation. + + Returns: + DataFrame: PySpark DataFrame with the effective sample size ratio for each study. + """ + gwas_df = gwas_for_qc._df + + gwas_df = gwas_df.dropna(subset=["effectAlleleFrequencyFromSource"]) + + counts_df = gwas_df.groupBy("studyId").count() + + # Join the original DataFrame with the counts DataFrame + df_with_counts = gwas_df.join(counts_df, on="studyId") + + # Filter the DataFrame to keep only the groups with count greater than or equal to min_count + filtered_df = df_with_counts.filter(f.col("count") >= min_count).drop("count") + + window = Window.partitionBy("studyId").orderBy("studyId") + gwas_df = ( + filtered_df.withColumn("row_num", row_number().over(window)) + .filter(f.col("row_num") <= limit) + .drop("row_num") + ) + + gwas_df = gwas_df.withColumn( + "var_af", + 2 + * ( + f.col("effectAlleleFrequencyFromSource") + * (1 - f.col("effectAlleleFrequencyFromSource")) + ), + ).withColumn( + "pheno_var", + ((f.col("standardError") ** 2) * n_total * f.col("var_af")) + + ((f.col("beta") ** 2) * f.col("var_af")), + ) + + window = Window.partitionBy("studyId").orderBy("studyId") + + # Calculate the median of 'pheno_var' for each 'studyId' and add it as a new column + gwas_df = gwas_df.withColumn( + "pheno_median", expr("percentile_approx(pheno_var, 0.5)").over(window) + ) + + gwas_df = gwas_df.withColumn( + "N_hat_ratio", + ( + (f.col("pheno_median") - ((f.col("beta") ** 2) * f.col("var_af"))) + / ((f.col("standardError") ** 2) * f.col("var_af") * n_total) + ), + ) + + qc_c = ( + gwas_df.groupBy("studyId") + .agg( + f.stddev("N_hat_ratio").alias("se_N"), + ) + .select("studyId", "se_N") + ) + + return qc_c + + @staticmethod + def gc_lambda_check( + gwas_for_qc: SummaryStatistics, + ) -> DataFrame: + """The genomic control lambda check for QC of GWAS summary statstics. + + Args: + gwas_for_qc (SummaryStatistics): The instance of the SummaryStatistics class. + + Returns: + DataFrame: PySpark DataFrame with the genomic control lambda for each study. + """ + gwas_df = gwas_for_qc._df + + qc_c = ( + gwas_df.select("studyId", "beta", "standardError") + .withColumn("Z2", (f.col("beta") / f.col("standardError")) ** 2) + .groupBy("studyId") + .agg(f.expr("percentile_approx(Z2, 0.5)").alias("gc_lambda")) + .withColumn("gc_lambda", f.col("gc_lambda") / chi2.ppf(0.5, df=1)) + .select("studyId", "gc_lambda") + ) + + return qc_c + + @staticmethod + def number_of_snps( + gwas_for_qc: SummaryStatistics, pval_threshold: float = 5e-8 + ) -> DataFrame: + """The function caluates number of SNPs and number of SNPs with p-value less than 5e-8. + + Args: + gwas_for_qc (SummaryStatistics): The instance of the SummaryStatistics class. + pval_threshold (float): The threshold for the p-value. + + Returns: + DataFrame: PySpark DataFrame with the number of SNPs and number of SNPs with p-value less than threshold. + """ + gwas_df = gwas_for_qc._df + + snp_counts = gwas_df.groupBy("studyId").agg( + f.count("*").alias("n_variants"), + f.sum( + ( + f.log10(f.col("pValueMantissa")) + f.col("pValueExponent") + <= np.log10(pval_threshold) + ).cast("int") + ).alias("n_variants_sig"), + ) + + return snp_counts + + @staticmethod + def get_quality_control_metrics( + gwas: SummaryStatistics, + pval_threshold: float = 1e-8, + ) -> DataFrame: + """The function calculates the quality control metrics for the summary statistics. + + Args: + gwas (SummaryStatistics): The instance of the SummaryStatistics class. + pval_threshold (float): The threshold for the p-value. + + Returns: + DataFrame: PySpark DataFrame with the quality control metrics for the summary statistics. + """ + qc1 = SummaryStatisticsQC.sumstat_qc_beta_check(gwas_for_qc=gwas) + qc2 = SummaryStatisticsQC.sumstat_qc_pz_check(gwas_for_qc=gwas) + qc4 = SummaryStatisticsQC.gc_lambda_check(gwas_for_qc=gwas) + qc5 = SummaryStatisticsQC.number_of_snps( + gwas_for_qc=gwas, pval_threshold=pval_threshold + ) + df = ( + qc1.join(qc2, on="studyId", how="outer") + .join(qc4, on="studyId", how="outer") + .join(qc5, on="studyId", how="outer") + ) + + return df diff --git a/src/gentropy/method/susie_inf.py b/src/gentropy/method/susie_inf.py index d493285a0..e8a4a57b1 100644 --- a/src/gentropy/method/susie_inf.py +++ b/src/gentropy/method/susie_inf.py @@ -6,11 +6,17 @@ from typing import Any import numpy as np +import pyspark.sql.functions as f import scipy.linalg import scipy.special +from pyspark.sql.window import Window from scipy.optimize import minimize, minimize_scalar from scipy.special import logsumexp +from gentropy.dataset.ld_index import LDIndex +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus, StudyLocusQualityCheck + @dataclass class SUSIE_inf: @@ -18,6 +24,9 @@ class SUSIE_inf: Note: code copied from fine-mapping-inf package as a placeholder https://github.com/FinucaneLab/fine-mapping-inf + + Raises: + RuntimeError: if missing LD or if unsupported variance estimation """ @staticmethod @@ -34,7 +43,7 @@ def susie_inf( # noqa: C901 ssq_range: tuple[float, float] = (0, 1), pi0: np.ndarray | None = None, est_sigmasq: bool = True, - est_tausq: bool = True, + est_tausq: bool = False, sigmasq: float = 1, tausq: float = 0, sigmasq_range: tuple[float, float] | None = None, @@ -84,8 +93,7 @@ def susie_inf( # noqa: C901 lbf -- length-p array of log-Bayes-factors for each CS Raises: - RuntimeError: if missing LD - RuntimeError: if unsupported variance estimation method + RuntimeError: if missing LD or if unsupported variance estimation method """ p = len(z) # Precompute V,D^2 in the SVD X=UDV', and V'X'y and y'y @@ -399,7 +407,7 @@ def g(x: float) -> float: def cred_inf( PIP: np.ndarray, n: int = 100_000, - coverage: float = 0.9, + coverage: float = 0.99, purity: float = 0.5, LD: np.ndarray | None = None, V: np.ndarray | None = None, @@ -423,6 +431,7 @@ def cred_inf( Raises: RuntimeError: if missing inputs for purity filtering + ValueError: if either LD or V, Dsq are None """ if (V is None or Dsq is None or n is None) and LD is None: raise RuntimeError("Missing inputs for purity filtering") @@ -457,3 +466,65 @@ def cred_inf( ) ) return cred + + @staticmethod + def credible_set_qc( + cred_sets: StudyLocus, + p_value_threshold: float = 1e-5, + purity_min_r2: float = 0.01, + clump: bool = False, + ld_index: LDIndex | None = None, + study_index: StudyIndex | None = None, + ld_min_r2: float | None = 0.8, + ) -> StudyLocus: + """Filter credible sets by lead P-value and min-R2 purity, and performs LD clumping. + + In case of duplicated loci, the filtering retains the loci wth the highest credibleSetlog10BF. + + + Args: + cred_sets (StudyLocus): StudyLocus object with credible sets to filter/clump + p_value_threshold (float): p-value threshold for filtering credible sets, default is 1e-5 + purity_min_r2 (float): min-R2 purity threshold for filtering credible sets, default is 0.01 + clump (bool): Whether to clump the credible sets by LD, default is False + ld_index (LDIndex | None): LDIndex object + study_index (StudyIndex | None): StudyIndex object + ld_min_r2 (float | None): LD R2 threshold for clumping, default is 0.8 + + Returns: + StudyLocus: Credible sets which pass filters and LD clumping. + """ + cred_sets.df = ( + cred_sets.df.withColumn( + "pValue", f.col("pValueMantissa") * f.pow(10, f.col("pValueExponent")) + ) + .filter(f.col("pValue") <= p_value_threshold) + .filter(f.col("purityMinR2") >= purity_min_r2) + .drop("pValue") + .withColumn( + "rn", + f.row_number().over( + Window.partitionBy("studyLocusId").orderBy( + f.desc("credibleSetLog10BF") + ) + ), + ) + .filter(f.col("rn") == 1) + .drop("rn") + ) + if clump: + assert study_index, "Running in clump mode, which requires study_index." + assert ld_index, "Running in clump mode, which requires ld_index." + assert ld_min_r2, "Running in clump mode, which requires ld_min_r2 value." + cred_sets = ( + cred_sets.annotate_ld(study_index, ld_index, ld_min_r2) + .clump() + .filter( + ~f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.LD_CLUMPED.value, + ) + ) + ) + + return cred_sets diff --git a/src/gentropy/method/window_based_clumping.py b/src/gentropy/method/window_based_clumping.py index a2ae12419..3ab15d42f 100644 --- a/src/gentropy/method/window_based_clumping.py +++ b/src/gentropy/method/window_based_clumping.py @@ -11,7 +11,8 @@ from pyspark.ml.linalg import DenseVector, VectorUDT from pyspark.sql.window import Window -from gentropy.dataset.study_locus import StudyLocus +from gentropy.config import WindowBasedClumpingStepConfig +from gentropy.dataset.study_locus import StudyLocus, StudyLocusQualityCheck if TYPE_CHECKING: from numpy.typing import NDArray @@ -151,23 +152,40 @@ def _prune_peak(position: NDArray[np.float64], window_size: int) -> DenseVector: return DenseVector(is_lead) - @classmethod + @staticmethod def clump( - cls: type[WindowBasedClumping], - summary_stats: SummaryStatistics, - window_length: int, - p_value_significance: float = 5e-8, + unclumped_associations: SummaryStatistics | StudyLocus, + distance: int = WindowBasedClumpingStepConfig().distance, ) -> StudyLocus: - """Clump summary statistics by distance. + """Clump single point associations from summary statistics or study locus dataset based on window. Args: - summary_stats (SummaryStatistics): summary statistics to clump - window_length (int): window length in basepair - p_value_significance (float): only more significant variants are considered + unclumped_associations (SummaryStatistics | StudyLocus): Input dataset to be used for clumping. Assumes that the input dataset is already filtered for significant variants. + distance (int): Distance in base pairs to be used for clumping. Defaults to 500_000. Returns: - StudyLocus: clumped summary statistics + StudyLocus: clumped associations, where the clumped variants are flagged. """ + # Quality check expression that flags variants that are not considered lead variant: + qc_check = f.col("semiIndices")[f.col("pvRank") - 1] <= 0 + + # The quality control expression will depend on the input dataset, as the column might be already present: + qc_expression = ( + # When the column is already present and the condition is met, the value is appended to the array, otherwise keep as is: + f.when( + qc_check, + f.array_union( + f.col("qualityControls"), + f.array(f.lit(StudyLocusQualityCheck.WINDOW_CLUMPED.value)), + ), + ).otherwise(f.col("qualityControls")) + if "qualityControls" in unclumped_associations.df.columns + # If column is not there yet, initialize it with the flag value, or an empty array: + else f.when( + qc_check, f.array(f.lit(StudyLocusQualityCheck.WINDOW_CLUMPED.value)) + ).otherwise(f.array().cast(t.ArrayType(t.StringType()))) + ) + # Create window for locus clusters # - variants where the distance between subsequent variants is below the defined threshold. # - Variants are sorted by descending significance @@ -177,18 +195,15 @@ def clump( return StudyLocus( _df=( - summary_stats - # Dropping snps below significance - all subsequent steps are done on significant variants: - .pvalue_filter(p_value_significance) - .df - # Clustering summary variants for efficient windowing (complexity reduction): + unclumped_associations.df + # Clustering variants for efficient windowing (complexity reduction): .withColumn( "cluster_id", WindowBasedClumping._cluster_peaks( f.col("studyId"), f.col("chromosome"), f.col("position"), - window_length, + distance, ), ) # Within each cluster variants are ranked by significance: @@ -205,7 +220,7 @@ def clump( ), ).otherwise(f.array()), ) - # Get semi indices only ONCE per cluster: + # Collect top loci per cluster: .withColumn( "semiIndices", f.when( @@ -213,7 +228,7 @@ def clump( fml.vector_to_array( f.udf(WindowBasedClumping._prune_peak, VectorUDT())( fml.array_to_vector(f.col("collectedPositions")), - f.lit(window_length), + f.lit(distance), ) ), ), @@ -228,108 +243,16 @@ def clump( ), ).otherwise(f.col("semiIndices")), ) - # Keeping semi indices only: - .filter(f.col("semiIndices")[f.col("pvRank") - 1] > 0) - .drop("pvRank", "collectedPositions", "semiIndices", "cluster_id") # Adding study-locus id: .withColumn( "studyLocusId", StudyLocus.assign_study_locus_id( - f.col("studyId"), f.col("variantId") + ["studyId", "variantId"] ), ) # Initialize QC column as array of strings: - .withColumn( - "qualityControls", f.array().cast(t.ArrayType(t.StringType())) - ) + .withColumn("qualityControls", qc_expression) + .drop("pvRank", "collectedPositions", "semiIndices", "cluster_id") ), _schema=StudyLocus.get_schema(), ) - - @classmethod - def clump_with_locus( - cls: type[WindowBasedClumping], - summary_stats: SummaryStatistics, - window_length: int, - p_value_significance: float = 5e-8, - p_value_baseline: float = 0.05, - locus_window_length: int | None = None, - ) -> StudyLocus: - """Clump significant associations while collecting locus around them. - - Args: - summary_stats (SummaryStatistics): Input summary statistics dataset - window_length (int): Window size in bp, used for distance based clumping. - p_value_significance (float): GWAS significance threshold used to filter peaks. Defaults to 5e-8. - p_value_baseline (float): Least significant threshold. Below this, all snps are dropped. Defaults to 0.05. - locus_window_length (int | None): The distance for collecting locus around the semi indices. Defaults to None. - - Returns: - StudyLocus: StudyLocus after clumping with information about the `locus` - """ - # If no locus window provided, using the same value: - if locus_window_length is None: - locus_window_length = window_length - - # Run distance based clumping on the summary stats: - clumped_dataframe = WindowBasedClumping.clump( - summary_stats, - window_length=window_length, - p_value_significance=p_value_significance, - ).df.alias("clumped") - - # Get list of columns from clumped dataset for further propagation: - clumped_columns = clumped_dataframe.columns - - # Dropping variants not meeting the baseline criteria: - sumstats_baseline = summary_stats.pvalue_filter(p_value_baseline).df - - # Renaming columns: - sumstats_baseline_renamed = sumstats_baseline.selectExpr( - *[f"{col} as tag_{col}" for col in sumstats_baseline.columns] - ).alias("sumstat") - - study_locus_df = ( - sumstats_baseline_renamed - # Joining the two datasets together: - .join( - f.broadcast(clumped_dataframe), - on=[ - (f.col("sumstat.tag_studyId") == f.col("clumped.studyId")) - & (f.col("sumstat.tag_chromosome") == f.col("clumped.chromosome")) - & ( - f.col("sumstat.tag_position") - >= (f.col("clumped.position") - locus_window_length) - ) - & ( - f.col("sumstat.tag_position") - <= (f.col("clumped.position") + locus_window_length) - ) - ], - how="right", - ) - .withColumn( - "locus", - f.struct( - f.col("tag_variantId").alias("variantId"), - f.col("tag_beta").alias("beta"), - f.col("tag_pValueMantissa").alias("pValueMantissa"), - f.col("tag_pValueExponent").alias("pValueExponent"), - f.col("tag_standardError").alias("standardError"), - ), - ) - .groupby("studyLocusId") - .agg( - *[ - f.first(col).alias(col) - for col in clumped_columns - if col != "studyLocusId" - ], - f.collect_list(f.col("locus")).alias("locus"), - ) - ) - - return StudyLocus( - _df=study_locus_df, - _schema=StudyLocus.get_schema(), - ) diff --git a/src/gentropy/pics.py b/src/gentropy/pics.py index c2ed9bf66..f96f54997 100644 --- a/src/gentropy/pics.py +++ b/src/gentropy/pics.py @@ -3,7 +3,8 @@ from __future__ import annotations from gentropy.common.session import Session -from gentropy.dataset.study_locus import StudyLocus +from gentropy.config import WindowBasedClumpingStepConfig +from gentropy.dataset.study_locus import CredibleInterval, StudyLocus from gentropy.method.pics import PICS @@ -28,6 +29,14 @@ def __init__( session, study_locus_ld_annotated_in ) # PICS - picsed_sl = PICS.finemap(study_locus_ld_annotated).annotate_credible_sets() - # Write - picsed_sl.df.write.mode(session.write_mode).parquet(picsed_study_locus_out) + ( + PICS.finemap(study_locus_ld_annotated) + .filter_credible_set(credible_interval=CredibleInterval.IS99) + # Flagging sub-significnat loci: + .validate_lead_pvalue( + pvalue_cutoff=WindowBasedClumpingStepConfig().gwas_significance + ) + # Writing the output: + .df.write.mode(session.write_mode) + .parquet(picsed_study_locus_out) + ) diff --git a/src/gentropy/study_locus_validation.py b/src/gentropy/study_locus_validation.py new file mode 100644 index 000000000..1d1d128b6 --- /dev/null +++ b/src/gentropy/study_locus_validation.py @@ -0,0 +1,64 @@ +"""Step to validate study locus dataset against study index.""" + +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import CredibleInterval, StudyLocus + + +class StudyLocusValidationStep: + """Study index validation step. + + This step reads and outputs a study index dataset with flagged studies + when target of disease validation fails. + """ + + def __init__( + self, + session: Session, + study_index_path: str, + study_locus_path: list[str], + valid_study_locus_path: str, + invalid_study_locus_path: str, + invalid_qc_reasons: list[str] = [], + ) -> None: + """Initialize step. + + Args: + session (Session): Session object. + study_index_path (str): Path to study index file. + study_locus_path (list[str]): Path to study locus dataset. + valid_study_locus_path (str): Path to write the valid records. + invalid_study_locus_path (str): Path to write the output file. + invalid_qc_reasons (list[str]): List of invalid quality check reason names from `StudyLocusQualityCheck` (e.g. ['SUBSIGNIFICANT_FLAG']). + """ + # Reading datasets: + study_index = StudyIndex.from_parquet(session, study_index_path) + + # Running validation then writing output: + study_locus_with_qc = ( + StudyLocus.from_parquet(session, list(study_locus_path)) + # Add flag for MHC region + .qc_MHC_region() + .validate_study(study_index) # Flagging studies not in study index + .annotate_study_type(study_index) # Add study type to study locus + .qc_redundant_top_hits_from_PICS() # Flagging top hits from studies with PICS summary statistics + .qc_explained_by_SuSiE() # Flagging credible sets in regions explained by SuSiE + # Flagging credible sets with PIP > 1 or PIP < 0.99 + .qc_abnormal_pips( + sum_pips_lower_threshold=0.99, sum_pips_upper_threshold=1.0001 + ) + # Annotates credible intervals and filter to only keep 99% credible sets + .filter_credible_set(credible_interval=CredibleInterval.IS99) + # Annotate credible set confidence: + .assign_confidence() + ).persist() # we will need this for 2 types of outputs + + study_locus_with_qc.valid_rows(invalid_qc_reasons, invalid=True).df.write.mode( + session.write_mode + ).parquet(invalid_study_locus_path) + + study_locus_with_qc.valid_rows(invalid_qc_reasons).df.write.mode( + session.write_mode + ).parquet(valid_study_locus_path) diff --git a/src/gentropy/study_validation.py b/src/gentropy/study_validation.py new file mode 100644 index 000000000..08f601f1e --- /dev/null +++ b/src/gentropy/study_validation.py @@ -0,0 +1,80 @@ +"""Step to validate study index against disease and target index.""" + +from __future__ import annotations + +from pyspark.sql import functions as f + +from gentropy.common.session import Session +from gentropy.dataset.biosample_index import BiosampleIndex +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.study_index import StudyIndex + + +class StudyValidationStep: + """Study index validation step. + + This step reads and outputs a study index dataset with flagged studies + when target of disease validation fails. + """ + + def __init__( + self, + session: Session, + study_index_path: list[str], + target_index_path: str, + disease_index_path: str, + biosample_index_path: str, + valid_study_index_path: str, + invalid_study_index_path: str, + invalid_qc_reasons: list[str] = [], + ) -> None: + """Initialize step. + + Args: + session (Session): Session object. + study_index_path (list[str]): Path to study index file. + target_index_path (str): Path to target index file. + disease_index_path (str): Path to disease index file. + biosample_index_path (str): Path to biosample index file. + valid_study_index_path (str): Path to write the valid records. + invalid_study_index_path (str): Path to write the output file. + invalid_qc_reasons (list[str]): List of invalid quality check reason names from `StudyQualityCheck` (e.g. ['DUPLICATED_STUDY']). + """ + # Reading datasets: + target_index = GeneIndex.from_parquet(session, target_index_path) + biosample_index = BiosampleIndex.from_parquet(session, biosample_index_path) + # Reading disease index and pre-process. + # This logic does not belong anywhere, but gentorpy has no disease dataset yet. + disease_index = ( + session.spark.read.parquet(disease_index_path) + .select( + f.col("id").alias("diseaseId"), + f.explode_outer( + f.when( + f.col("obsoleteTerms").isNotNull(), + f.array_union(f.array("id"), f.col("obsoleteTerms")), + ) + ).alias("efo"), + ) + .withColumn("efo", f.coalesce(f.col("efo"), f.col("diseaseId"))) + ) + study_index = StudyIndex.from_parquet(session, list(study_index_path)) + + # Running validation: + study_index_with_qc = ( + study_index.deconvolute_studies() # Deconvolute studies where the same study is ingested from multiple sources + .validate_study_type() # Flagging non-supported study types + .validate_target(target_index) # Flagging QTL studies with invalid targets + .validate_disease(disease_index) # Flagging invalid EFOs + .validate_biosample( + biosample_index + ) # Flagging QTL studies with invalid biosamples + ).persist() # we will need this for 2 types of outputs + + study_index_with_qc.valid_rows(invalid_qc_reasons, invalid=True).df.write.mode( + session.write_mode + ).parquet(invalid_study_index_path) + + study_index_with_qc.valid_rows(invalid_qc_reasons).df.write.mode( + session.write_mode + ).parquet(valid_study_index_path) diff --git a/src/gentropy/sumstat_qc_step.py b/src/gentropy/sumstat_qc_step.py new file mode 100644 index 000000000..49ddc3c4a --- /dev/null +++ b/src/gentropy/sumstat_qc_step.py @@ -0,0 +1,37 @@ +"""Step to calculate quality control metrics on the provided GWAS study.""" + +from __future__ import annotations + +from gentropy.common.session import Session +from gentropy.dataset.summary_statistics import SummaryStatistics +from gentropy.method.sumstat_quality_controls import SummaryStatisticsQC + + +class SummaryStatisticsQCStep: + """Step to run GWAS QC.""" + + def __init__( + self, + session: Session, + gwas_path: str, + output_path: str, + pval_threshold: float = 1e-8, + ) -> None: + """Calculating quality control metrics on the provided GWAS study. + + Args: + session (Session): Spark session + gwas_path (str): Path to the GWAS summary statistics. + output_path (str): Output path for the QC results. + pval_threshold (float): P-value threshold for the QC. Default is 1e-8. + + """ + gwas = SummaryStatistics.from_parquet(session, path=gwas_path) + + ( + SummaryStatisticsQC.get_quality_control_metrics( + gwas=gwas, pval_threshold=pval_threshold + ) + .write.mode(session.write_mode) + .parquet(output_path) + ) diff --git a/src/gentropy/susie_finemapper.py b/src/gentropy/susie_finemapper.py new file mode 100644 index 000000000..03a8730ef --- /dev/null +++ b/src/gentropy/susie_finemapper.py @@ -0,0 +1,1127 @@ +"""Step to run a finemapping using.""" + +from __future__ import annotations + +import logging +import time +from typing import Any + +import numpy as np +import pandas as pd +import pyspark.sql.functions as f +import scipy as sc +from pyspark.sql import DataFrame, Row, Window +from pyspark.sql.functions import desc, row_number +from pyspark.sql.types import ( + DoubleType, + IntegerType, + StringType, + StructField, + StructType, +) + +from gentropy.common.session import Session +from gentropy.common.spark_helpers import ( + neglog_pvalue_to_mantissa_and_exponent, + order_array_of_structs_by_field, +) +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus, StudyLocusQualityCheck +from gentropy.method.carma import CARMA +from gentropy.method.ld import LDAnnotator +from gentropy.method.ld_matrix_interface import LDMatrixInterface +from gentropy.method.sumstat_imputation import SummaryStatisticsImputation +from gentropy.method.susie_inf import SUSIE_inf + + +class SusieFineMapperStep: + """SuSie finemaping. It has generic methods to run SuSie fine mapping for a study locus. + + This class/step is the temporary solution of the fine-mapping warpper for the development purposes. + In the future this step will be refactored and moved to the methods module. + """ + + def __init__( + self, + session: Session, + study_index_path: str, + study_locus_manifest_path: str, + study_locus_index: int, + max_causal_snps: int = 10, + lead_pval_threshold: float = 1e-5, + purity_mean_r2_threshold: float = 0, + purity_min_r2_threshold: float = 0.25, + cs_lbf_thr: float = 2, + sum_pips: float = 0.99, + susie_est_tausq: bool = False, + run_carma: bool = False, + run_sumstat_imputation: bool = False, + carma_time_limit: int = 600, + carma_tau: float = 0.15, + imputed_r2_threshold: float = 0.9, + ld_score_threshold: float = 5, + ld_min_r2: float = 0.8, + ) -> None: + """Run fine-mapping on a studyLocusId from a collected studyLocus table. + + Method require a `study_locus_manifest_path` file that will contain ["study_locus_input", "study_locus_output", "log_file"]. `log_file` + is optional parameter to the manifest. In case it does not exist, the logs from the finemapper are saved under the same directory + as the `study_locus_output` with `.log` suffix. + Each execution of the method will only evaluate a single row from the `study_locus_manifest` that is inferred from the `study_locus_index` + variable. + + Args: + session (Session): Spark session + study_index_path (str): path to the study index + study_locus_manifest_path (str): Path to the CSV manifest containing all study locus input and output locations. Should contain two columns: study_locus_input and study_locus_output + study_locus_index (int): Index (0-based) of the locus in the manifest to process in this call + max_causal_snps (int): Maximum number of causal variants in locus, default is 10 + lead_pval_threshold (float): p-value threshold for the lead variant from CS, default is 1e-5 + purity_mean_r2_threshold (float): threshold for purity mean r2 qc metrics for filtering credible sets, default is 0 + purity_min_r2_threshold (float): threshold for purity min r2 qc metrics for filtering credible sets, default is 0.25 + cs_lbf_thr (float): credible set logBF threshold for filtering credible sets, default is 2 + sum_pips (float): the expected sum of posterior probabilities in the locus, default is 0.99 (99% credible set) + susie_est_tausq (bool): estimate tau squared, default is False + run_carma (bool): run CARMA, default is False + run_sumstat_imputation (bool): run summary statistics imputation, default is False + carma_time_limit (int): CARMA time limit, default is 600 seconds + carma_tau (float): CARMA tau, shrinkage parameter + imputed_r2_threshold (float): imputed R2 threshold, default is 0.9 + ld_score_threshold (float): LD score threshold ofr imputation, default is 5 + ld_min_r2 (float): Threshold to filter CS by leads in high LD, default is 0.8 + """ + # Read locus manifest. + study_locus_manifest = pd.read_csv(study_locus_manifest_path) + row = study_locus_manifest.loc[study_locus_index] + study_locus_input = row["study_locus_input"] + study_locus_output = row["study_locus_output"] + log_output = study_locus_output + ".log" + if "log_output" in study_locus_manifest.columns: + log_output = row["log_output"] + ".log" + + # Read studyLocus + study_locus = ( + StudyLocus.from_parquet(session, study_locus_input) + .df.withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id( + ["studyId", "variantId", "finemappingMethod"] + ), + ) + .collect()[0] + ) + study_index = StudyIndex.from_parquet(session, study_index_path) + # Run fine-mapping + + result_logging = self.susie_finemapper_one_sl_row_gathered_boundaries( + session=session, + study_locus_row=study_locus, + study_index=study_index, + max_causal_snps=max_causal_snps, + purity_mean_r2_threshold=purity_mean_r2_threshold, + purity_min_r2_threshold=purity_min_r2_threshold, + cs_lbf_thr=cs_lbf_thr, + sum_pips=sum_pips, + lead_pval_threshold=lead_pval_threshold, + susie_est_tausq=susie_est_tausq, + run_carma=run_carma, + run_sumstat_imputation=run_sumstat_imputation, + carma_tau=carma_tau, + carma_time_limit=carma_time_limit, + imputed_r2_threshold=imputed_r2_threshold, + ld_score_threshold=ld_score_threshold, + ld_min_r2=ld_min_r2, + log_output=log_output, + ) + + if result_logging is not None: + if result_logging["study_locus"] is not None: + # Write result + df = result_logging["study_locus"].df + df = df.withColumn("qualityControls", f.lit(None)) + df = df.withColumn( + "qualityControls", + StudyLocus.update_quality_flag( + f.col("qualityControls"), + f.lit(True), + StudyLocusQualityCheck.OUT_OF_SAMPLE_LD, + ), + ) + df.write.mode(session.write_mode).parquet(study_locus_output) + if result_logging["log"] is not None: + # Write log + result_logging["log"].to_csv(log_output, index=False, sep="\t") + + @staticmethod + def _empty_log_mg(studyId: str, region: str, error_mg: str, path_out: str) -> None: + """Create an empty log DataFrame with error message. + + Args: + studyId (str): study ID + region (str): region + error_mg (str): error message + path_out (str): output path + """ + pd.DataFrame( + { + "studyId": studyId, + "region": region, + "N_gwas_before_dedupl": 0, + "N_gwas": 0, + "N_ld": 0, + "N_overlap": 0, + "N_outliers": 0, + "N_imputed": 0, + "N_final_to_fm": 0, + "elapsed_time": 0, + "number_of_CS": 0, + "error": error_mg, + }, + index=[0], + ).to_csv(path_out, index=False, sep="\t") + + @staticmethod + def susie_inf_to_studylocus( # noqa: C901 + susie_output: dict[str, Any], + session: Session, + studyId: str, + region: str, + variant_index: DataFrame, + ld_matrix: np.ndarray, + locusStart: int, + locusEnd: int, + cs_lbf_thr: float = 2, + sum_pips: float = 0.99, + lead_pval_threshold: float = 1, + purity_mean_r2_threshold: float = 0, + purity_min_r2_threshold: float = 0, + ld_min_r2: float = 0.9, + ) -> StudyLocus | None: + """Convert SuSiE-inf output to StudyLocus DataFrame. + + Args: + susie_output (dict[str, Any]): SuSiE-inf output dictionary + session (Session): Spark session + studyId (str): study ID + region (str): region + variant_index (DataFrame): DataFrame with variant information + ld_matrix (np.ndarray): LD matrix used for fine-mapping + locusStart (int): locus start + locusEnd (int): locus end + cs_lbf_thr (float): credible set logBF threshold for filtering credible sets, default is 2 + sum_pips (float): the expected sum of posterior probabilities in the locus, default is 0.99 (99% credible set) + lead_pval_threshold (float): p-value threshold for the lead variant from CS + purity_mean_r2_threshold (float): thrshold for purity mean r2 qc metrics for filtering credible sets + purity_min_r2_threshold (float): thrshold for purity min r2 qc metrics for filtering credible sets + ld_min_r2 (float): Threshold to fillter CS by leads in high LD, default is 0.9 + + Returns: + StudyLocus | None: StudyLocus object with fine-mapped credible sets + """ + # PLEASE DO NOT REMOVE THIS LINE + pd.DataFrame.iteritems = pd.DataFrame.items + + variants = np.array( + [row["variantId"] for row in variant_index.select("variantId").collect()] + ).reshape(-1, 1) + + PIPs = susie_output["PIP"] + lbfs = susie_output["lbf_variable"] + mu = susie_output["mu"] + susie_result = np.hstack((variants, PIPs, lbfs, mu)) + + L_snps = PIPs.shape[1] + + # Extracting credible sets + order_creds = list(enumerate(susie_output["lbf"])) + order_creds.sort(key=lambda x: x[1], reverse=True) + + counter = 0 + for i, cs_lbf_value in order_creds: + if counter > 0 and cs_lbf_value < cs_lbf_thr: + counter += 1 + continue + counter += 1 + sorted_arr = susie_result[ + susie_result[:, i + 1].astype(float).argsort()[::-1] + ] + cumsum_arr = np.cumsum(sorted_arr[:, i + 1].astype(float)) + filter_row = np.argmax(cumsum_arr >= sum_pips) + if filter_row == 0 and cumsum_arr[0] < sum_pips: + filter_row = len(cumsum_arr) + filter_row += 1 + filtered_arr = sorted_arr[:filter_row] + cred_set = filtered_arr[:, [0, i + 1, i + L_snps + 1, i + 2 * L_snps + 1]] + win = Window.rowsBetween( + Window.unboundedPreceding, Window.unboundedFollowing + ) + + cred_set = ( + session.spark.createDataFrame( + cred_set.tolist(), + ["variantId", "posteriorProbability", "logBF", "beta"], + ) + .join( + variant_index.select( + "variantId", + "chromosome", + "position", + ), + "variantId", + ) + .sort(f.desc("posteriorProbability")) + .withColumn( + "locus", + f.collect_list( + f.struct( + f.col("variantId").cast("string").alias("variantId"), + f.col("posteriorProbability") + .cast("double") + .alias("posteriorProbability"), + f.col("logBF").cast("double").alias("logBF"), + f.col("beta").cast("double").alias("beta"), + ) + ).over(win), + ) + .limit(1) + .withColumns( + { + "studyId": f.lit(studyId), + "region": f.lit(region), + "credibleSetIndex": f.lit(counter), + "credibleSetlog10BF": f.lit(cs_lbf_value * 0.4342944819), + "finemappingMethod": f.lit("SuSiE-inf"), + } + ) + .withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id( + ["studyId", "variantId", "finemappingMethod"] + ), + ) + .select( + "studyLocusId", + "studyId", + "region", + "credibleSetIndex", + "locus", + "variantId", + "chromosome", + "position", + "finemappingMethod", + "credibleSetlog10BF", + ) + ) + if counter == 1: + cred_sets = cred_set + else: + cred_sets = cred_sets.unionByName(cred_set) + + # Calulating purity + variant_index_df = variant_index.toPandas() + cred_sets_variantId = cred_sets.select("locus.variantId").toPandas() + + lead_variantId_list = ( + cred_sets.select("variantId").toPandas()["variantId"].tolist() + ) + cred_set_index = ( + cred_sets.select("credibleSetIndex").toPandas()["credibleSetIndex"].tolist() + ) + vlist_series = pd.Series(lead_variantId_list) + ind = vlist_series.map(variant_index_df.set_index("variantId").index.get_loc) + z_values = variant_index_df.iloc[ind]["z"].tolist() + z_values_array = np.array(z_values) + pval = sc.stats.chi2.sf((z_values_array**2), 1) + + # sometimes pval is 0, we need to avoid it + pval[pval < 1e-322] = 1e-322 + + neglogpval = -np.log10(pval) + neglogpval = neglogpval.tolist() + + list_purity_mean_r2 = [] + list_purity_min_r2 = [] + for _, row in cred_sets_variantId.iterrows(): + row = row.iloc[0] + vlist_series = pd.Series(row) + ind = vlist_series.map( + variant_index_df.set_index("variantId").index.get_loc + ) + # print(variant_index_df.iloc[ind,0]==vlist) + squared_matrix = ld_matrix[ind, :][:, ind] ** 2 + purity_mean_r2 = np.mean(squared_matrix) + purity_min_r2 = np.min(squared_matrix) + list_purity_mean_r2.append(purity_mean_r2) + list_purity_min_r2.append(purity_min_r2) + + cred_sets = cred_sets.drop("pValueMantissa", "pValueExponent") + + df = pd.DataFrame( + { + "credibleSetIndex": cred_set_index, + "purityMeanR2": list_purity_mean_r2, + "purityMinR2": list_purity_min_r2, + "zScore": z_values, + "neglogpval": neglogpval, + } + ) + schema = StructType( + [ + StructField("credibleSetIndex", IntegerType(), True), + StructField("purityMeanR2", DoubleType(), True), + StructField("purityMinR2", DoubleType(), True), + StructField("zScore", DoubleType(), True), + StructField("neglogpval", DoubleType(), True), + ] + ) + + df_spark = session.spark.createDataFrame(df, schema=schema) + + cred_sets = cred_sets.join(df_spark, on="credibleSetIndex") + + mantissa, exponent = neglog_pvalue_to_mantissa_and_exponent( + cred_sets.neglogpval + ) + cred_sets = cred_sets.withColumn("pValueMantissa", mantissa) + cred_sets = cred_sets.withColumn("pValueExponent", exponent) + cred_sets = cred_sets.withColumn( + "pValueMantissa", f.col("pValueMantissa").cast("float") + ) + + # Filter by lead p-value, credible set logBF, purity mean r2 and purity min r2 + cred_sets = cred_sets.filter( + (f.col("neglogpval") >= -np.log10(lead_pval_threshold)) + & (f.col("credibleSetlog10BF") >= cs_lbf_thr * 0.4342944819) + & (~f.isnan(f.col("credibleSetlog10BF"))) + & (f.col("purityMinR2") >= purity_min_r2_threshold) + & (f.col("purityMeanR2") >= purity_mean_r2_threshold) + ) + + if cred_sets.count() == 0: + return None + + # Remove duplicated by lead variant + if cred_sets.count() > 1: + window = Window.partitionBy("variantId").orderBy("credibleSetIndex") + cred_sets = cred_sets.withColumn("rank", row_number().over(window)) + cred_sets = cred_sets.filter(cred_sets["rank"] == 1).drop("rank") + cred_sets = cred_sets.orderBy("credibleSetIndex") + + # Remove CSs with high LD between leads + if cred_sets.count() > 1: + cred_sets = cred_sets.orderBy(desc("neglogpval")) + lead_variantId_list = ( + cred_sets.select("variantId").toPandas()["variantId"].tolist() + ) + vlist_series = pd.Series(lead_variantId_list) + ind = vlist_series.map( + variant_index_df.set_index("variantId").index.get_loc + ) + ld_leads = ld_matrix[ind, :][:, ind] + ld_leads = ld_leads**2 + ld_leads = ld_leads - np.tril(ld_leads) + np.fill_diagonal(ld_leads, -1) + + lead_variantId_list_to_delete: list[str] = [] + for idx in range(len(lead_variantId_list)): + vId = lead_variantId_list[idx] + if vId in lead_variantId_list_to_delete: + continue + high_ld_indices = np.where(ld_leads[idx, :] >= ld_min_r2)[0] + if len(high_ld_indices) > 0: + lead_variantId_list_to_delete = ( + lead_variantId_list_to_delete + + list(np.array(lead_variantId_list)[high_ld_indices]) + ) + if len(lead_variantId_list_to_delete) > 0: + for vId in lead_variantId_list_to_delete: + cred_sets = cred_sets.filter(f.col("variantId") != vId) + + cred_sets = cred_sets.drop("neglogpval") + cred_sets = cred_sets.withColumn("locusStart", f.lit(locusStart)) + cred_sets = cred_sets.withColumn("locusEnd", f.lit(locusEnd)) + + cred_sets = cred_sets.drop("beta").withColumn( + "beta", + f.expr(""" + filter(locus, x -> x.variantId = variantId)[0].beta + """), + ) + + return StudyLocus( + _df=cred_sets, + _schema=StudyLocus.get_schema(), + ) + + @staticmethod + def susie_finemapper_from_prepared_dataframes( + GWAS_df: DataFrame, + ld_index: DataFrame, + gnomad_ld: np.ndarray, + L: int, + session: Session, + studyId: str, + region: str, + locusStart: int, + locusEnd: int, + susie_est_tausq: bool = False, + run_carma: bool = False, + run_sumstat_imputation: bool = False, + carma_time_limit: int = 600, + carma_tau: float = 0.04, + imputed_r2_threshold: float = 0.8, + ld_score_threshold: float = 4, + sum_pips: float = 0.99, + lead_pval_threshold: float = 1e-5, + purity_mean_r2_threshold: float = 0, + purity_min_r2_threshold: float = 0.25, + cs_lbf_thr: float = 2, + ld_min_r2: float = 0.9, + N_total: int = 100_000, + ) -> dict[str, Any] | None: + """Susie fine-mapper function that uses LD, z-scores, variant info and other options for Fine-Mapping. + + Args: + GWAS_df (DataFrame): GWAS DataFrame with mandotary columns: z, variantId + ld_index (DataFrame): LD index DataFrame + gnomad_ld (np.ndarray): GnomAD LD matrix + L (int): number of causal variants + session (Session): Spark session + studyId (str): study ID + region (str): region + locusStart (int): locus start + locusEnd (int): locus end + susie_est_tausq (bool): estimate tau squared, default is False + run_carma (bool): run CARMA, default is False + run_sumstat_imputation (bool): run summary statistics imputation, default is False + carma_time_limit (int): CARMA time limit, default is 600 seconds + carma_tau (float): CARMA tau, shrinkage parameter + imputed_r2_threshold (float): imputed R2 threshold, default is 0.8 + ld_score_threshold (float): LD score threshold ofr imputation, default is 4 + sum_pips (float): the expected sum of posterior probabilities in the locus, default is 0.99 (99% credible set) + lead_pval_threshold (float): p-value threshold for the lead variant from CS, default is 1e-5 + purity_mean_r2_threshold (float): thrshold for purity mean r2 qc metrics for filtering credible sets + purity_min_r2_threshold (float): thrshold for purity min r2 qc metrics for filtering credible sets + cs_lbf_thr (float): credible set logBF threshold for filtering credible sets, default is 2 + ld_min_r2 (float): Threshold to fillter CS by leads in high LD, default is 0.9 + N_total (int): total number of samples, default is 100_000 + + Returns: + dict[str, Any] | None: dictionary with study locus, number of GWAS variants, number of LD variants, number of variants after merge, number of outliers, number of imputed variants, number of variants to fine-map + """ + # PLEASE DO NOT REMOVE THIS LINE + pd.DataFrame.iteritems = pd.DataFrame.items + + start_time = time.time() + GWAS_df = GWAS_df.toPandas() + N_gwas_before_dedupl = len(GWAS_df) + + GWAS_df = GWAS_df.drop_duplicates(subset="variantId", keep=False) + GWAS_df = GWAS_df.reset_index() + + ld_index = ld_index.toPandas() + ld_index = ld_index.reset_index() + + N_gwas = len(GWAS_df) + N_ld = len(ld_index) + + # Filtering out the variants that are not in the LD matrix, we don't need them + df_columns = ["variantId", "z"] + GWAS_df = GWAS_df.merge(ld_index, on="variantId", how="inner") + GWAS_df = GWAS_df[df_columns].reset_index() + N_after_merge = len(GWAS_df) + + merged_df = GWAS_df.merge( + ld_index, left_on="variantId", right_on="variantId", how="inner" + ) + indices = merged_df["index_y"].values + + ld_to_fm = gnomad_ld[indices][:, indices] + z_to_fm = GWAS_df["z"].values + + if run_carma: + carma_output = CARMA.time_limited_CARMA_spike_slab_noEM( + z=z_to_fm, ld=ld_to_fm, sec_threshold=carma_time_limit, tau=carma_tau + ) + if carma_output["Outliers"] != [] and carma_output["Outliers"] is not None: + GWAS_df.drop(carma_output["Outliers"], inplace=True) + GWAS_df = GWAS_df.reset_index() + ld_index = ld_index.reset_index() + merged_df = GWAS_df.merge( + ld_index, left_on="variantId", right_on="variantId", how="inner" + ) + indices = merged_df["index_y"].values + + ld_to_fm = gnomad_ld[indices][:, indices] + z_to_fm = GWAS_df["z"].values + N_outliers = len(carma_output["Outliers"]) + else: + N_outliers = 0 + else: + N_outliers = 0 + + if run_sumstat_imputation: + known = indices + unknown = [ + index for index in list(range(len(gnomad_ld))) if index not in known + ] + sig_t = gnomad_ld[known, :][:, known] + sig_i_t = gnomad_ld[unknown, :][:, known] + zt = z_to_fm + + sumstat_imp_res = SummaryStatisticsImputation.raiss_model( + z_scores_known=zt, + ld_matrix_known=sig_t, + ld_matrix_known_missing=sig_i_t, + lamb=0.01, + rtol=0.01, + ) + + bool_index = (sumstat_imp_res["imputation_r2"] >= imputed_r2_threshold) * ( + sumstat_imp_res["ld_score"] >= ld_score_threshold + ) + if sum(bool_index) >= 1: + indices = np.where(bool_index)[0] + index_to_add = [unknown[i] for i in indices] + index_to_fm = np.concatenate((known, index_to_add)) + + ld_to_fm = gnomad_ld[index_to_fm][:, index_to_fm] + + snp_info_to_add = pd.DataFrame( + { + "variantId": ld_index.iloc[index_to_add, :]["variantId"], + "z": sumstat_imp_res["mu"][indices], + } + ) + GWAS_df = pd.concat([GWAS_df, snp_info_to_add], ignore_index=True) + z_to_fm = GWAS_df["z"].values + + N_imputed = len(indices) + else: + N_imputed = 0 + else: + N_imputed = 0 + + susie_output = SUSIE_inf.susie_inf( + z=z_to_fm, LD=ld_to_fm, L=L, est_tausq=susie_est_tausq, n=N_total + ) + + schema = StructType( + [ + StructField("variantId", StringType(), True), + StructField("z", DoubleType(), True), + ] + ) + variant_index = ( + session.spark.createDataFrame( + GWAS_df[["variantId", "z"]], + schema=schema, + ) + .withColumn( + "chromosome", f.split(f.col("variantId"), "_")[0].cast("string") + ) + .withColumn("position", f.split(f.col("variantId"), "_")[1].cast("int")) + ) + + study_locus = SusieFineMapperStep.susie_inf_to_studylocus( + susie_output=susie_output, + session=session, + studyId=studyId, + region=region, + variant_index=variant_index, + sum_pips=sum_pips, + ld_matrix=ld_to_fm, + lead_pval_threshold=lead_pval_threshold, + purity_mean_r2_threshold=purity_mean_r2_threshold, + purity_min_r2_threshold=purity_min_r2_threshold, + cs_lbf_thr=cs_lbf_thr, + ld_min_r2=ld_min_r2, + locusStart=locusStart, + locusEnd=locusEnd, + ) + + end_time = time.time() + + if study_locus is not None: + log_df = pd.DataFrame( + { + "studyId": studyId, + "region": region, + "N_gwas_before_dedupl": N_gwas_before_dedupl, + "N_gwas": N_gwas, + "N_ld": N_ld, + "N_overlap": N_after_merge, + "N_outliers": N_outliers, + "N_imputed": N_imputed, + "N_final_to_fm": len(ld_to_fm), + "elapsed_time": end_time - start_time, + "number_of_CS": study_locus.df.count(), + "error": "", + }, + index=[0], + ) + else: + log_df = pd.DataFrame( + { + "studyId": studyId, + "region": region, + "N_gwas_before_dedupl": N_gwas_before_dedupl, + "N_gwas": N_gwas, + "N_ld": N_ld, + "N_overlap": N_after_merge, + "N_outliers": N_outliers, + "N_imputed": N_imputed, + "N_final_to_fm": len(ld_to_fm), + "elapsed_time": end_time - start_time, + "number_of_CS": 0, + "error": "", + }, + index=[0], + ) + + return { + "study_locus": study_locus, + "log": log_df, + "LD": ld_to_fm, + "GWAS_df": GWAS_df, + } + + @staticmethod + def susie_finemapper_one_sl_row_gathered_boundaries( # noqa: C901 + session: Session, + study_locus_row: Row, + study_index: StudyIndex, + max_causal_snps: int = 10, + susie_est_tausq: bool = False, + run_carma: bool = False, + run_sumstat_imputation: bool = False, + carma_time_limit: int = 600, + carma_tau: float = 0.04, + imputed_r2_threshold: float = 0.9, + ld_score_threshold: float = 5, + sum_pips: float = 0.99, + lead_pval_threshold: float = 1e-5, + purity_mean_r2_threshold: float = 0, + purity_min_r2_threshold: float = 0.25, + cs_lbf_thr: float = 2, + ld_min_r2: float = 0.9, + log_output: str = "", + ) -> dict[str, Any] | None: + """Susie fine-mapper function that uses study-locus row with collected locus, chromosome and position as inputs. + + Args: + session (Session): Spark session + study_locus_row (Row): StudyLocus row with collected locus + study_index (StudyIndex): StudyIndex object + max_causal_snps (int): maximum number of causal variants + susie_est_tausq (bool): estimate tau squared, default is False + run_carma (bool): run CARMA, default is False + run_sumstat_imputation (bool): run summary statistics imputation, default is False + carma_time_limit (int): CARMA time limit, default is 600 seconds + carma_tau (float): CARMA tau, shrinkage parameter + imputed_r2_threshold (float): imputed R2 threshold, default is 0.8 + ld_score_threshold (float): LD score threshold ofr imputation, default is 4 + sum_pips (float): the expected sum of posterior probabilities in the locus, default is 0.99 (99% credible set) + lead_pval_threshold (float): p-value threshold for the lead variant from CS, default is 1e-5 + purity_mean_r2_threshold (float): thrshold for purity mean r2 qc metrics for filtering credible sets + purity_min_r2_threshold (float): thrshold for purity min r2 qc metrics for filtering credible sets + cs_lbf_thr (float): credible set logBF threshold for filtering credible sets, default is 2 + ld_min_r2 (float): Threshold to fillter CS by leads in high LD, default is 0.9 + log_output (str): path to the log output + + Returns: + dict[str, Any] | None: dictionary with study locus, number of GWAS variants, number of LD variants, number of variants after merge, number of outliers, number of imputed variants, number of variants to fine-map, or None + """ + # PLEASE DO NOT REMOVE THIS LINE + pd.DataFrame.iteritems = pd.DataFrame.items + + chromosome = study_locus_row["chromosome"] + studyId = study_locus_row["studyId"] + locusStart = study_locus_row["locusStart"] + locusEnd = study_locus_row["locusEnd"] + + study_index_df = study_index._df + study_index_df = study_index_df.filter(f.col("studyId") == studyId) + + # Desision tree - study index + if study_index_df.count() == 0: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region="", + error_mg="No study index found for the studyId", + path_out=log_output, + ) + logging.warning("No study index found for the studyId") + return None + + major_population = ( + study_index_df.select( + "studyId", + order_array_of_structs_by_field( + "ldPopulationStructure", "relativeSampleSize" + ).alias("ldPopulationStructure"), + ) + .withColumn( + "majorPopulation", + f.when( + f.col("ldPopulationStructure").isNotNull(), + LDAnnotator._get_major_population(f.col("ldPopulationStructure")), + ), + ) + .collect()[0]["majorPopulation"] + ) + + # This is a temporary solution + if major_population == "eas": + major_population = "csa" + + N_total = int(study_index_df.select("nSamples").collect()[0]["nSamples"]) + if N_total is None: + N_total = 100_000 + + locusStart = max(locusStart, 0) + + region = chromosome + ":" + str(int(locusStart)) + "-" + str(int(locusEnd)) + + # Desision tree - studyType + if study_index_df.select("studyType").collect()[0]["studyType"] not in [ + "gwas", + "pqtl", + ]: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="Study type is not GWAS or non gwas catalog pqtl", + path_out=log_output, + ) + logging.warning("Study type is not GWAS or non gwas catalog pqtl") + return None + + # Desision tree - ancestry + if major_population not in ["nfe", "csa", "afr"]: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="Major ancestry is not nfe, csa or afr", + path_out=log_output, + ) + logging.warning("Major ancestry is not nfe, csa or afr") + return None + + # Desision tree - hasSumstats + if not study_index_df.select("hasSumstats").collect()[0]["hasSumstats"]: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No sumstats found for the studyId", + path_out=log_output, + ) + logging.warning("No sumstats found for the studyId") + return None + + # Desision tree - qulityControls + keys_reasons = [ + "SMALL_NUMBER_OF_SNPS", + "FAILED_GC_LAMBDA_CHECK", + "FAILED_PZ_CHECK", + "FAILED_MEAN_BETA_CHECK", + "NO_OT_CURATION", + "SUMSTATS_NOT_AVAILABLE", + ] + + qc_mappings_dict = StudyIndex.get_QC_mappings() + invalid_reasons = [ + qc_mappings_dict[key] for key in keys_reasons if key in qc_mappings_dict + ] + + x_boolean = ( + study_index_df.withColumn( + "FailedQC", + f.arrays_overlap( + f.col("qualityControls"), + f.array([f.lit(reason) for reason in invalid_reasons]), + ), + ) + .select("FailedQC") + .collect()[0]["FailedQC"] + ) + if x_boolean: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="Quality control check failed for this study", + path_out=log_output, + ) + logging.warning("Quality control check failed for this study") + return None + + # Desision tree - analysisFlags + study_index_df = study_index_df.drop("FailedQC") + invalid_reasons = [ + "Multivariate analysis", + "ExWAS", + "Non-additive model", + "GxG", + "GxE", + "Case-case study", + ] + x_boolean = ( + study_index_df.withColumn( + "FailedQC", + f.arrays_overlap( + f.col("analysisFlags"), + f.array([f.lit(reason) for reason in invalid_reasons]), + ), + ) + .select("FailedQC") + .collect()[0]["FailedQC"] + ) + if x_boolean: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="Analysis Flags check failed for this study", + path_out=log_output, + ) + logging.warning("Analysis Flags check failed for this study") + return None + + schema = StudyLocus.get_schema() + gwas_df = session.spark.createDataFrame([study_locus_row], schema=schema) + exploded_df = gwas_df.select(f.explode("locus").alias("locus")) + + result_df = exploded_df.select( + "locus.variantId", "locus.beta", "locus.standardError" + ) + gwas_df = ( + result_df.withColumn("z", f.col("beta") / f.col("standardError")) + .withColumn( + "chromosome", f.split(f.col("variantId"), "_")[0].cast("string") + ) + .withColumn("position", f.split(f.col("variantId"), "_")[1].cast("int")) + .filter(f.col("chromosome") == chromosome) + .filter(f.col("position") >= int(locusStart)) + .filter(f.col("position") <= int(locusEnd)) + .filter(f.col("z").isNotNull()) + ) + + # Remove ALL duplicated variants from GWAS DataFrame - we don't know which is correct + variant_counts = gwas_df.groupBy("variantId").count() + unique_variants = variant_counts.filter(f.col("count") == 1) + gwas_df = gwas_df.join(unique_variants, on="variantId", how="left_semi") + + ld_index = LDMatrixInterface.get_locus_index_boundaries( + study_locus_row=study_locus_row, ancestry=major_population, session=session + ) + + # Remove ALL duplicated variants from ld_index DataFrame - we don't know which is correct + variant_counts = ld_index.groupBy("variantId").count() + unique_variants = variant_counts.filter(f.col("count") == 1) + ld_index = ld_index.join(unique_variants, on="variantId", how="left_semi").sort( + "idx" + ) + if "alleleOrder" not in ld_index.columns: + ld_index = ld_index.withColumn("alleleOrder", f.lit(1)) + + if not run_sumstat_imputation: + # Filtering out the variants that are not in the LD matrix, we don't need them + gwas_index = gwas_df.join( + ld_index.select("variantId", "idx", "alleleOrder"), on="variantId" + ).sort("idx") + gwas_df = gwas_index.select( + "variantId", + "z", + "chromosome", + "position", + "beta", + "StandardError", + ) + gwas_index = gwas_index.drop( + "z", "chromosome", "position", "beta", "StandardError" + ) + if gwas_index.rdd.isEmpty(): + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + gnomad_ld = LDMatrixInterface.get_numpy_matrix( + gwas_index, ancestry=major_population + ) + + # Module to remove NANs from the LD matrix + if sum(sum(np.isnan(gnomad_ld))) > 0: + gwas_index = gwas_index.toPandas() + + # First round of filtering out the variants with NANs + nan_count = 1 - (sum(np.isnan(gnomad_ld)) / len(gnomad_ld)) + indices = np.where(nan_count >= 0.98) + indices = indices[0] + gnomad_ld = gnomad_ld[indices][:, indices] + + gwas_index = gwas_index.iloc[indices, :] + + if len(gwas_index) == 0: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + + # Second round of filtering out the variants with NANs + nan_count = sum(np.isnan(gnomad_ld)) + indices = np.where(nan_count == 0) + indices = indices[0] + + gnomad_ld = gnomad_ld[indices][:, indices] + gwas_index = gwas_index.iloc[indices, :] + + if len(gwas_index) == 0: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + + gwas_index = session.spark.createDataFrame(gwas_index) + + else: + gwas_index = gwas_df.join( + ld_index.select("variantId", "idx", "alleleOrder"), on="variantId" + ).sort("idx") + if gwas_index.rdd.isEmpty(): + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + gwas_index = ld_index + gnomad_ld = LDMatrixInterface.get_numpy_matrix( + gwas_index, ancestry=major_population + ) + + # Module to remove NANs from the LD matrix + if sum(sum(np.isnan(gnomad_ld))) > 0: + gwas_index = gwas_index.toPandas() + + # First round of filtering out the variants with NANs + nan_count = 1 - (sum(np.isnan(gnomad_ld)) / len(gnomad_ld)) + indices = np.where(nan_count >= 0.98) + indices = indices[0] + gnomad_ld = gnomad_ld[indices][:, indices] + + gwas_index = gwas_index.iloc[indices, :] + + if len(gwas_index) == 0: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + + # Second round of filtering out the variants with NANs + nan_count = sum(np.isnan(gnomad_ld)) + indices = np.where(nan_count == 0) + indices = indices[0] + + gnomad_ld = gnomad_ld[indices][:, indices] + gwas_index = gwas_index.iloc[indices, :] + + if len(gwas_index) == 0: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="No overlapping variants in the LD Index", + path_out=log_output, + ) + logging.warning("No overlapping variants in the LD Index") + return None + + gwas_index = session.spark.createDataFrame(gwas_index) + + # sanity filters on LD matrix + np.fill_diagonal(gnomad_ld, 1) + gnomad_ld[gnomad_ld > 1] = 1 + gnomad_ld[gnomad_ld < -1] = -1 + upper_triangle = np.triu(gnomad_ld) + gnomad_ld = ( + upper_triangle + upper_triangle.T - np.diag(upper_triangle.diagonal()) + ) + np.fill_diagonal(gnomad_ld, 1) + + # Desision tree - number of variants + if gwas_index.count() < 100: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="Less than 100 variants after joining GWAS and LD index", + path_out=log_output, + ) + logging.warning("Less than 100 variants after joining GWAS and LD index") + return None + elif gwas_index.count() >= 15_000: + if log_output != "": + SusieFineMapperStep._empty_log_mg( + studyId=studyId, + region=region, + error_mg="More than 15000 variants after joining GWAS and LD index", + path_out=log_output, + ) + logging.warning("More than 15000 variants after joining GWAS and LD index") + return None + + out = SusieFineMapperStep.susie_finemapper_from_prepared_dataframes( + GWAS_df=gwas_df, + ld_index=gwas_index, + gnomad_ld=gnomad_ld, + L=max_causal_snps, + session=session, + studyId=studyId, + region=region, + locusStart=int(locusStart), + locusEnd=int(locusEnd), + susie_est_tausq=susie_est_tausq, + run_carma=run_carma, + run_sumstat_imputation=run_sumstat_imputation, + carma_time_limit=carma_time_limit, + carma_tau=carma_tau, + imputed_r2_threshold=imputed_r2_threshold, + ld_score_threshold=ld_score_threshold, + sum_pips=sum_pips, + lead_pval_threshold=lead_pval_threshold, + purity_mean_r2_threshold=purity_mean_r2_threshold, + purity_min_r2_threshold=purity_min_r2_threshold, + cs_lbf_thr=cs_lbf_thr, + ld_min_r2=ld_min_r2, + N_total=N_total, + ) + + return out diff --git a/src/gentropy/ukb_ppp_eur_sumstat_preprocess.py b/src/gentropy/ukb_ppp_eur_sumstat_preprocess.py new file mode 100644 index 000000000..8f0f3eef2 --- /dev/null +++ b/src/gentropy/ukb_ppp_eur_sumstat_preprocess.py @@ -0,0 +1,62 @@ +"""Step to run UKB PPP (EUR) data ingestion.""" + +from __future__ import annotations + +from gentropy.common.per_chromosome import ( + prepare_va, + process_summary_stats_per_chromosome, +) +from gentropy.common.session import Session +from gentropy.datasource.ukb_ppp_eur.study_index import UkbPppEurStudyIndex +from gentropy.datasource.ukb_ppp_eur.summary_stats import UkbPppEurSummaryStats + + +class UkbPppEurStep: + """UKB PPP (EUR) data ingestion and harmonisation.""" + + def __init__( + self, + session: Session, + raw_study_index_path_from_tsv: str, + raw_summary_stats_path: str, + variant_annotation_path: str, + tmp_variant_annotation_path: str, + study_index_output_path: str, + summary_stats_output_path: str, + ) -> None: + """Run UKB PPP (EUR) data ingestion and harmonisation step. + + Args: + session (Session): Session object. + raw_study_index_path_from_tsv (str): Input raw study index path. + raw_summary_stats_path (str): Input raw summary stats path. + variant_annotation_path (str): Input variant annotation dataset path. + tmp_variant_annotation_path (str): Temporary output path for variant annotation dataset. + study_index_output_path (str): Study index output path. + summary_stats_output_path (str): Summary stats output path. + """ + session.logger.info( + "Pre-compute the direct and flipped variant annotation dataset." + ) + prepare_va(session, variant_annotation_path, tmp_variant_annotation_path) + + session.logger.info("Process study index.") + ( + UkbPppEurStudyIndex.from_source( + spark=session.spark, + raw_study_index_path_from_tsv=raw_study_index_path_from_tsv, + raw_summary_stats_path=raw_summary_stats_path, + ) + .df.write.mode("overwrite") + .parquet(study_index_output_path) + ) + + session.logger.info("Process and harmonise summary stats.") + process_summary_stats_per_chromosome( + session, + UkbPppEurSummaryStats, + raw_summary_stats_path, + tmp_variant_annotation_path, + summary_stats_output_path, + study_index_output_path, + ) diff --git a/src/gentropy/v2g.py b/src/gentropy/v2g.py deleted file mode 100644 index e98348a01..000000000 --- a/src/gentropy/v2g.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Step to generate variant annotation dataset.""" -from __future__ import annotations - -from functools import reduce - -import pyspark.sql.functions as f - -from gentropy.common.Liftover import LiftOverSpark -from gentropy.common.session import Session -from gentropy.dataset.gene_index import GeneIndex -from gentropy.dataset.intervals import Intervals -from gentropy.dataset.v2g import V2G -from gentropy.dataset.variant_annotation import VariantAnnotation -from gentropy.dataset.variant_index import VariantIndex - - -class V2GStep: - """Variant-to-gene (V2G) step. - - This step aims to generate a dataset that contains multiple pieces of evidence supporting the functional association of specific variants with genes. Some of the evidence types include: - - 1. Chromatin interaction experiments, e.g. Promoter Capture Hi-C (PCHi-C). - 2. In silico functional predictions, e.g. Variant Effect Predictor (VEP) from Ensembl. - 3. Distance between the variant and each gene's canonical transcription start site (TSS). - - Attributes: - session (Session): Session object. - variant_index_path (str): Input variant index path. - variant_annotation_path (str): Input variant annotation path. - gene_index_path (str): Input gene index path. - vep_consequences_path (str): Input VEP consequences path. - liftover_chain_file_path (str): Path to GRCh37 to GRCh38 chain file. - liftover_max_length_difference: Maximum length difference for liftover. - max_distance (int): Maximum distance to consider. - approved_biotypes (list[str]): List of approved biotypes. - intervals (dict): Dictionary of interval sources. - v2g_path (str): Output V2G path. - """ - - def __init__( - self, - session: Session, - variant_index_path: str, - variant_annotation_path: str, - gene_index_path: str, - vep_consequences_path: str, - liftover_chain_file_path: str, - approved_biotypes: list[str], - interval_sources: dict[str, str], - v2g_path: str, - max_distance: int = 500_000, - liftover_max_length_difference: int = 100, - ) -> None: - """Run Variant-to-gene (V2G) step. - - Args: - session (Session): Session object. - variant_index_path (str): Input variant index path. - variant_annotation_path (str): Input variant annotation path. - gene_index_path (str): Input gene index path. - vep_consequences_path (str): Input VEP consequences path. - liftover_chain_file_path (str): Path to GRCh37 to GRCh38 chain file. - approved_biotypes (list[str]): List of approved biotypes. - interval_sources (dict[str, str]): Dictionary of interval sources. - v2g_path (str): Output V2G path. - max_distance (int): Maximum distance to consider. - liftover_max_length_difference (int): Maximum length difference for liftover. - """ - # Read - gene_index = GeneIndex.from_parquet(session, gene_index_path) - vi = VariantIndex.from_parquet(session, variant_index_path).persist() - va = VariantAnnotation.from_parquet(session, variant_annotation_path) - vep_consequences = session.spark.read.csv( - vep_consequences_path, sep="\t", header=True - ).select( - f.element_at(f.split("Accession", r"/"), -1).alias( - "variantFunctionalConsequenceId" - ), - f.col("Term").alias("label"), - f.col("v2g_score").cast("double").alias("score"), - ) - - # Transform - lift = LiftOverSpark( - # lift over variants to hg38 - liftover_chain_file_path, - liftover_max_length_difference, - ) - gene_index_filtered = gene_index.filter_by_biotypes( - # Filter gene index by approved biotypes to define V2G gene universe - list(approved_biotypes) - ) - va_slimmed = va.filter_by_variant_df( - # Variant annotation reduced to the variant index to define V2G variant universe - vi.df - ).persist() - intervals = Intervals( - _df=reduce( - lambda x, y: x.unionByName(y, allowMissingColumns=True), - # create interval instances by parsing each source - [ - Intervals.from_source( - session.spark, source_name, source_path, gene_index, lift - ).df - for source_name, source_path in interval_sources.items() - ], - ), - _schema=Intervals.get_schema(), - ) - v2g_datasets = [ - va_slimmed.get_distance_to_tss(gene_index_filtered, max_distance), - va_slimmed.get_most_severe_vep_v2g(vep_consequences, gene_index_filtered), - va_slimmed.get_plof_v2g(gene_index_filtered), - intervals.v2g(vi), - ] - v2g = V2G( - _df=reduce( - lambda x, y: x.unionByName(y, allowMissingColumns=True), - [dataset.df for dataset in v2g_datasets], - ).repartition("chromosome"), - _schema=V2G.get_schema(), - ) - - # Load - ( - v2g.df.write.partitionBy("chromosome") - .mode(session.write_mode) - .parquet(v2g_path) - ) diff --git a/src/gentropy/variant_annotation.py b/src/gentropy/variant_annotation.py deleted file mode 100644 index ff35c1915..000000000 --- a/src/gentropy/variant_annotation.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Step to generate variant annotation dataset.""" -from __future__ import annotations - -import hail as hl - -from gentropy.common.session import Session -from gentropy.datasource.gnomad.variants import GnomADVariants - - -class VariantAnnotationStep: - """Variant annotation step. - - Variant annotation step produces a dataset of the type `VariantAnnotation` derived from gnomADs `gnomad.genomes.vX.X.X.sites.ht` Hail's table. This dataset is used to validate variants and as a source of annotation. - """ - - def __init__(self, session: Session, variant_annotation_path: str) -> None: - """Run Variant Annotation step. - - Args: - session (Session): Session object. - variant_annotation_path (str): Variant annotation dataset path. - """ - # Initialise hail session. - hl.init(sc=session.spark.sparkContext, log="/dev/null") - # Run variant annotation. - variant_annotation = GnomADVariants().as_variant_annotation() - # Write data partitioned by chromosome and position. - ( - variant_annotation.df.write.mode(session.write_mode).parquet( - variant_annotation_path - ) - ) diff --git a/src/gentropy/variant_index.py b/src/gentropy/variant_index.py index bdf838ce2..9eac684b2 100644 --- a/src/gentropy/variant_index.py +++ b/src/gentropy/variant_index.py @@ -1,44 +1,131 @@ """Step to generate variant index dataset.""" + from __future__ import annotations +import math +from functools import reduce + +from pyspark.sql import functions as f + from gentropy.common.session import Session -from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.variant_annotation import VariantAnnotation from gentropy.dataset.variant_index import VariantIndex +from gentropy.datasource.ensembl.vep_parser import VariantEffectPredictorParser +from gentropy.datasource.open_targets.variants import OpenTargetsVariant class VariantIndexStep: - """Run variant index step to only variants in study-locus sets. + """Generate variant index based on a VEP output in json format. - Using a `VariantAnnotation` dataset as a reference, this step creates and writes a dataset of the type `VariantIndex` that includes only variants that have disease-association data with a reduced set of annotations. + The variant index is a dataset that contains variant annotations extracted from VEP output. It is expected that all variants in the VEP output are present in the variant index. + There's an option to provide extra variant annotations to be added to the variant index eg. allele frequencies from GnomAD. """ def __init__( self: VariantIndexStep, session: Session, - variant_annotation_path: str, - credible_set_path: str, + vep_output_json_path: str, variant_index_path: str, + hash_threshold: int, + gnomad_variant_annotations_path: str | None = None, ) -> None: """Run VariantIndex step. Args: session (Session): Session object. - variant_annotation_path (str): Variant annotation dataset path. - credible_set_path (str): Credible set dataset path. - variant_index_path (str): Variant index dataset path. + vep_output_json_path (str): Variant effect predictor output path (in json format). + variant_index_path (str): Variant index dataset path to save resulting data. + hash_threshold (int): Hash threshold for variant identifier length. + gnomad_variant_annotations_path (str | None): Path to extra variant annotation dataset. """ - # Extract - va = VariantAnnotation.from_parquet(session, variant_annotation_path) - credible_set = StudyLocus.from_parquet( - session, credible_set_path, recursiveFileLookup=True + # Extract variant annotations from VEP output: + variant_index = VariantEffectPredictorParser.extract_variant_index_from_vep( + session.spark, vep_output_json_path, hash_threshold ) - # Transform - vi = VariantIndex.from_variant_annotation(va, credible_set) + # Process variant annotations if provided: + if gnomad_variant_annotations_path: + # Read variant annotations from parquet: + annotations = VariantIndex.from_parquet( + session=session, + path=gnomad_variant_annotations_path, + recursiveFileLookup=True, + id_threshold=hash_threshold, + ) + + # Update file with extra annotations: + variant_index = variant_index.add_annotation(annotations) ( - vi.df.write.partitionBy("chromosome") - .mode(session.write_mode) + variant_index.df.repartitionByRange("chromosome", "position") + .sortWithinPartitions("chromosome", "position") + .write.mode(session.write_mode) .parquet(variant_index_path) ) + + +class ConvertToVcfStep: + """Convert dataset with variant annotation to VCF step. + + This step converts in-house data source formats to VCF like format. + + NOTE! Due to the csv DataSourceWriter limitations we can not save the column name + `#CHROM` as in vcf file. The column is replaced with `CHROM`. + """ + + def __init__( + self, + session: Session, + source_paths: list[str], + source_formats: list[str], + output_path: str, + partition_size: int, + ) -> None: + """Initialize step. + + Args: + session (Session): Session object. + source_paths (list[str]): Input dataset path. + source_formats (list[str]): Format of the input dataset. + output_path (str): Output VCF file path. + partition_size (int): Approximate number of variants in each output partition. + """ + assert len(source_formats) == len( + source_paths + ), "Must provide format for each source path." + + # Load + raw_variants = [ + session.load_data(p, f) + for p, f in zip(source_paths, source_formats, strict=True) + ] + + # Extract + processed_variants = [ + OpenTargetsVariant.as_vcf_df(session, df) for df in raw_variants + ] + + # Merge + merged_variants = reduce( + lambda x, y: x.unionByName(y), processed_variants + ).drop_duplicates(["#CHROM", "POS", "REF", "ALT"]) + + variant_count = merged_variants.count() + n_partitions = int(math.ceil(variant_count / partition_size)) + partitioned_variants = ( + merged_variants.repartitionByRange( + n_partitions, f.col("#CHROM"), f.col("POS") + ) + .sortWithinPartitions(f.col("#CHROM").asc(), f.col("POS").asc()) + # Due to the large number of partitions ensure we do not lose the partitions before saving them + .persist() + # FIXME the #CHROM column is saved as "#CHROM" by pyspark which fails under VEP, + # The native solution would be to implement the datasource with proper writer + # see https://docs.databricks.com/en/pyspark/datasources.html. + # Proposed solution will require adding # at the start of the first line of + # vcf before processing it in orchestration. + .withColumnRenamed("#CHROM", "CHROM") + ) + # Write + partitioned_variants.write.mode(session.write_mode).option("sep", "\t").option( + "quote", "" + ).option("quoteAll", False).option("header", True).csv(output_path) diff --git a/src/gentropy/window_based_clumping.py b/src/gentropy/window_based_clumping.py index fcc680ef7..e605c4564 100644 --- a/src/gentropy/window_based_clumping.py +++ b/src/gentropy/window_based_clumping.py @@ -1,7 +1,9 @@ """Step to run window based clumping on summary statistics datasts.""" + from __future__ import annotations from gentropy.common.session import Session +from gentropy.config import WindowBasedClumpingStepConfig from gentropy.dataset.summary_statistics import SummaryStatistics @@ -13,8 +15,12 @@ def __init__( session: Session, summary_statistics_input_path: str, study_locus_output_path: str, - inclusion_list_path: str | None = None, - locus_collect_distance: int | None = None, + distance: int = WindowBasedClumpingStepConfig().distance, + gwas_significance: float = WindowBasedClumpingStepConfig().gwas_significance, + collect_locus: bool = WindowBasedClumpingStepConfig().collect_locus, + collect_locus_distance: int = WindowBasedClumpingStepConfig().collect_locus_distance, + inclusion_list_path: str + | None = WindowBasedClumpingStepConfig().inclusion_list_path, ) -> None: """Run window-based clumping step. @@ -22,8 +28,13 @@ def __init__( session (Session): Session object. summary_statistics_input_path (str): Path to the harmonized summary statistics dataset. study_locus_output_path (str): Output path for the resulting study locus dataset. + distance (int): Distance, within which tagging variants are collected around the semi-index. Optional. + gwas_significance (float): GWAS significance threshold. Defaults to 5e-8. + collect_locus (bool): Whether to collect locus around semi-indices. Optional. + collect_locus_distance (int): Distance, within which tagging variants are collected around the semi-index. Optional. inclusion_list_path (str | None): Path to the inclusion list (list of white-listed study identifier). Optional. - locus_collect_distance (int | None): Distance, within which tagging variants are collected around the semi-index. Optional. + + Check WindowBasedClumpingStepConfig object for default values. """ # If inclusion list path is provided, only these studies will be read: if inclusion_list_path: @@ -35,16 +46,22 @@ def __init__( # If no inclusion list is provided, read all summary stats in folder: study_ids_to_ingest = [summary_statistics_input_path] - ( - SummaryStatistics.from_parquet( - session, - study_ids_to_ingest, - recursiveFileLookup=True, - ) - .coalesce(4000) - # Applying window based clumping: - .window_based_clumping(locus_collect_distance=locus_collect_distance) - # Save resulting study locus dataset: - .df.write.mode(session.write_mode) - .parquet(study_locus_output_path) + ss = SummaryStatistics.from_parquet( + session, + study_ids_to_ingest, + recursiveFileLookup=True, + ) + + # Clumping: + study_locus = ss.window_based_clumping( + distance=distance, gwas_significance=gwas_significance ) + + # Optional locus collection: + if collect_locus: + # Collecting locus around semi-indices: + study_locus = study_locus.annotate_locus_statistics( + ss, collect_locus_distance=collect_locus_distance + ) + + study_locus.df.write.mode(session.write_mode).parquet(study_locus_output_path) diff --git a/src/vep/Dockerfile b/src/vep/Dockerfile new file mode 100644 index 000000000..ade55e3da --- /dev/null +++ b/src/vep/Dockerfile @@ -0,0 +1,31 @@ +FROM ensemblorg/ensembl-vep:release_111.0 + +USER root + +RUN apt-get update && apt-get -y install \ + wget \ + libncurses5-dev \ + libncursesw5-dev \ + libbz2-dev \ + liblzma-dev \ + sqlite3 \ + libsqlite3-dev \ + cpanminus \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN cpanm DBD::SQLite + +RUN wget --progress=dot:giga https://github.com/samtools/samtools/releases/download/1.7/samtools-1.7.tar.bz2 && \ + tar xjvf samtools-1.7.tar.bz2 && \ + cd samtools-1.7 && \ + make && \ + make install + +RUN wget --progress=dot:giga https://personal.broadinstitute.org/konradk/loftee_data/GRCh38/loftee.sql.gz --directory-prefix=/opt/vep/ && \ + gunzip /opt/vep/loftee.sql.gz + +# Make sure the mounting points exist: +RUN mkdir -p /mnt/disks/share/cache && \ + mkdir -p /mnt/disks/share/input && \ + mkdir -p /mnt/disks/share/output diff --git a/tests/airflow/test_dag.py b/tests/airflow/test_dag.py deleted file mode 100644 index 8676d70f4..000000000 --- a/tests/airflow/test_dag.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Check for airflow import errors. Inspiration from https://garystafford.medium.com/devops-for-dataops-building-a-ci-cd-pipeline-for-apache-airflow-dags-975e4a622f83.""" -from __future__ import annotations - -import pytest -from airflow.models import DagBag - - -@pytest.fixture(params=["./src/airflow/dags"]) -def dag_bag(request: pytest.FixtureRequest) -> DagBag: - """Return a DAG bag for testing.""" - return DagBag(dag_folder=request.param, include_examples=False) - - -def test_no_import_errors(dag_bag: DagBag) -> None: - """Test for import errors.""" - assert ( - not dag_bag.import_errors - ), f"DAG import failures. Errors: {dag_bag.import_errors}" - - -def test_requires_tags(dag_bag: DagBag) -> None: - """Tags should be defined for each DAG.""" - for _, dag in dag_bag.dags.items(): - assert dag.tags - - -def test_owner_len_greater_than_five(dag_bag: DagBag) -> None: - """Owner should be defined for each DAG and be longer than 5 characters.""" - for _, dag in dag_bag.dags.items(): - assert len(dag.owner) > 5 - - -def test_desc_len_greater_than_fifteen(dag_bag: DagBag) -> None: - """Description should be defined for each DAG and be longer than 30 characters.""" - for _, dag in dag_bag.dags.items(): - if isinstance(dag.description, str): - assert len(dag.description) > 30 - - -def test_owner_not_airflow(dag_bag: DagBag) -> None: - """Owner should not be 'airflow'.""" - for _, dag in dag_bag.dags.items(): - assert str.lower(dag.owner) != "airflow" - - -def test_three_or_less_retries(dag_bag: DagBag) -> None: - """Retries should be 3 or less.""" - for _, dag in dag_bag.dags.items(): - assert dag.default_args["retries"] <= 3 diff --git a/tests/gentropy/common/test_schema_methods.py b/tests/gentropy/common/test_schema_methods.py new file mode 100644 index 000000000..8ed1342b5 --- /dev/null +++ b/tests/gentropy/common/test_schema_methods.py @@ -0,0 +1,303 @@ +"""Tests methods dealing with schema comparison.""" + +from __future__ import annotations + +from collections import defaultdict + +from pyspark.sql.types import ( + ArrayType, + IntegerType, + StringType, + StructField, + StructType, +) + +from gentropy.common.schemas import ( + compare_array_schemas, + compare_struct_schemas, +) + + +class TestSchemaComparisonMethods: + """Class for testing schema comparison methods.""" + + STRUCT_FIELD_STRING = StructField("a", StringType(), True) + STRUCT_FIELD_STRING_MANDATORY = StructField("a", StringType(), False) + STRUCT_FIELD_INTEGER = StructField("b", IntegerType(), True) + STRUCT_FIELD_WRONGTYPE = StructField("a", IntegerType(), True) + + def test_struct_validation_return_type(self: TestSchemaComparisonMethods) -> None: + """Test successful validation of StructType.""" + observed = StructType([self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER]) + expected = StructType([self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER]) + + discrepancy = compare_struct_schemas(observed, expected) + assert isinstance(discrepancy, defaultdict) + + def test_struct_validation_success(self: TestSchemaComparisonMethods) -> None: + """Test successful validation of StructType.""" + observed = StructType([self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER]) + expected = StructType([self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER]) + + discrepancy = compare_struct_schemas(observed, expected) + assert not discrepancy + + def test_struct_validation_non_matching_type( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of StructType.""" + observed = StructType([self.STRUCT_FIELD_STRING]) + expected = StructType([self.STRUCT_FIELD_WRONGTYPE]) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "columns_with_non_matching_type" in discrepancy + + def test_struct_validation_missing_mandatory( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of StructType.""" + observed = StructType([self.STRUCT_FIELD_INTEGER]) + expected = StructType( + [self.STRUCT_FIELD_STRING_MANDATORY, self.STRUCT_FIELD_INTEGER] + ) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "missing_mandatory_columns" in discrepancy + + # Test that the right column is flagged as missing: + assert ( + self.STRUCT_FIELD_STRING_MANDATORY.name + in discrepancy["missing_mandatory_columns"] + ) + + def test_struct_validation_unexpected_column( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of StructType.""" + observed = StructType( + [self.STRUCT_FIELD_STRING_MANDATORY, self.STRUCT_FIELD_INTEGER] + ) + expected = StructType([self.STRUCT_FIELD_STRING_MANDATORY]) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "unexpected_columns" in discrepancy + + # Test that the right column is flagged as unexpected: + assert self.STRUCT_FIELD_INTEGER.name in discrepancy["unexpected_columns"] + + def test_struct_validation_duplicated_columns( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of StructType.""" + observed = StructType( + [ + self.STRUCT_FIELD_STRING, + self.STRUCT_FIELD_STRING, + self.STRUCT_FIELD_INTEGER, + ] + ) + expected = StructType([self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER]) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "duplicated_columns" in discrepancy + + # Test that the right column is flagged as duplicated: + assert self.STRUCT_FIELD_STRING.name in discrepancy["duplicated_columns"] + + def test_struct_validation_success_nested_struct( + self: TestSchemaComparisonMethods, + ) -> None: + """Test successful validation of nested StructType.""" + nested_struct = StructType( + [self.STRUCT_FIELD_STRING, self.STRUCT_FIELD_INTEGER] + ) + + observed = StructType([StructField("c", nested_struct)]) + expected = StructType([StructField("c", nested_struct)]) + + discrepancy = compare_struct_schemas(observed, expected) + assert not discrepancy + + def test_struct_validation_non_matching_type_nested_struct( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of nested StructType.""" + nested_struct = StructType([self.STRUCT_FIELD_STRING]) + + observed = StructType([StructField("c", nested_struct)]) + expected = StructType( + [StructField("c", StructType([self.STRUCT_FIELD_WRONGTYPE]))] + ) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "columns_with_non_matching_type" in discrepancy + + def test_array_validation_success(self: TestSchemaComparisonMethods) -> None: + """Test successful validation of ArrayType.""" + observed = ArrayType(StringType()) + expected = ArrayType(StringType()) + + discrepancy = compare_array_schemas(observed, expected) + assert not discrepancy + + def test_array_validation_non_matching_type( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of ArrayType.""" + observed = ArrayType(StringType()) + expected = ArrayType(IntegerType()) + + discrepancy = compare_array_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "columns_with_non_matching_type" in discrepancy + + def test_array_validation_nested_array(self: TestSchemaComparisonMethods) -> None: + """Test successful validation of nested ArrayType.""" + nested_array = ArrayType(StringType()) + + observed = ArrayType(nested_array) + expected = ArrayType(nested_array) + + discrepancy = compare_array_schemas(observed, expected) + assert not discrepancy + + def test_array_validation_non_matching_type_nested_array( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of nested ArrayType.""" + observed = ArrayType(ArrayType(StringType())) + expected = ArrayType(ArrayType(IntegerType())) + + discrepancy = compare_array_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "columns_with_non_matching_type" in discrepancy + + def test_struct_validation_success_nested_with_array( + self: TestSchemaComparisonMethods, + ) -> None: + """Test successful validation of nested StructType with ArrayType.""" + nested_array = StructField("a", ArrayType(StringType()), True) + nested_struct = StructType([self.STRUCT_FIELD_STRING, nested_array]) + + observed = StructType([StructField("c", nested_struct, True)]) + expected = StructType([StructField("c", nested_struct, True)]) + + discrepancy = compare_struct_schemas(observed, expected) + assert not discrepancy + + def test_struct_validation_non_matching_type_nested_with_array( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of nested StructType with ArrayType.""" + nested_array = StructField("a", ArrayType(StringType()), True) + nested_array_wrong_type = StructField("a", ArrayType(IntegerType()), True) + nested_struct = StructType([self.STRUCT_FIELD_STRING, nested_array]) + nested_struct_wrong_type = StructType( + [self.STRUCT_FIELD_STRING, nested_array_wrong_type] + ) + observed = StructType([StructField("c", nested_struct, True)]) + expected = StructType([StructField("c", nested_struct_wrong_type, True)]) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test that the discrepancy is in the field name: + assert "columns_with_non_matching_type" in discrepancy + + def test_struct_validation_failing_with_multiple_reasons( + self: TestSchemaComparisonMethods, + ) -> None: + """Test unsuccessful validation of StructType with multiple issues.""" + observed = StructType( + [ + StructField( + "a", + ArrayType( + ArrayType( + StructType( + [ + StructField("a", IntegerType(), False), + StructField("c", StringType(), True), + StructField("c", StringType(), True), + ] + ), + False, + ), + False, + ), + False, + ), + ] + ) + + expected = StructType( + [ + StructField( + "a", + ArrayType( + ArrayType( + StructType( + [ + StructField("b", IntegerType(), False), + StructField("c", StringType(), True), + StructField("d", StringType(), True), + ] + ), + False, + ), + False, + ), + False, + ), + ] + ) + + discrepancy = compare_struct_schemas(observed, expected) + + # Test there's a discrepancy: + assert discrepancy + + # Test if the returned list of discrepancies is correct: + assert discrepancy == defaultdict( + list, + { + "duplicated_columns": ["a[][].c"], + "missing_mandatory_columns": ["a[][].b"], + "unexpected_columns": ["a[][].a"], + }, + ) diff --git a/tests/gentropy/common/test_session.py b/tests/gentropy/common/test_session.py index b7d0156d2..6afc640ab 100644 --- a/tests/gentropy/common/test_session.py +++ b/tests/gentropy/common/test_session.py @@ -1,4 +1,5 @@ -"""Tests GWAS Catalog study splitter.""" +"""Tests Gentropy session.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/tests/gentropy/common/test_spark_helpers.py b/tests/gentropy/common/test_spark_helpers.py new file mode 100644 index 000000000..bd872ae90 --- /dev/null +++ b/tests/gentropy/common/test_spark_helpers.py @@ -0,0 +1,155 @@ +"""Tests spark-helper functions.""" + +from __future__ import annotations + +import pytest +from pyspark.sql import Column, SparkSession +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.common.spark_helpers import ( + enforce_schema, + order_array_of_structs_by_field, +) + + +def test_order_array_of_structs_by_field(spark: SparkSession) -> None: + """Test order_array_of_structs_by_field.""" + data = [ + # Values are the same: + ("a", 12), + ("a", 12), + # First value bigger: + ("b", 12), + ("b", 1), + # Second value bigger: + ("c", 1), + ("c", 12), + # First value is null: + ("d", None), + ("d", 12), + # Second value is null: + ("e", 12), + ("e", None), + # Both values are null: + ("f", None), + ("f", None), + ] + + processed_data = ( + spark.createDataFrame(data, ["group", "value"]) + .groupBy("group") + .agg( + f.collect_list(f.struct(f.col("value").alias("value"))).alias("values"), + f.max(f.col("value")).alias("max_value"), + ) + .withColumn("sorted_values", order_array_of_structs_by_field("values", "value")) + .withColumn("sorted_max", f.col("sorted_values")[0].getField("value")) + .select("max_value", "sorted_max") + .collect() + ) + + for row in processed_data: + assert row["max_value"] == row["sorted_max"] + + +class TestEnforceSchema: + """Test enforce schema.""" + + EXPECTED_SCHEMA = t.StructType( + [ + t.StructField("field1", t.StringType(), True), + t.StructField("field2", t.StringType(), True), + t.StructField("field3", t.StringType(), True), + t.StructField("field4", t.FloatType(), True), + ] + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def good_schema_test() -> Column: + """Create a struct with the expected schema.""" + return f.struct( + f.lit("test1").alias("field1"), + f.lit("test2").alias("field2"), + f.lit("test3").alias("field3"), + f.lit(2.0).alias("field4"), + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def missing_column_test() -> Column: + """Create a struct with a missing column.""" + return f.struct( + f.lit("test1").alias("field1"), + f.lit("test3").alias("field3"), + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def wrong_order_test() -> Column: + """Create a struct with the wrong order.""" + return f.struct( + f.lit("test2").alias("field2"), + f.lit("test1").alias("field1"), + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def extra_column_test() -> Column: + """Create a struct with an extra column.""" + return f.struct( + f.lit("test2").alias("field2"), + f.lit("test1").alias("field1"), + f.lit("test5").alias("field5"), + f.lit(12.1).alias("field6"), + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def wrong_type_test_1() -> Column: + """Create a struct with the wrong type.""" + return f.struct( + f.lit("test2").alias("field2"), + f.lit("test1").alias("field1"), + f.lit(5).cast(t.IntegerType()).alias("field3"), + ) + + @staticmethod + @enforce_schema(expected_schema=EXPECTED_SCHEMA) + def wrong_type_test_2() -> Column: + """Create a struct with the wrong type.""" + return f.struct( + f.lit("test2").alias("field2"), + f.lit("test1").alias("field1"), + f.lit("test").alias("field4"), + ) + + @pytest.fixture(autouse=True) + def _setup(self: TestEnforceSchema, spark: SparkSession) -> None: + """Setup fixture.""" + self.test_dataset = ( + spark.createDataFrame( + [("a",)], + ["label"], + ) + .withColumn("struct_1", self.good_schema_test()) + .withColumn("struct_2", self.missing_column_test()) + .withColumn("struct_3", self.wrong_order_test()) + .withColumn("struct_4", self.extra_column_test()) + .withColumn("struct_5", self.wrong_type_test_1()) + .withColumn("struct_6", self.wrong_type_test_2()) + ) + + def test_schema_consistency(self: TestEnforceSchema) -> None: + """Test enforce schema consistency.""" + # Looping through all the struct column and test if the schema is consistent + for column in [ + "struct_1", + "struct_2", + "struct_3", + "struct_4", + "struct_5", + "struct_6", + ]: + assert self.test_dataset.schema[column].dataType == self.EXPECTED_SCHEMA diff --git a/tests/gentropy/common/test_version_engine.py b/tests/gentropy/common/test_version_engine.py new file mode 100644 index 000000000..2ee2e12ce --- /dev/null +++ b/tests/gentropy/common/test_version_engine.py @@ -0,0 +1,115 @@ +"""Tests version engine class.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from gentropy.common.version_engine import GnomADVersionSeeker, VersionEngine + + +@pytest.mark.parametrize( + ["text", "version"], + [ + pytest.param( + "gcp-public-data--gnomad/release/2.1.1/vcf/genomes/gnomad.genomes.r2.1.1.sites.7.vcf", + "2.1.1", + id="GnomAD v2.1.1", + ), + pytest.param( + "/gcp-public-data--gnomad/release/3.0/vcf/genomes/gnomad.genomes.r3.0.sites.chr6.vcf", + "3.0", + id="GnomAD v3.0", + ), + pytest.param( + "gs://gcp-public-data--gnomad/release/3.1.1/vcf/genomes/gnomad.genomes.v3.1.1.sites.chr1.vcf", + "3.1.1", + id="GnomAD v3.1.1", + ), + pytest.param( + "gs://gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chrY.vcf", + "3.1.2", + id="GnomAD v3.1.2", + ), + pytest.param( + "gsa://gcp-public-data--gnomad/release/4.0/vcf/genomes/gnomad.genomes.v4.0.sites.chrY.vcf", + "4.0", + id="GnomAD v4.0", + ), + pytest.param( + "gs://gcp-public-data--gnomad/release/4.1/vcf/genomes/gnomad.genomes.v4.1.sites.chr18.vcf", + "4.1", + id="GnomAD v4.1", + ), + pytest.param( + "/some/path/to/the/version/r20.111.44", + "20.111.44", + id="Extreme version number", + ), + ], +) +def test_extracting_version_with_gnomad_seeker(text: str, version: str) -> None: + """Test gnomad version extraction with GnomADVersionSeeker.""" + version_seeker = GnomADVersionSeeker().seek_version + assert version_seeker(text) == version + + +def test_not_registered_datasource_raises_error() -> None: + """Test that unknown datasource raises error.""" + with pytest.raises(ValueError) as e: + VersionEngine("ClinVar").seek("some/path/to/the/version/v20.111.44") # type: ignore + assert e.value.args[0].startswith("Invalid datasource ClinVar") + + +def test_extracting_version_when_no_version_is_found() -> None: + """Test that unknown datasource raises error.""" + with pytest.raises(ValueError) as e: + VersionEngine("ClinVar").seek("some/path/without/version") # type: ignore + assert e.value.args[0].startswith( + "Can not find version in some/path/without/version" + ) + + +def test_non_string_path_raises_error() -> None: + """Test that non-string path raises error.""" + with pytest.raises(TypeError) as e: + VersionEngine("gnomad").seek(123) # type: ignore + assert e.value.args[0].startswith("Can not infer version from 123") + + +@pytest.mark.parametrize( + ["text", "version"], + [ + pytest.param(Path("some/file/path/v3.1.1"), "3.1.1", id="Path object"), + pytest.param("s3://some/file/path/v3.1.1", "3.1.1", id="S3 protocol"), + pytest.param("gs://some/file/path/v3.1.1", "3.1.1", id="GS protocol"), + ], +) +def test_extracting_version_with_version_engine(text: str | Path, version: str) -> None: + """Check if concrete data types and file protocols does not return an error while passed to VersionEngine.""" + assert VersionEngine("gnomad").seek(text) == version + + +@pytest.mark.parametrize( + ["input_path", "output_path", "expected_output"], + [ + pytest.param( + "input/v20.111.44", "output", "output/20.111.44", id="Append version" + ), + pytest.param( + "input/1.0.0", + "output/1.0.0", + "output/1.0.0", + id="Do not append version, already present", + ), + pytest.param( + Path("input/1.0.0"), Path("output/"), "output/1.0.0", id="Path objects" + ), + ], +) +def test_appending_version_to_path( + input_path: Path | str, output_path: Path | str, expected_output: str +) -> None: + """Test that the version is ammended at the end of the output path.""" + VersionEngine("gnomad").amend_version(input_path, output_path) == expected_output diff --git a/tests/gentropy/conftest.py b/tests/gentropy/conftest.py index f3dc197f9..10298205d 100644 --- a/tests/gentropy/conftest.py +++ b/tests/gentropy/conftest.py @@ -1,4 +1,5 @@ """Unit test configuration.""" + from __future__ import annotations from pathlib import Path @@ -8,8 +9,11 @@ import numpy as np import pandas as pd import pytest +from pyspark.sql import DataFrame, SparkSession + from gentropy.common.Liftover import LiftOverSpark from gentropy.common.session import Session +from gentropy.dataset.biosample_index import BiosampleIndex from gentropy.dataset.colocalisation import Colocalisation from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.intervals import Intervals @@ -21,13 +25,11 @@ from gentropy.dataset.study_locus import StudyLocus from gentropy.dataset.study_locus_overlap import StudyLocusOverlap from gentropy.dataset.summary_statistics import SummaryStatistics -from gentropy.dataset.v2g import V2G -from gentropy.dataset.variant_annotation import VariantAnnotation from gentropy.dataset.variant_index import VariantIndex +from gentropy.datasource.eqtl_catalogue.finemapping import EqtlCatalogueFinemapping +from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex from gentropy.datasource.gwas_catalog.associations import StudyLocusGWASCatalog from gentropy.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog -from pyspark.sql import DataFrame, SparkSession - from utils.spark import get_spark_testing_conf @@ -79,8 +81,12 @@ def mock_colocalisation(spark: SparkSession) -> Colocalisation: .withColumnSpec("h2", percentNulls=0.1) .withColumnSpec("h3", percentNulls=0.1) .withColumnSpec("h4", percentNulls=0.1) - .withColumnSpec("log2h4h3", percentNulls=0.1) .withColumnSpec("clpp", percentNulls=0.1) + .withColumnSpec( + "colocalisationMethod", + percentNulls=0.0, + values=["COLOC", "eCAVIAR"], + ) ) return Colocalisation(_df=data_spec.build(), _schema=coloc_schema) @@ -181,13 +187,13 @@ def mock_study_locus_data(spark: SparkSession) -> DataFrame: ) .withSchema(sl_schema) .withColumnSpec("chromosome", percentNulls=0.1) - .withColumnSpec("position", percentNulls=0.1) + .withColumnSpec("position", minValue=100, percentNulls=0.1) .withColumnSpec("beta", percentNulls=0.1) .withColumnSpec("effectAlleleFrequencyFromSource", percentNulls=0.1) .withColumnSpec("standardError", percentNulls=0.1) .withColumnSpec("subStudyDescription", percentNulls=0.1) .withColumnSpec("pValueMantissa", minValue=1, percentNulls=0.1) - .withColumnSpec("pValueExponent", minValue=1, percentNulls=0.1) + .withColumnSpec("pValueExponent", minValue=-10, percentNulls=0.1) .withColumnSpec( "qualityControls", expr="array(cast(rand() as string))", @@ -243,70 +249,6 @@ def mock_intervals(spark: SparkSession) -> Intervals: return Intervals(_df=data_spec.build(), _schema=interval_schema) -@pytest.fixture() -def mock_v2g(spark: SparkSession) -> V2G: - """Mock v2g dataset.""" - v2g_schema = V2G.get_schema() - - data_spec = ( - dg.DataGenerator( - spark, - rows=400, - partitions=4, - randomSeedMethod="hash_fieldname", - ) - .withSchema(v2g_schema) - .withColumnSpec("distance", percentNulls=0.1) - .withColumnSpec("resourceScore", percentNulls=0.1) - .withColumnSpec("score", percentNulls=0.1) - .withColumnSpec("pmid", percentNulls=0.1) - .withColumnSpec("biofeature", percentNulls=0.1) - .withColumnSpec("variantFunctionalConsequenceId", percentNulls=0.1) - .withColumnSpec("isHighQualityPlof", percentNulls=0.1) - ) - - return V2G(_df=data_spec.build(), _schema=v2g_schema) - - -@pytest.fixture() -def mock_variant_annotation(spark: SparkSession) -> VariantAnnotation: - """Mock variant annotation.""" - va_schema = VariantAnnotation.get_schema() - - data_spec = ( - dg.DataGenerator( - spark, - rows=400, - partitions=4, - randomSeedMethod="hash_fieldname", - ) - .withSchema(va_schema) - .withColumnSpec("alleleType", percentNulls=0.1) - .withColumnSpec("chromosomeB37", percentNulls=0.1) - .withColumnSpec("positionB37", percentNulls=0.1) - # Nested column handling workaround - # https://github.com/databrickslabs/dbldatagen/issues/135 - # It's a workaround for nested column handling in dbldatagen. - .withColumnSpec( - "alleleFrequencies", - expr='array(named_struct("alleleFrequency", rand(), "populationName", cast(rand() as string)))', - percentNulls=0.1, - ) - .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) - .withColumnSpec( - "vep", - expr='named_struct("mostSevereConsequence", cast(rand() as string), "transcriptConsequences", array(named_struct("aminoAcids", cast(rand() as string), "consequenceTerms", array(cast(rand() as string)), "geneId", cast(rand() as string), "lof", cast(rand() as string))))', - percentNulls=0.1, - ) - .withColumnSpec( - "inSilicoPredictors", - expr='named_struct("cadd", named_struct("phred", cast(rand() as float), "raw_score", cast(rand() as float)), "revelMax", cast(rand() as double), "spliceaiDsMax", cast(rand() as float), "pangolinLargestDs", cast(rand() as double), "phylop", cast(rand() as double), "polyphenMax", cast(rand() as double), "siftMax", cast(rand() as double))', - percentNulls=0.1, - ) - ) - return VariantAnnotation(_df=data_spec.build(), _schema=va_schema) - - @pytest.fixture() def mock_variant_index(spark: SparkSession) -> VariantIndex: """Mock variant index.""" @@ -320,23 +262,70 @@ def mock_variant_index(spark: SparkSession) -> VariantIndex: randomSeedMethod="hash_fieldname", ) .withSchema(vi_schema) - .withColumnSpec("chromosomeB37", percentNulls=0.1) - .withColumnSpec("positionB37", percentNulls=0.1) - .withColumnSpec("mostSevereConsequence", percentNulls=0.1) + .withColumnSpec("mostSevereConsequenceId", percentNulls=0.1) # Nested column handling workaround # https://github.com/databrickslabs/dbldatagen/issues/135 # It's a workaround for nested column handling in dbldatagen. + .withColumnSpec( + "inSilicoPredictors", + expr=""" + array( + named_struct( + "method", cast(rand() as string), + "assessment", cast(rand() as string), + "score", rand(), + "assessmentFlag", cast(rand() as string), + "targetId", cast(rand() as string) + ) + ) + """, + percentNulls=0.1, + ) .withColumnSpec( "alleleFrequencies", expr='array(named_struct("alleleFrequency", rand(), "populationName", cast(rand() as string)))', percentNulls=0.1, ) + .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) .withColumnSpec( - "inSilicoPredictors", - expr='named_struct("cadd", named_struct("phred", cast(rand() as float), "raw_score", cast(rand() as float)), "revelMax", cast(rand() as double), "spliceaiDsMax", cast(rand() as float), "pangolinLargestDs", cast(rand() as double), "phylop", cast(rand() as double), "polyphenMax", cast(rand() as double), "siftMax", cast(rand() as double))', + "transcriptConsequences", + expr=""" + array( + named_struct( + "variantFunctionalConsequenceIds", array(cast(rand() as string)), + "aminoAcidChange", cast(rand() as string), + "uniprotAccessions", array(cast(rand() as string)), + "isEnsemblCanonical", cast(rand() as boolean), + "codons", cast(rand() as string), + "distanceFromTss", cast(rand() as long), + "distanceFromFootprint", cast(rand() as long), + "appris", cast(rand() as string), + "maneSelect", cast(rand() as string), + "targetId", cast(rand() as string), + "impact", cast(rand() as string), + "lofteePrediction", cast(rand() as string), + "siftPrediction", rand(), + "polyphenPrediction", rand(), + "consequenceScore", cast(rand() as float), + "transcriptIndex", cast(rand() as integer), + "transcriptId", cast(rand() as string) + ) + ) + """, + percentNulls=0.1, + ) + .withColumnSpec( + "dbXrefs", + expr=""" + array( + named_struct( + "id", cast(rand() as string), + "source", cast(rand() as string) + ) + ) + """, percentNulls=0.1, ) - .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) ) return VariantIndex(_df=data_spec.build(), _schema=vi_schema) @@ -370,9 +359,9 @@ def mock_summary_statistics_data(spark: SparkSession) -> DataFrame: # Allowing missingness: .withColumnSpec("standardError", percentNulls=0.1) # Making sure p-values are below 1: - ).build() + ) - return data_spec + return data_spec.build() @pytest.fixture() @@ -411,7 +400,7 @@ def mock_ld_index(spark: SparkSession) -> LDIndex: def sample_gwas_catalog_studies(spark: SparkSession) -> DataFrame: """Sample GWAS Catalog studies.""" return spark.read.csv( - "tests/gentropy/data_samples/gwas_catalog_studies_sample-r2022-11-29.tsv", + "tests/gentropy/data_samples/gwas_catalog_studies.tsv", sep="\t", header=True, ) @@ -421,7 +410,7 @@ def sample_gwas_catalog_studies(spark: SparkSession) -> DataFrame: def sample_gwas_catalog_ancestries_lut(spark: SparkSession) -> DataFrame: """Sample GWAS ancestries sample data.""" return spark.read.csv( - "tests/gentropy/data_samples/gwas_catalog_ancestries_sample_v1.0.3-r2022-11-29.tsv", + "tests/gentropy/data_samples/gwas_catalog_ancestries.tsv", sep="\t", header=True, ) @@ -441,7 +430,7 @@ def sample_gwas_catalog_harmonised_sumstats_list(spark: SparkSession) -> DataFra def sample_gwas_catalog_associations(spark: SparkSession) -> DataFrame: """Sample GWAS raw associations sample data.""" return spark.read.csv( - "tests/gentropy/data_samples/gwas_catalog_associations_sample_e107_r2022-11-29.tsv", + "tests/gentropy/data_samples/gwas_catalog_associations.tsv", sep="\t", header=True, ) @@ -470,28 +459,30 @@ def sample_finngen_studies(spark: SparkSession) -> DataFrame: @pytest.fixture() -def sample_eqtl_catalogue_studies(spark: SparkSession) -> DataFrame: - """Sample eQTL Catalogue studies.""" - # For reference, the sample file was generated with the following command: - # curl https://raw.githubusercontent.com/eQTL-Catalogue/eQTL-Catalogue-resources/master/tabix/tabix_ftp_paths_imported.tsv | head -n11 > tests/gentropy/data_samples/eqtl_catalogue_studies_sample.tsv - with open( - "tests/gentropy/data_samples/eqtl_catalogue_studies_sample.tsv" - ) as eqtl_catalogue: - tsv = eqtl_catalogue.read() - rdd = spark.sparkContext.parallelize([tsv]) - return spark.read.csv(rdd, sep="\t", header=True) +def sample_eqtl_catalogue_finemapping_credible_sets(session: Session) -> DataFrame: + """Sample raw eQTL Catalogue credible sets outputted by SuSIE.""" + return EqtlCatalogueFinemapping.read_credible_set_from_source( + session, + credible_set_path=["tests/gentropy/data_samples/QTD000584.credible_sets.tsv"], + ) + + +@pytest.fixture() +def sample_eqtl_catalogue_finemapping_lbf(session: Session) -> DataFrame: + """Sample raw eQTL Catalogue table with logBayesFactors outputted by SuSIE.""" + return EqtlCatalogueFinemapping.read_lbf_from_source( + session, + lbf_path=["tests/gentropy/data_samples/QTD000584.lbf_variable.txt"], + ) @pytest.fixture() -def sample_eqtl_catalogue_summary_stats(spark: SparkSession) -> DataFrame: - """Sample eQTL Catalogue summary stats.""" - # For reference, the sample file was generated with the following commands: - # mkdir -p tests/gentropy/data_samples/imported/GTEx_V8/ge - # curl ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz | gzip -cd | head -n11 | gzip -c > tests/gentropy/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz - # It's important for the test file to be named in exactly this way, because eQTL Catalogue study ID is populated based on input file name. +def sample_eqtl_catalogue_studies_metadata(spark: SparkSession) -> DataFrame: + """Sample raw eQTL Catalogue table with metadata about the QTD000584 study.""" return spark.read.option("delimiter", "\t").csv( - "tests/gentropy/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz", + "tests/gentropy/data_samples/sample_eqtl_catalogue_studies.tsv", header=True, + schema=EqtlCatalogueStudyIndex.raw_studies_metadata_schema, ) @@ -507,6 +498,15 @@ def sample_ukbiobank_studies(spark: SparkSession) -> DataFrame: ) +@pytest.fixture() +def study_locus_sample_for_colocalisation(spark: SparkSession) -> DataFrame: + """Sample study locus data for colocalisation.""" + return StudyLocus( + _df=spark.read.parquet("tests/gentropy/data_samples/coloc_test.parquet"), + _schema=StudyLocus.get_schema(), + ) + + @pytest.fixture() def sample_target_index(spark: SparkSession) -> DataFrame: """Sample target index sample data.""" @@ -540,6 +540,35 @@ def mock_gene_index(spark: SparkSession) -> GeneIndex: return GeneIndex(_df=data_spec.build(), _schema=gi_schema) +@pytest.fixture() +def mock_biosample_index(spark: SparkSession) -> BiosampleIndex: + """Mock biosample index dataset.""" + bi_schema = BiosampleIndex.get_schema() + + # Makes arrays of varying length with random integers between 1 and 100 + array_expression = "transform(sequence(1, 1 + floor(rand() * 9)), x -> cast((rand() * 100) as int))" + + data_spec = ( + dg.DataGenerator( + spark, + rows=400, + partitions=4, + randomSeedMethod="hash_fieldname", + ) + .withSchema(bi_schema) + .withColumnSpec("biosampleName", percentNulls=0.1) + .withColumnSpec("description", percentNulls=0.1) + .withColumnSpec("xrefs", expr=array_expression, percentNulls=0.1) + .withColumnSpec("synonyms", expr=array_expression, percentNulls=0.1) + .withColumnSpec("parents", expr=array_expression, percentNulls=0.1) + .withColumnSpec("ancestors", expr=array_expression, percentNulls=0.1) + .withColumnSpec("descendants", expr=array_expression, percentNulls=0.1) + .withColumnSpec("children", expr=array_expression, percentNulls=0.1) + ) + + return BiosampleIndex(_df=data_spec.build(), _schema=bi_schema) + + @pytest.fixture() def liftover_chain_37_to_38(spark: SparkSession) -> LiftOverSpark: """Sample liftover chain file.""" @@ -565,37 +594,17 @@ def sample_otp_interactions(spark: SparkSession) -> DataFrame: @pytest.fixture() def mock_l2g_feature_matrix(spark: SparkSession) -> L2GFeatureMatrix: """Mock l2g feature matrix dataset.""" - schema = L2GFeatureMatrix.get_schema() - - data_spec = ( - dg.DataGenerator( - spark, - rows=50, - partitions=4, - randomSeedMethod="hash_fieldname", - ) - .withSchema(schema) - .withColumnSpec("distanceTssMean", percentNulls=0.1) - .withColumnSpec("distanceTssMinimum", percentNulls=0.1) - .withColumnSpec("eqtlColocClppMaximum", percentNulls=0.1) - .withColumnSpec("eqtlColocClppMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec("eqtlColocLlrMaximum", percentNulls=0.1) - .withColumnSpec("eqtlColocLlrMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec("pqtlColocClppMaximum", percentNulls=0.1) - .withColumnSpec("pqtlColocClppMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec("pqtlColocLlrMaximum", percentNulls=0.1) - .withColumnSpec("pqtlColocLlrMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec("sqtlColocClppMaximum", percentNulls=0.1) - .withColumnSpec("sqtlColocClppMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec("sqtlColocLlrMaximum", percentNulls=0.1) - .withColumnSpec("sqtlColocLlrMaximumNeighborhood", percentNulls=0.1) - .withColumnSpec( - "goldStandardSet", percentNulls=0.0, values=["positive", "negative"] - ) + return L2GFeatureMatrix( + _df=spark.createDataFrame( + [ + ("1", "gene1", 100.0, None, True), + ("2", "gene2", 1000.0, 0.0, False), + ], + "studyLocusId STRING, geneId STRING, distanceTssMean FLOAT, distanceSentinelTssMinimum FLOAT, goldStandardSet BOOLEAN", + ), + with_gold_standard=True, ) - return L2GFeatureMatrix(_df=data_spec.build(), _schema=schema) - @pytest.fixture() def mock_l2g_gold_standard(spark: SparkSession) -> L2GGoldStandard: diff --git a/tests/gentropy/data_samples/QTD000584.credible_sets.tsv b/tests/gentropy/data_samples/QTD000584.credible_sets.tsv new file mode 100644 index 000000000..2c1cc8843 --- /dev/null +++ b/tests/gentropy/data_samples/QTD000584.credible_sets.tsv @@ -0,0 +1,201 @@ +molecular_trait_id gene_id cs_id variant rsid cs_size pip pvalue beta se z cs_min_r2 region +RBP7.14208.3.3..1 ENSG00000162444 RBP7.14208.3.3..1_L1 chr1_10000458_T_C rs3003377 22 0.0170703689724805 1.33564e-10 0.139135 0.0215922 6.45120520807609 0.649351082174683 chr1:8997206-10997206 +RBP7.14208.3.3..1 ENSG00000162444 RBP7.14208.3.3..1_L1 chr1_10003040_A_G rs3003378 22 0.0346598350987255 5.69374e-11 -0.140285 0.0213409 -6.58178370994891 0.649351082174683 chr1:8997206-10997206 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1004625_A_G rs2799056 14 0.0475804849731317 2.17772e-16 0.155149 0.018795 8.27268578736212 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1005429_C_CA rs58913475 14 0.0821809105318325 1.22244e-16 0.156317 0.018777 8.34295752984943 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1005429_C_CA rs397795410 14 0.0821809105318325 1.22244e-16 0.156317 0.018777 8.34295752984943 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1005904_C_T rs3128116 14 0.082073967987591 1.22412e-16 0.15631 0.0187765 8.34279413645199 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1005954_G_A rs57683598 14 0.0829345886044969 1.20956e-16 0.156326 0.0187752 8.34423990954914 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1006159_C_T rs9778087 14 0.0287755307773455 3.71195e-16 0.154747 0.0188957 8.20709279382202 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1007746_CTTTTTTTTTTTTTT_C rs1196345893 14 0.169853803516783 5.20268e-17 0.176669 0.020963 8.44875667909097 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1008088_T_C rs3121567 17 0.0408954841106202 5.10581e-17 0.436084 0.0517305 8.44446424543245 0.830135313092393 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1008307_G_C rs2465140 14 0.113047689891171 8.91487e-17 0.156234 0.0186815 8.3812176673309 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1008307_G_C rs2465140 6 0.0340123675250653 6.68955e-36 0.240866 0.0190257 12.6742943381175 0.960143135725474 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1009184_T_C rs3128117 14 0.114792998892356 8.78673e-17 0.156301 0.0186856 8.38296665698105 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1009184_T_C rs3128117 6 0.0368499383801147 5.5694e-36 0.241193 0.0190289 12.689400366898 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1009716_C_T rs3135457 17 0.0392096517327741 5.41887e-18 0.443041 0.0509582 8.70818986165733 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1009731_C_T rs13303172 17 0.0491133974154425 2.89124e-18 0.455466 0.0519529 8.78131609329298 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010094_C_T rs3121566 17 0.0498970509479227 1.25258e-18 0.449307 0.0506956 8.87789801891556 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010232_C_T rs3121565 17 0.0632524792227336 1.28581e-18 0.434519 0.0490436 8.87518117824451 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010481_ATTAT_A rs150242145 17 0.0497030361393638 1.52877e-18 0.431754 0.0488405 8.8551869891939 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010481_ATTAT_A rs4039717 17 0.0497030361393638 1.52877e-18 0.431754 0.0488405 8.8551869891939 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010481_ATTAT_A rs35187710 17 0.0497030361393638 1.52877e-18 0.431754 0.0488405 8.8551869891939 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010747_GT_G rs34487852 17 0.0555195289512095 1.48341e-18 0.43187 0.0488346 8.85865222353006 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1010755_T_G rs9723307 17 0.0555195289512095 1.48341e-18 0.43187 0.0488346 8.85865222353006 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1011654_G_A rs2465126 17 0.0396092590819197 9.26558e-19 0.434713 0.0488596 8.91210923928129 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1013041_A_AAAC rs113047134 17 0.0502336150812414 1.21932e-18 0.439008 0.0495164 8.88138113776474 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1013312_G_A rs2341365 17 0.0670537982566278 9.19098e-19 0.429695 0.0482907 8.91296598275893 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1013490_C_G rs4615788 17 0.0596684312812006 1.30541e-18 0.434291 0.0490274 8.87346286235471 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1013541_T_C rs15842 17 0.0580138201506556 1.34141e-18 0.434388 0.0490555 8.87034155283964 0.830135313092393 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1013855_G_A rs2465124 17 0.0591361376280749 1.32867e-18 0.433762 0.0489788 8.87144043891645 0.830135313092393 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1014228_G_A rs1921 14 0.12433309239898 8.57119e-17 0.15341 0.0183335 8.38560743650197 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1014228_G_A rs1921 6 0.819317788540627 1.62353e-36 0.238448 0.0186635 12.7903962671107 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1014545_C_T rs2799070 17 0.0932055530070119 6.4825e-18 0.414546 0.0477952 8.68848253629389 0.830135313092393 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1014863_A_C rs1891906 14 0.0193128429509125 5.74201e-16 0.152247 0.0187132 8.15329964672768 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1014863_A_C rs1891906 6 0.0253214818240058 1.12696e-35 0.240358 0.0190503 12.6312379431961 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1015336_A_T rs2799069 17 0.0705760271470166 1.24902e-18 0.447782 0.0505217 8.87870564010476 0.830135313092393 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1015925_A_ATT rs575235313 14 0.0290657333363032 3.71821e-16 0.152991 0.0186817 8.2068585448562 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1015925_A_ATT rs369296755 14 0.0290657333363032 3.71821e-16 0.152991 0.0186817 8.2068585448562 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1015925_A_ATT rs59612205 14 0.0290657333363032 3.71821e-16 0.152991 0.0186817 8.2068585448562 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1015925_A_ATT rs575235313 6 0.0224165593925054 1.03516e-35 0.240113 0.0190203 12.6381934222441 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1015925_A_ATT rs369296755 6 0.0224165593925054 1.03516e-35 0.240113 0.0190203 12.6381934222441 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1015925_A_ATT rs59612205 6 0.0224165593925054 1.03516e-35 0.240113 0.0190203 12.6381934222441 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L2 chr1_1015950_G_A rs9697717 17 0.0572897456684484 5.86568e-18 0.418525 0.0481893 8.70025128920918 0.830135313092393 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1016623_G_A rs3128118 14 0.0249715969486798 4.40368e-16 0.152839 0.0187107 8.1860030389925 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1017114_A_AT rs59239970 14 0.0258900605545787 4.21998e-16 0.152767 0.0186899 8.19127935909139 0.617640026801365 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1017114_A_AT rs397687829 14 0.0258900605545787 4.21998e-16 0.152767 0.0186899 8.19127935909139 0.617640026801365 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1017114_A_AT rs59239970 6 0.0248308249271214 9.24949e-36 0.240377 0.0190272 12.6474850406766 0.960143135725474 chr1:1138-2001138 +ISG15.14151.4.3..1 ENSG00000187608 ISG15.14151.4.3..1_L1 chr1_1017114_A_AT rs397687829 6 0.0248308249271214 9.24949e-36 0.240377 0.0190272 12.6474850406766 0.960143135725474 chr1:1138-2001138 +ISG15.14148.2.3..1 ENSG00000187608 ISG15.14148.2.3..1_L1 chr1_1022518_G_T rs2799064 14 0.0319029278184674 2.66215e-16 0.155806 0.0189309 8.25406439760094 0.617640026801365 chr1:1138-2001138 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L8 chr1_103440589_TA_T rs1327439088 5 0.418485920864639 1.08665e-07 0.632842 0.118879 5.34468451936006 0.710818444681624 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L7 chr1_103534368_A_G rs36133328 1 0.999623621396104 0.282208 0.0493205 0.0458561 1.07174598226751 1 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L1 chr1_103537231_T_TA rs553487095 4 0.770652473010321 6.33883e-62 -1.04771 0.0617702 -16.992451463208 0.88938645908643 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L1 chr1_103579772_G_A rs78811372 4 0.0518885686269311 2.90639e-62 -1.00991 0.0593671 -17.0425983327703 0.88938645908643 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L1 chr1_103581934_T_C rs113630435 4 0.0693676553148963 1.90336e-62 -1.01685 0.0596806 -17.069616976694 0.88938645908643 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L1 chr1_103581970_C_G rs79456674 4 0.0693676553148963 1.90336e-62 -1.01685 0.0596806 -17.069616976694 0.88938645908643 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L10 chr1_103590182_C_A rs35945519 2 0.369662271975257 8.86659e-07 0.575069 0.116773 4.92945612380697 0.72482441906489 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L10 chr1_103605780_A_C rs535256526 2 0.628073732155603 4.75362e-07 0.640926 0.127014 5.05119658925642 0.72482441906489 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L2 chr1_103615613_C_T rs142439658 2 0.717277857674304 4.86208e-19 0.862569 0.0961591 8.9907709256386 0.918383081007505 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L3 chr1_103629402_A_G rs137872678 1 0.999999999693002 7.98208e-25 0.376931 0.0363406 10.3860823285899 1 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L2 chr1_103668785_C_T rs531730279 2 0.24978154476556 6.56656e-19 0.892757 0.0999028 8.95721672444223 0.918383081007505 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L8 chr1_103763515_C_T rs112518149 5 0.158205957223133 1.82525e-07 0.617843 0.118191 5.24944586203691 0.710818444681624 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L8 chr1_103780382_A_C rs74486377 5 0.0631024593524357 1.66298e-07 0.555245 0.105865 5.26583426302732 0.710818444681624 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L8 chr1_103784694_G_A rs111937937 5 0.299969225009035 6.44072e-08 0.607864 0.112182 5.44035433710252 0.710818444681624 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L5 chr1_103791530_T_C rs12718032 2 0.498456726418405 7.80792e-12 -0.888432 0.129377 -6.88371950851072 1 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L5 chr1_103791531_C_T rs12718033 2 0.498456726418405 7.80792e-12 -0.888432 0.129377 -6.88371950851072 1 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L8 chr1_103868893_C_T rs112582891 5 0.0108660096782747 1.25217e-06 0.573224 0.118039 4.87740414910442 0.710818444681624 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L6 chr1_103869827_C_T rs77395797 4 0.136398531014545 1.88188e-16 -0.903813 0.109254 -8.29678045059477 0.765529570853573 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L6 chr1_103896606_AAC_A rs149362978 4 0.394459586630998 4.4686e-17 -0.936885 0.110929 -8.4704863307765 0.765529570853573 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L6 chr1_103941863_A_C rs78691055 4 0.381808971655203 1.6995e-16 -0.887289 0.107096 -8.30886315642385 0.765529570853573 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L6 chr1_104066239_T_A rs79264627 4 0.087290671754178 1.52577e-15 -0.854343 0.106604 -8.03746208287604 0.765529570853573 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L4 chr1_104140351_A_C rs140988946 2 0.499735709754288 1.27153e-12 -0.937449 0.131568 -7.13696932535266 1 chr1:102655290-104655290 +AMY1A.7918.114.3..1 ENSG00000237763 AMY1A.7918.114.3..1_L4 chr1_104142525_T_C rs144738643 2 0.499735709754288 1.27153e-12 -0.937449 0.131568 -7.13696932535266 1 chr1:102655290-104655290 +NTNG1.5637.81.3..1 ENSG00000162631 NTNG1.5637.81.3..1_L1 chr1_107135646_G_C rs115668827 1 0.999999999152377 7.63332e-99 1.08093 0.0494955 21.8723371836279 1 chr1:106140007-108140007 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L3 chr1_109589235_A_G rs115113608 4 0.124950624508756 0.0177043 -0.15027 0.0633265 -2.37593150661648 0.736625376789901 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L3 chr1_109612653_G_A rs41313290 4 0.11989060447971 0.0184856 -0.148156 0.0628601 -2.35988376221321 0.736625376789901 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L3 chr1_109618135_A_G rs143373095 4 0.0380482611599771 0.0122033 -0.183543 0.0731946 -2.51102566998723 0.736625376789901 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L3 chr1_109666423_CA_C rs200217278 4 0.68348010200753 0.0196244 -0.18258 0.0782063 -2.33862128021981 0.736625376789901 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109669912_T_C rs687643 6 0.146931800078394 1.45153e-15 -0.142702 0.0177923 -8.03384911518914 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109670378_T_A rs1149178 6 0.168288212623384 1.24632e-15 -0.143086 0.0177978 -8.052901044418 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109672545_G_C rs676828 6 0.171447243842212 1.2321e-15 -0.143085 0.0177945 -8.05434906241406 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109672546_T_A rs655323 6 0.171447243842212 1.2321e-15 -0.143085 0.0177945 -8.05434906241406 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109672556_A_G rs655315 6 0.176956554895134 1.18157e-15 -0.143187 0.0177957 -8.0595874634879 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L2 chr1_109674419_C_G rs428434 6 0.132857170363337 1.74238e-15 -0.142778 0.0178527 -8.01110529958856 0.994717403110067 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L1 chr1_109675302_G_A rs611951 1 0.999790629660438 7.20622e-22 -0.246472 0.0254637 -9.69359103959016 1 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109687431_T_C rs185411429 7 0.0391957610979906 0.000188762 0.259963 0.0695489 3.74246573009135 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109703659_C_A rs114807258 7 0.138495056822159 8.88168e-05 0.271657 0.0692269 3.92882510953298 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109705752_G_A rs4119680 7 0.00392261918335524 0.000972837 0.190925 0.0578343 3.30563451682445 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109705872_A_G rs4111793 7 0.00392261918335524 0.000972837 0.190925 0.0578343 3.30563451682445 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109706742_T_G rs10857797 7 0.00394765617720327 0.000965776 0.191005 0.0578226 3.30768231999452 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109707875_G_A rs112697537 7 0.226519414991752 5.50397e-05 0.241719 0.0598547 4.04352621452757 0.77221111610039 chr1:108687814-110687814 +GSTM1.7239.9.3..1 ENSG00000134184 GSTM1.7239.9.3..1_L4 chr1_109711080_C_T rs114184542 7 0.535991863096291 3.82274e-05 0.253832 0.0615564 4.12854314327639 0.77221111610039 chr1:108687814-110687814 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111218425_C_CT rs71096398 12 0.0140423605605697 8.11237e-12 -0.187906 0.0273858 -6.87465242188135 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111218425_C_CT rs398103176 12 0.0140423605605697 8.11237e-12 -0.187906 0.0273858 -6.87465242188135 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111222999_C_T rs7541319 12 0.012183707666001 9.5671e-12 0.188284 0.027537 6.85067991238155 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111223001_C_T rs7541320 12 0.012183707666001 9.5671e-12 0.188284 0.027537 6.85067991238155 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111223049_C_A rs79561756 12 0.0180624375586194 6.21533e-12 0.190394 0.0275935 6.9129520675186 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111226195_G_A rs112495041 12 0.0569065732801756 1.8385e-12 0.196544 0.0277861 7.08664061321594 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111227161_A_AT rs1405449799 12 0.0471145548781091 2.14633e-12 0.202848 0.0287662 7.06515582921552 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111229637_A_C rs6537684 12 0.212196762028722 4.88456e-13 0.192206 0.0264824 7.2710930985834 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111230685_T_C rs75230690 12 0.214417276190273 4.84114e-13 0.190763 0.0262792 7.27250335093835 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111231515_C_G rs2182115 12 0.105244955003551 1.03237e-12 0.186235 0.0260313 7.16751235705965 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111234055_G_C rs112260552 12 0.0956202047980552 1.14336e-12 0.185076 0.0259209 7.15332881048668 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111234063_G_T rs112597784 12 0.0956202047980552 1.14336e-12 0.185076 0.0259209 7.15332881048668 0.768788206750205 chr1:110200771-112200771 +CHI3L2.9383.24.3..1 ENSG00000064886 CHI3L2.9383.24.3..1_L1 chr1_111235703_C_T rs11556868 12 0.0858826844912999 1.27931e-12 0.183342 0.0257346 7.13758000707761 0.768788206750205 chr1:110200771-112200771 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113925634_T_A rs2476598 14 0.0337327235534424 3.88914e-09 0.13644 0.0231064 5.91832957550532 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113926881_A_G rs2147079 14 0.0372064009911297 3.55253e-09 0.136645 0.0230822 5.93340344771317 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113928567_C_T rs1000528 14 0.0493352275266787 2.58002e-09 0.136864 0.0229142 5.98659760343015 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113929596_A_G rs1217441 14 0.045677537570453 2.79766e-09 0.136482 0.0229016 5.97322704690054 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113936808_A_G rs7545038 14 0.0490337269493919 2.60726e-09 0.135722 0.0227297 5.98506993969208 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113938196_G_A rs6658209 14 0.0491235729591243 2.60086e-09 0.135727 0.0227289 5.98547504828744 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113938757_A_G rs7551215 14 0.0489021837909578 2.61454e-09 0.135702 0.0227281 5.98460867697915 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113938927_A_AT rs60152674 14 0.288773995100406 2.98325e-10 0.139953 0.0221473 6.33316344212625 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113947147_A_C rs4381184 14 0.0670684954378246 1.86331e-09 0.137142 0.0227572 6.04025344482872 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113969681_A_G rs7554371 14 0.036201612926157 3.84263e-09 0.13879 0.0234964 5.92120797884107 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113970866_G_T rs7522987 14 0.107140790515865 1.06156e-09 0.138267 0.0226013 6.13204505007826 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113978911_T_TA rs28365907 14 0.0604574665409252 2.12504e-09 0.134455 0.0223913 6.01911896722037 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113979061_A_AAAC rs3841011 14 0.0500160199149901 2.59801e-09 0.133925 0.0224265 5.98605424918997 0.776861365904863 chr1:112979391-114979391 +OLFML3.8660.5.3..1 ENSG00000116774 OLFML3.8660.5.3..1_L1 chr1_113979261_C_G rs6702833 14 0.0503931225390332 2.58312e-09 0.133848 0.02241 5.98698014955762 0.776861365904863 chr1:112979391-114979391 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116517087_A_G rs60612523 8 0.0475309309988685 1.44588e-06 0.462598 0.0958263 4.83398207403841 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116536107_A_G rs35768283 8 0.0850172382512443 7.72843e-07 0.467779 0.0944689 4.95843797092849 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116537006_A_G rs61789227 8 0.0896182831808431 7.25971e-07 0.472739 0.095235 4.97061069700849 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116537166_G_C rs61789228 8 0.15459839986684 4.02323e-07 0.489369 0.0963674 5.08505784950955 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116542790_A_G rs61789230 8 0.0953989793595664 6.78616e-07 0.472429 0.0949205 4.98381705849787 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116544968_G_A rs61789231 8 0.0960369373263085 6.73437e-07 0.472791 0.0949647 4.98530739399096 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116551018_T_C rs61789232 8 0.0944902273640924 6.85365e-07 0.472377 0.094947 4.98187575193265 0.483641872973346 chr1:115571039-117571039 +CD58.10938.13.3..1 ENSG00000116815 CD58.10938.13.3..1_L1 chr1_116584795_C_T rs41301291 8 0.323529981719682 1.78331e-07 0.389214 0.0743932 5.23694904568754 0.483641872973346 chr1:115571039-117571039 +PTGFRN.12727.7.3..1 ENSG00000134247 PTGFRN.12727.7.3..1_L1 chr1_116947639_G_T rs4233450 1 1 2.05602e-251 0.996044 0.0268832 37.112422729511 1 chr1:115909916-117909916 +PTGFRN.12727.7.3..1 ENSG00000134247 PTGFRN.12727.7.3..1_L4 chr1_116950430_CT_C rs5777294 1 0.999999896923805 1.49413e-14 -0.230896 0.029896 -7.74331858390703 1 chr1:115909916-117909916 +PTGFRN.12727.7.3..1 ENSG00000134247 PTGFRN.12727.7.3..1_L2 chr1_116953853_C_CT rs531278323 1 0.99914874906682 8.96156e-41 -0.7726 0.0569945 -13.5720346162712 1 chr1:115909916-117909916 +PTGFRN.12727.7.3..1 ENSG00000134247 PTGFRN.12727.7.3..1_L3 chr1_116964780_T_C rs4131408 1 0.999999991354537 1.49928e-06 0.121934 0.0252965 4.82836758942392 1 chr1:115909916-117909916 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L3 chr1_117315906_C_T rs867990055 6 0.411416697474189 3.16669e-16 -0.661814 0.0806202 -8.22192939624096 0.862857216242153 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L3 chr1_117342995_G_A rs115842852 6 0.111339038895784 3.4635e-17 -0.690533 0.0814675 -8.49097213310816 0.862857216242153 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117367337_G_GGAA rs762272197 145 0.00582517797248594 4.96014e-18 0.308426 0.035433 8.71622250083696 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117372502_A_T rs11587759 145 0.0032418248899162 1.74898e-17 0.292183 0.0341451 8.56990827272488 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117372791_A_AT rs139509107 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117376113_C_T rs10923274 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117376392_A_G rs10923275 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117377406_T_C rs10801957 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117377685_T_TTG rs150115826 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117377685_T_TTG rs66692703 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117377689_G_T rs77807296 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117379379_T_C rs10923278 145 0.00346487155868735 1.62658e-17 0.290973 0.0339698 8.57847033612913 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117381450_T_C rs61809515 145 0.00337869890474929 1.68938e-17 0.290864 0.0339747 8.5739953104312 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117382621_C_T rs4466644 145 0.00494876042950465 9.35165e-18 0.289286 0.0335186 8.64353396958903 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117382683_A_G rs143694657 145 0.0045989093527693 9.8882e-18 0.290932 0.0337348 8.63698200016798 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117383251_AT_A rs140454348 145 0.00469507297668226 1.00976e-17 0.289073 0.0335288 8.63451866319521 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117383513_G_A rs11577335 145 0.00482805778172257 9.70829e-18 0.289192 0.0335247 8.6391329235063 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117383719_G_A rs78922094 145 0.0045989093527693 9.8882e-18 0.290932 0.0337348 8.63698200016798 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117386177_G_A rs17037223 145 0.00420332453499861 1.25095e-17 0.289251 0.0336475 8.60943083403802 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117388172_AAG_A rs145841958 145 0.00462542560547441 9.81299e-18 0.290932 0.0337313 8.63787375468341 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117388320_A_G rs17037231 145 0.00486618147990769 9.60142e-18 0.289199 0.0335205 8.64042686468959 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117388469_A_G rs61809517 145 0.00486618147990769 9.60142e-18 0.289199 0.0335205 8.64042686468959 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117389722_T_G rs6662808 145 0.00496777662591308 9.28271e-18 0.289389 0.0335272 8.64438097408257 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117390964_G_A rs12127141 145 0.00462542560547441 9.81299e-18 0.290932 0.0337313 8.63787375468341 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117390987_G_A rs10923281 145 0.00486618147990769 9.60142e-18 0.289199 0.0335205 8.64042686468959 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117394741_C_T rs61808995 145 0.0049180343646329 8.87759e-18 0.290963 0.0336892 8.64959312126768 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117396856_G_T rs61808999 145 0.00497455489107657 8.7351e-18 0.290933 0.0336783 8.65148010037419 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117397066_AC_A rs137887215 145 0.00506904403119912 8.98083e-18 0.28899 0.033466 8.64822528825749 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117397948_G_A rs61809002 145 0.00506904403119912 8.98083e-18 0.28899 0.033466 8.64822528825749 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117398905_G_A rs11583061 145 0.00537241932910204 7.74494e-18 0.290688 0.0335953 8.66565015835898 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117400240_G_A rs12131109 145 0.00526664585733616 7.96184e-18 0.290757 0.0336158 8.66241397178223 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117401571_G_C rs17037253 145 0.00530614979824895 8.34733e-18 0.287966 0.0333144 8.65685819867821 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117403552_C_G rs61809004 145 0.00559289535671625 7.74852e-18 0.287933 0.0332772 8.66554603174975 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117403971_A_G rs10923284 145 0.00555361816450295 7.38537e-18 0.290605 0.0335642 8.67118317858973 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117404338_G_A rs10754344 145 0.00570456635025374 7.52854e-18 0.287988 0.0332706 8.66891636175415 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117404623_T_C rs4460623 145 0.0055730773677457 7.83881e-18 0.285863 0.033043 8.66410690773968 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117404886_C_G rs10923285 145 0.00560352877715464 7.73514e-18 0.287916 0.0332744 8.66574672027815 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117407111_G_GA rs140717342 145 0.00352672502195639 1.39766e-17 0.296032 0.0344886 8.59644136438616 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117408302_TA_T rs1342460042 145 0.0120352881604295 1.19735e-17 0.287192 0.0333879 8.61460962436664 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117409007_T_G rs7547211 145 0.00570456635025374 7.52854e-18 0.287988 0.0332706 8.66891636175415 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117410623_GA_G rs544835333 145 0.00556771872764772 7.36399e-18 0.290596 0.0335618 8.67152053983828 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117411268_A_G rs2359247 145 0.00560352877715464 7.73514e-18 0.287916 0.0332744 8.66574672027815 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117414017_T_C rs7546280 145 0.00560352877715464 7.73514e-18 0.287916 0.0332744 8.66574672027815 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117415063_C_A rs61805762 145 0.00556771872764772 7.36399e-18 0.290596 0.0335618 8.67152053983828 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117415799_A_G rs61805763 145 0.00560352877715464 7.73514e-18 0.287916 0.0332744 8.66574672027815 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117416122_AT_A rs140783195 145 0.00556845764048652 7.36269e-18 0.290596 0.0335618 8.67154112836966 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117418588_T_C rs10923289 145 0.00570534096812014 7.52127e-18 0.287993 0.0332707 8.66902918380216 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117418762_C_G rs12116979 145 0.00560428756468934 7.72768e-18 0.287921 0.0332745 8.66585956261713 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117423885_CT_C rs568455134 145 0.00668098758586155 5.91187e-18 0.289065 0.0332867 8.69714037798592 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117423945_C_T rs12117443 145 0.004648148017805 1.16946e-17 0.288911 0.0335771 8.61736137367636 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117425126_G_A rs74496340 145 0.00560428756468934 7.72768e-18 0.287921 0.0332745 8.66585956261713 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L1 chr1_117427158_AT_A rs35505705 1 0.953988049682964 1.03087e-22 -0.265522 0.0268696 -9.90286663026821 1 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L1 chr1_117427158_AT_A rs397981454 1 0.953988049682964 1.03087e-22 -0.265522 0.0268696 -9.90286663026821 1 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428091_A_ATC rs1218648156 145 0.00363318147979164 1.39357e-17 0.287771 0.0335247 8.59679354806247 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428091_A_ATC rs1491298022 145 0.00363318147979164 1.39357e-17 0.287771 0.0335247 8.59679354806247 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428091_A_ATC rs765944373 145 0.00363318147979164 1.39357e-17 0.287771 0.0335247 8.59679354806247 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428091_A_ATC rs763805236 145 0.00363318147979164 1.39357e-17 0.287771 0.0335247 8.59679354806247 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428725_A_G rs12140576 145 0.00555624928260612 7.36476e-18 0.290746 0.0335792 8.67150893052922 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117428784_CTTTTTT_C rs780515731 145 0.00405100662029789 1.46695e-17 0.300194 0.0349966 8.59067578887828 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L2 chr1_117429446_C_A rs541770553 3 0.303218120492753 3.17651e-11 -0.631867 0.0948611 -6.67183526765225 0.969414739960008 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117430198_CGGGCGGGGGGCT_C rs1326038533 145 0.0869199101985334 2.05697e-19 0.351434 0.0387605 9.0820290747647 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117430230_C_T rs540552506 145 0.0992282846092515 2.34587e-19 0.341169 0.0376894 9.06655537110236 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117430984_G_T rs61805784 145 0.00587051811904449 5.54143e-18 0.295072 0.0339491 8.70471525040322 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117431559_G_A rs11576543 145 0.0059327683485686 5.4582e-18 0.292465 0.0336423 8.70642946518756 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117432712_C_T rs10923291 145 0.0059327683485686 5.4582e-18 0.292465 0.0336423 8.70642946518756 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117433011_G_C rs7533053 145 0.0059327683485686 5.4582e-18 0.292465 0.0336423 8.70642946518756 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117438133_G_A rs1316326 145 0.00587051811904449 5.54143e-18 0.295072 0.0339491 8.70471525040322 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117438323_C_CT rs141467989 145 0.00587051811904449 5.54143e-18 0.295072 0.0339491 8.70471525040322 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117438352_G_GT rs149598021 145 0.00594085514620113 5.58358e-18 0.292345 0.0336387 8.70378434768917 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117438402_A_G rs12145435 145 0.00587051811904449 5.54143e-18 0.295072 0.0339491 8.70471525040322 0.892607416891782 chr1:116367449-118367449 +MAN1A2.9077.10.3..1 ENSG00000198162 MAN1A2.9077.10.3..1_L4 chr1_117438591_A_C rs10923295 145 0.00593614790797936 5.45267e-18 0.292468 0.0336421 8.70654733442469 0.892607416891782 chr1:116367449-118367449 diff --git a/tests/gentropy/data_samples/QTD000584.lbf_variable.txt b/tests/gentropy/data_samples/QTD000584.lbf_variable.txt new file mode 100644 index 000000000..2e5f080b7 --- /dev/null +++ b/tests/gentropy/data_samples/QTD000584.lbf_variable.txt @@ -0,0 +1,93 @@ +molecular_trait_id region variant chromosome position lbf_variable1 lbf_variable2 lbf_variable3 lbf_variable4 lbf_variable5 lbf_variable6 lbf_variable7 lbf_variable8 lbf_variable9 lbf_variable10 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1004625_A_G 1 1004625 31.6611029091783 -0.202959075620786 -0.202130730314703 -0.20961965656411 -0.220935552186467 -0.231637998079872 -0.238725148211663 -0.24082771183179 -0.237793637394013 -0.230147752064775 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1005429_C_CA 1 1005429 32.221487936929 -0.195965362215776 -0.195159905703761 -0.202442615288331 -0.213450908310367 -0.223867149857143 -0.230767346101171 -0.232814731479065 -0.229859524607447 -0.222413891866702 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1005429_C_CA 1 1005429 32.221487936929 -0.195965362215776 -0.195159905703761 -0.202442615288331 -0.213450908310367 -0.223867149857143 -0.230767346101171 -0.232814731479065 -0.229859524607447 -0.222413891866702 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1005904_C_T 1 1005904 32.2201611534391 -0.195991762843284 -0.195186220371416 -0.202469703004364 -0.213479148809414 -0.223896462401234 -0.230797358533138 -0.232844950282998 -0.229889448070568 -0.222443065660339 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1005954_G_A 1 1005954 32.2307888818185 -0.19578105619256 -0.19497623026446 -0.202253251284341 -0.213253021383546 -0.223661291151955 -0.230556257657266 -0.232602096369102 -0.229649101642647 -0.222209070783182 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1006159_C_T 1 1006159 31.136467292701 -0.209990149528141 -0.209138719976353 -0.216835315041259 -0.228461477008492 -0.239453018312253 -0.246729173853613 -0.248887512499901 -0.245773726161243 -0.237925750736744 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1007746_CTTTTTTTTTTTTTT_C 1 1007746 32.9559850984322 -0.038316648883864 -0.0380238494960996 -0.0406893282630594 -0.0448305028253735 -0.04887519730207 -0.051621545891178 -0.0524445636406954 -0.0512453110009252 -0.0482663766774842 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1008088_T_C 1 1008088 1.37412874657265 0.327702121948042 0.326632473445201 0.336381513669191 0.350847368073308 0.364259715641688 0.373012957292964 0.375606404726796 0.37190257498043 0.362433775328293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1008307_G_C 1 1008307 32.5456111578158 -0.194700204398019 -0.193898250606131 -0.201149852637882 -0.212113006036389 -0.222488569395536 -0.229362885636536 -0.231402755433439 -0.228458430823835 -0.22104090567139 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1008307_G_C 1 1008307 32.5456111578158 -0.194700204398019 -0.193898250606131 -0.201149852637882 -0.212113006036389 -0.222488569395536 -0.229362885636536 -0.231402755433439 -0.228458430823835 -0.22104090567139 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1009184_T_C 1 1009184 32.5611388775887 -0.194290897321716 -0.193490230314105 -0.200730245427149 -0.211676195244074 -0.222035837874369 -0.228899799643638 -0.230936619539856 -0.227996653323558 -0.220590227413268 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1009184_T_C 1 1009184 32.5611388775887 -0.194290897321716 -0.193490230314105 -0.200730245427149 -0.211676195244074 -0.222035837874369 -0.228899799643638 -0.230936619539856 -0.227996653323558 -0.220590227413268 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1009716_C_T 1 1009716 2.71104079064173 0.494816635254447 0.493192703993635 0.50794034053314 0.529835423625354 0.550140638470176 0.563389361772642 0.567308216212787 0.561697932338878 0.547375550942794 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1009731_C_T 1 1009731 2.82150405521786 0.540342129323484 0.538562825668397 0.554719332306166 0.57871213290032 0.600969016749107 0.615494215722806 0.619790737162891 0.61363890191046 0.597937184159163 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010094_C_T 1 1010094 2.24493920482519 0.411968335337582 0.41061718608088 0.422907017935993 0.441149233643318 0.458066284407125 0.469106147268475 0.472374152232941 0.467700270944111 0.455760977707615 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010232_C_T 1 1010232 1.91202916188143 0.359803709417789 0.358629772331635 0.36932105260348 0.385180619164498 0.399879856468536 0.409469520222412 0.41230946464606 0.408251380242343 0.397876921424855 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 1.77173807821859 0.32367057938181 0.322617627724349 0.332215602605901 0.34644932972347 0.359638760397212 0.368242813192753 0.370791808350112 0.367151750023736 0.357841775774211 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 1.77173807821859 0.32367057938181 0.322617627724349 0.332215602605901 0.34644932972347 0.359638760397212 0.368242813192753 0.370791808350112 0.367151750023736 0.357841775774211 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 1.77173807821859 0.32367057938181 0.322617627724349 0.332215602605901 0.34644932972347 0.359638760397212 0.368242813192753 0.370791808350112 0.367151750023736 0.357841775774211 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010747_GT_G 1 1010747 1.75810715157238 0.324689439194826 0.323633006588353 0.33326218961169 0.347542511100306 0.360775365411779 0.369407817534277 0.371965166683577 0.368313013217345 0.358972409164632 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1010755_T_G 1 1010755 1.75810715157238 0.324689439194826 0.323633006588353 0.33326218961169 0.347542511100306 0.360775365411779 0.369407817534277 0.371965166683577 0.368313013217345 0.358972409164632 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1011654_G_A 1 1011654 2.12169251532154 0.366460361798816 0.365265937516033 0.376141030220329 0.392271491754132 0.407219493507684 0.416970000694678 0.419857141457765 0.415731154253511 0.40518294886129 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1013041_A_AAAC 1 1013041 2.00781021970105 0.362130484724756 0.360948644878316 0.371710067829663 0.387674855396944 0.402472485475907 0.412126585625301 0.414985420016895 0.410899869364181 0.400456289240032 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1013312_G_A 1 1013312 2.389285291571 0.421166743866767 0.419791984834859 0.432290918596263 0.450834183229199 0.468019640467544 0.479228539567116 0.482545253802808 0.477800748778892 0.465678374403175 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1013490_C_G 1 1013490 1.89538630594497 0.353868820883007 0.352714933468769 0.363225203506876 0.378815233728964 0.393263825335052 0.402689707855315 0.405481310490667 0.40149274816844 0.39129510202527 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1013541_T_C 1 1013541 1.89945161357021 0.354469519574711 0.353313593450461 0.363842259202563 0.379459698800289 0.393933795126526 0.40337635110558 0.40617287510971 0.402177232445623 0.391961588903811 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1013855_G_A 1 1013855 1.89454057580979 0.354052298424014 0.352897840814967 0.363413213754561 0.379010797399775 0.393466353945608 0.402896750555113 0.405689674590678 0.401699201839202 0.391496694616208 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1014228_G_A 1 1014228 32.6418654124405 -0.180802804248279 -0.180043852226177 -0.186910406121919 -0.197302938239478 -0.207151747100776 -0.213684283615382 -0.215623798363078 -0.212823520223575 -0.205772783096275 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1014228_G_A 1 1014228 32.6418654124405 -0.180802804248279 -0.180043852226177 -0.186910406121919 -0.197302938239478 -0.207151747100776 -0.213684283615382 -0.215623798363078 -0.212823520223575 -0.205772783096275 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1014545_C_T 1 1014545 1.20281022405445 0.267916639443903 0.267054936386071 0.274920572041875 0.286572348338058 0.297357277091691 0.304387754403386 0.306471311531062 0.303499065561979 0.295888238410321 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1014863_A_C 1 1014863 30.7102047260281 -0.214696165616663 -0.213828713720751 -0.221669131092052 -0.233511900561953 -0.244706884587611 -0.252116790069818 -0.254314638616173 -0.251144400637229 -0.243154229162276 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1014863_A_C 1 1014863 30.7102047260281 -0.214696165616663 -0.213828713720751 -0.221669131092052 -0.233511900561953 -0.244706884587611 -0.252116790069818 -0.254314638616173 -0.251144400637229 -0.243154229162276 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015336_A_T 1 1015336 1.73768783536195 0.324567751473565 0.323512736755249 0.33312889658469 0.347388308919715 0.360600087747298 0.369217920528146 0.371770851149316 0.368125094883084 0.3588001019182 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 31.1469863801803 -0.208655966377409 -0.207808108361277 -0.215472257639861 -0.227051979795868 -0.238002207875466 -0.245252278704403 -0.247402975301871 -0.244300066522567 -0.236480736750293 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1015950_G_A 1 1015950 0.884176683134713 0.195840705162238 0.195221010473166 0.200903976121869 0.209307445943998 0.217074019195252 0.222133581488668 0.223635775784243 0.221499942951625 0.216016641813618 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1016623_G_A 1 1016623 30.9861128754779 -0.210464865129048 -0.209610975855757 -0.217329439548726 -0.22899041237872 -0.240016470987136 -0.247316190638715 -0.249481554483427 -0.246357691513044 -0.23848526219243 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 31.024532551894 -0.210241815843817 -0.209388737406676 -0.217099878090532 -0.228749800882685 -0.239765441432763 -0.247058283430011 -0.249221606899604 -0.246100659800412 -0.238235582934101 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 31.024532551894 -0.210241815843817 -0.209388737406676 -0.217099878090532 -0.228749800882685 -0.239765441432763 -0.247058283430011 -0.249221606899604 -0.246100659800412 -0.238235582934101 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 31.024532551894 -0.210241815843817 -0.209388737406676 -0.217099878090532 -0.228749800882685 -0.239765441432763 -0.247058283430011 -0.249221606899604 -0.246100659800412 -0.238235582934101 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 31.024532551894 -0.210241815843817 -0.209388737406676 -0.217099878090532 -0.228749800882685 -0.239765441432763 -0.247058283430011 -0.249221606899604 -0.246100659800412 -0.238235582934101 +ISG15.14148.2.3..1 chr1:1138-2001138 chr1_1022518_G_T 1 1022518 31.2281969352636 0.0634418252095963 0.0633989654806943 0.0637694407831844 0.0641436052558637 0.0642910202108671 0.0642800157751431 0.0642644363690663 0.0643069267573702 0.0643407268154315 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1004625_A_G 1 1004625 60.3575665524951 -1.78394536462074 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1005429_C_CA 1 1005429 61.024165250281 -1.73525144796326 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1005429_C_CA 1 1005429 61.024165250281 -1.73525144796326 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1005904_C_T 1 1005904 61.0221011561896 -1.73539907793572 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1005954_G_A 1 1005954 60.9716665050324 -1.73683060605725 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1006159_C_T 1 1006159 59.9874687452069 -1.78614534920697 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1007746_CTTTTTTTTTTTTTT_C 1 1007746 56.5256228788874 -1.19720405745599 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1008088_T_C 1 1008088 -0.907129234395213 25.243875269357 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1008307_G_C 1 1008307 65.6918304267104 -1.45884813824405 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1008307_G_C 1 1008307 65.6918304267104 -1.45884813824405 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1009184_T_C 1 1009184 65.771960163951 -1.44456525071005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1009184_T_C 1 1009184 65.771960163951 -1.44456525071005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1009716_C_T 1 1009716 -0.447856745307585 25.2017785595101 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1009731_C_T 1 1009731 -0.445841857837749 25.4269874827134 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010094_C_T 1 1010094 -0.649054852993949 25.4428175271184 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010232_C_T 1 1010232 -0.829276587086672 25.6799899493842 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 -0.836262770837368 25.4389216459073 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 -0.836262770837368 25.4389216459073 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010481_ATTAT_A 1 1010481 -0.836262770837368 25.4389216459073 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010747_GT_G 1 1010747 -0.826170274979466 25.5495904572018 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1010755_T_G 1 1010755 -0.826170274979466 25.5495904572018 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1011654_G_A 1 1011654 -0.721925093708164 25.2119185314773 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1013041_A_AAAC 1 1013041 -0.683178587820276 25.4495400510799 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1013312_G_A 1 1013312 -0.646682543118569 25.7383508815934 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1013490_C_G 1 1013490 -0.830608796417208 25.621658716628 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1013541_T_C 1 1013541 -0.836649880908032 25.5935368859696 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1013855_G_A 1 1013855 -0.833887346945684 25.6126978286785 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1014228_G_A 1 1014228 68.87357824629 -1.44285040965178 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1014228_G_A 1 1014228 68.87357824629 -1.44285040965178 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1014545_C_T 1 1014545 -1.01063070074985 26.0676629268844 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1014863_A_C 1 1014863 65.3967593369157 -1.45885206221497 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1014863_A_C 1 1014863 65.3967593369157 -1.45885206221497 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015336_A_T 1 1015336 -0.739349906651994 25.7895461533593 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015925_A_ATT 1 1015925 65.2749061618345 -1.41461869181183 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1015950_G_A 1 1015950 -1.01506118885836 25.5809772743873 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1016623_G_A 1 1016623 65.0485663530216 -1.4274791103387 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 65.3771920394664 -1.39957248113441 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 65.3771920394664 -1.39957248113441 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 65.3771920394664 -1.39957248113441 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1017114_A_AT 1 1017114 65.3771920394664 -1.39957248113441 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +ISG15.14151.4.3..1 chr1:1138-2001138 chr1_1022518_G_T 1 1022518 59.6277992377165 -0.0390342701330888 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/tests/gentropy/data_samples/cell_ontology_sample.json b/tests/gentropy/data_samples/cell_ontology_sample.json new file mode 100644 index 000000000..5e73bfdee --- /dev/null +++ b/tests/gentropy/data_samples/cell_ontology_sample.json @@ -0,0 +1,351 @@ +{ + "graphs": [ + { + "id": "http://purl.obolibrary.org/obo/cl.json", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0000700", + "val": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "pred": "http://purl.org/dc/elements/1.1/description", + "val": "An ontology of cell types." + }, + { + "pred": "http://purl.org/dc/elements/1.1/title", + "val": "Cell Ontology" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-5208-3432" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-9114-8737" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-9990-8331" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-2244-7917" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-6601-2165" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-7073-9172" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-8688-6599" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-9900-7880" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-1980-3228" + }, + { + "pred": "http://purl.org/dc/terms/license", + "val": "http://creativecommons.org/licenses/by/4.0/" + }, + { + "pred": "http://www.w3.org/2000/01/rdf-schema#comment", + "val": "See PMID:15693950, PMID:12799354, PMID:20123131, PMID:21208450; Contact Alexander Diehl, addiehl@buffalo.edu, university at buffalo." + }, + { + "pred": "http://www.w3.org/2002/07/owl#versionInfo", + "val": "2024-08-16" + } + ], + "version": "http://purl.obolibrary.org/obo/cl/releases/2024-08-16/cl.json" + }, + "nodes": [ + { + "id": "http://purl.obolibrary.org/obo/CL_0000653", + "lbl": "podocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A specialized kidney epithelial cell, contained within a glomerulus, that contains \"feet\" that interdigitate with the \"feet\" of other podocytes.", + "xrefs": ["GOC:tfm", "https://doi.org/10.1101/2021.10.10.463829"] + }, + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasBroadSynonym", + "val": "epithelial cell of visceral layer of glomerular capsule", + "xrefs": ["FMA:70967"] + }, + { + "pred": "hasExactSynonym", + "val": "glomerular podocyte", + "xrefs": ["FMA:70967"] + }, + { + "pred": "hasExactSynonym", + "val": "glomerular visceral epithelial cell" + }, + { + "pred": "hasExactSynonym", + "val": "kidney podocyte" + }, + { + "pred": "hasExactSynonym", + "val": "renal podocyte" + } + ], + "xrefs": [ + { + "val": "BTO:0002295" + }, + { + "val": "FMA:70967" + }, + { + "val": "ZFA:0009285" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + }, + { + "pred": "http://www.w3.org/2000/01/rdf-schema#seeAlso", + "val": "https://github.com/obophenotype/cell-ontology/issues/1460" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000654", + "lbl": "primary oocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A primary oocyte is an oocyte that has not completed female meosis I.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "subsets": [ + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "primary oogonium" + } + ], + "xrefs": [ + { + "val": "BTO:0000512" + }, + { + "val": "FMA:18645" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000655", + "lbl": "secondary oocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A secondary oocyte is an oocyte that has not completed meiosis II.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "primary oogonium" + } + ], + "xrefs": [ + { + "val": "BTO:0003094" + }, + { + "val": "FMA:18646" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000656", + "lbl": "primary spermatocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A diploid cell that has derived from a spermatogonium and can subsequently begin meiosis and divide into two haploid secondary spermatocytes.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "xrefs": [ + { + "val": "BTO:0001115" + }, + { + "val": "CALOHA:TS-2194" + }, + { + "val": "FMA:72292" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000657", + "lbl": "secondary spermatocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "One of the two haploid cells into which a primary spermatocyte divides, and which in turn gives origin to spermatids.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "xrefs": [ + { + "val": "BTO:0000709" + }, + { + "val": "CALOHA:TS-2195" + }, + { + "val": "FBbt:00004941" + }, + { + "val": "FMA:72293" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000658", + "lbl": "cuticle secreting cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "An epithelial cell that secretes cuticle.", + "xrefs": ["GOC:tfm"] + } + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000659", + "lbl": "eggshell secreting cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "An extracellular matrix secreting cell that secretes eggshell.", + "xrefs": ["GOC:tfm"] + } + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_1000451", + "lbl": "obsolete epithelial cell of visceral layer of glomerular capsule", + "type": "CLASS", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0100001", + "val": "http://purl.obolibrary.org/obo/CL_0000653" + } + ], + "deprecated": true + } + } + ], + "edges": [ + { + "sub": "http://purl.obolibrary.org/obo/UBERON_0005751", + "pred": "http://purl.obolibrary.org/obo/BFO_0000051", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/GO_1903210", + "pred": "http://purl.obolibrary.org/obo/BFO_0000066", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/GO_0090521", + "pred": "http://purl.obolibrary.org/obo/RO_0002565", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/GO_0072015", + "pred": "http://purl.obolibrary.org/obo/RO_0002296", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_4030008", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002525", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002523", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000653" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000653", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0002522" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000653", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_1000450" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000653", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0005751" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000655", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000023", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://www.geneontology.org/formats/oboInOwl#is_inferred", + "val": "true" + } + ] + } + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000655", + "pred": "http://purl.obolibrary.org/obo/CL_4030044", + "obj": "http://purl.obolibrary.org/obo/GO_0007147" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000655", + "pred": "http://purl.obolibrary.org/obo/RO_0002202", + "obj": "http://purl.obolibrary.org/obo/CL_0000654" + } + ] + } + ] +} diff --git a/tests/gentropy/data_samples/coloc_test.parquet b/tests/gentropy/data_samples/coloc_test.parquet new file mode 100644 index 000000000..54cc420c4 Binary files /dev/null and b/tests/gentropy/data_samples/coloc_test.parquet differ diff --git a/tests/gentropy/data_samples/efo_biosample_sample.json b/tests/gentropy/data_samples/efo_biosample_sample.json new file mode 100644 index 000000000..ebe979721 --- /dev/null +++ b/tests/gentropy/data_samples/efo_biosample_sample.json @@ -0,0 +1,1424 @@ +{ + "graphs": [ + { + "id": "http://www.ebi.ac.uk/efo/efo.owl", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/format-version", + "val": "1.4" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Catherine Leroy" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Dani Welter" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Drashtti Vasant" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Ele Holloway" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Eleanor Williams" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Emma Kate Hastings" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Gautier Koscielny" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Helen Parkinson" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "James Malone" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Jon Ison" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Laura Huerta Martinez" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Natalja Kurbatova" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Olamidipupo Ajigboye" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Paola Roncaglia" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Simon Jupp" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Sirarat Sarntivijai" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Tomasz Adamusiak" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Trish Whetzel" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "Zoe May Pendlington" + }, + { + "pred": "http://purl.org/dc/elements/1.1/rights", + "val": "Copyright [2014] EMBL - European Bioinformatics Institute\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the\nLicense. " + }, + { + "pred": "http://purl.org/dc/terms/license", + "val": "www.apache.org/licenses/LICENSE-2.0" + }, + { + "pred": "http://www.w3.org/2000/01/rdf-schema#comment", + "val": "2024-10-15" + }, + { + "pred": "http://www.w3.org/2002/07/owl#versionInfo", + "val": "3.71.0" + } + ], + "version": "http://www.ebi.ac.uk/efo/releases/v3.71.0/efo.owl" + }, + "nodes": [ + { + "id": "http://dbpedia.org/resource/China", + "lbl": "China", + "type": "CLASS", + "meta": { + "xrefs": [ + { + "val": "GAZ:00002845" + } + ] + } + }, + { + "id": "http://dbpedia.org/resource/India", + "lbl": "India", + "type": "CLASS", + "meta": { + "xrefs": [ + { + "val": "GAZ:00002839" + } + ] + } + }, + { + "id": "http://dbpedia.org/resource/Iran", + "lbl": "Iran", + "type": "CLASS", + "meta": { + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "Iran (Islamic Republic of)" + }, + { + "pred": "hasExactSynonym", + "val": "Iran (Islamic Republic of)" + } + ], + "xrefs": [ + { + "val": "GAZ:00004474" + } + ] + } + }, + { + "id": "http://dbpedia.org/resource/Japan", + "lbl": "Japan", + "type": "CLASS", + "meta": { + "xrefs": [ + { + "val": "GAZ:00002747" + } + ] + } + }, + { + "id": "http://dbpedia.org/resource/North_Korea", + "lbl": "North Korea", + "type": "CLASS", + "meta": { + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "Democratic People's Republic of Korea" + } + ], + "xrefs": [ + { + "val": "GAZ:00002801" + } + ] + } + }, + { + "id": "http://dbpedia.org/resource/Philippines", + "lbl": "Philippines", + "type": "CLASS", + "meta": { + "xrefs": [ + { + "val": "GAZ:00004525" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0000118", + "val": "The Philippines" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CLO_0036460", + "lbl": "GM06944", + "type": "CLASS", + "meta": { + "definition": { + "val": "TRANSLOCATED CHROMOSOME" + }, + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "GM06944 cell" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CLO_0036870", + "lbl": "GM07029", + "type": "CLASS", + "meta": { + "definition": { + "val": "INTERNATIONAL HAPMAP PROJECT - CEPH (PLATE I) [UTAH RESIDENTS WITH ANCESTRY FROM NORTHERN AND WESTERN EUROPE] CEPH/UTAH PEDIGREE 1340 CYTOCHROME P450, SUBFAMILY IIC, POLYPEPTIDE 19; CYP2C19" + }, + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "GM07029 cell" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000000", + "lbl": "cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A material entity of anatomical origin (part of or deriving from an organism) that has as its parts a maximally connected cell compartment surrounded by a plasma membrane.", + "xrefs": ["CARO:mah"] + }, + "comments": [ + "The definition of cell is intended to represent all cells, and thus a cell is defined as a material entity and not an anatomical structure, which implies that it is part of an organism (or the entirety of one)." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/ubprop#_upper_level" + ], + "xrefs": [ + { + "val": "CALOHA:TS-2035" + }, + { + "val": "CALOHA:TS-2035\n" + }, + { + "val": "FBbt:00007002" + }, + { + "val": "FMA:68646" + }, + { + "val": "FMA:68646\n " + }, + { + "val": "GO:0005623" + }, + { + "val": "GO:0005623\n" + }, + { + "val": "KUPO:0000002" + }, + { + "val": "KUPO:0000002\n\n" + }, + { + "val": "MESH:D002477" + }, + { + "val": "NCIt:C12508" + }, + { + "val": "NCIt:C48694" + }, + { + "val": "VHOG:0001533" + }, + { + "val": "VHOG:0001533\n\n" + }, + { + "val": "WBbt:0004017" + }, + { + "val": "WBbt:0004017\n" + }, + { + "val": "XAO:0003012" + }, + { + "val": "XAO:0003012\n\n" + }, + { + "val": "ZFA:0009000" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000002", + "lbl": "obsolete immortal cell line cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "OBSOLETE: A cell line cell that is expected to be capable of an unlimited number of divisions, and is thus able to support indefinite growth/propagation in vitro as part of a immortal cell line.", + "xrefs": ["ReO:mhb"] + }, + "comments": [ + "Obsoleted in July 2013 and replaced by the CLO 'immortal cell line cell' class, as a result of CLO-OBI-CL alignment efforts.\n\nCovers cells actively being cultured or stored in a quiescent state for future use." + ], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "continuous cell line cell" + }, + { + "pred": "hasExactSynonym", + "val": "permanent cell line cell" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0100001", + "val": "http://purl.obolibrary.org/obo/CLO_0000019" + }, + { + "pred": "http://purl.obolibrary.org/obo/IAO_0100001", + "val": "http://purl.obolibrary.org/obo/CLO_0000019" + }, + { + "pred": "http://www.ebi.ac.uk/efo/obsoleted_in_version", + "val": "3.16.0" + }, + { + "pred": "http://www.ebi.ac.uk/efo/reason_for_obsolescence", + "val": "Use http://purl.obolibrary.org/obo/CLO_0000019" + } + ], + "deprecated": true + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000007", + "lbl": "early embryonic cell (metazoa)", + "type": "CLASS", + "meta": { + "definition": { + "val": "A cell found in the embryo before the formation of all the gem layers is complete.", + "xrefs": ["GOC:tfm"] + }, + "xrefs": [ + { + "val": "ZFA:0009002" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000010", + "lbl": "cultured cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A cell in vitro that is or has been maintained or propagated as part of a cell culture.", + "xrefs": ["ReO:mhb"] + }, + "comments": [ + "Note that this class was re-labeled to 'cultured cell' instead of 'cell line cell', as it intent was clarified to cover any cultured cells of multicellular and unicellular organisms. This includes cells actively being cultured, or cells that have been cultured but are stored in a quiescent state for future use. In having been cultured, cells must establish homeostasis and often replicate in a foreign environment. Accomodation of this stress initiates a selection of cells fit for such challenges, wherein necessary adaptive biochemical and.or genetic changes can occur. These changes can set them apart from the in vivo cells from which they derive, and such changes will typically accumulate and change over increasing time in culture." + ], + "xrefs": [ + { + "val": "MESH:D002478" + }, + { + "val": "MO:562" + }, + { + "val": "MeSH:D002460" + }, + { + "val": "NCIt:C16403" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000015", + "lbl": "male germ cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A germ cell that supports male gamete production. In some species, non-germ cells known as Sertoli cells also play a role in spermatogenesis.", + "xrefs": [ + "PMID:29462262", + "https://orcid.org/0000-0001-5208-3432" + ] + }, + "subsets": ["http://purl.obolibrary.org/obo/cl#cellxgene_subset"], + "xrefs": [ + { + "val": "FMA:72290" + }, + { + "val": "MA:0002765" + }, + { + "val": "VHOG:0001531" + }, + { + "val": "ncithesaurus:Spermatogenic_Cell" + } + ], + "basicPropertyValues": [ + { + "pred": "http://www.w3.org/2000/01/rdf-schema#seeAlso", + "val": "https://github.com/obophenotype/cell-ontology/issues/574" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000019", + "lbl": "sperm", + "type": "CLASS", + "meta": { + "definition": { + "val": "A mature male germ cell that develops from a spermatid.", + "xrefs": ["GOC:tfm", "MESH:D013094"] + }, + "subsets": ["http://purl.obolibrary.org/obo/cl#cellxgene_subset"], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "sperm cell" + }, + { + "pred": "hasExactSynonym", + "val": "spermatozoid" + }, + { + "pred": "hasExactSynonym", + "val": "spermatozoon" + } + ], + "xrefs": [ + { + "val": "BTO:0001277" + }, + { + "val": "BTO:0002046" + }, + { + "val": "CALOHA:TS-0949" + }, + { + "val": "FBbt:00004954" + }, + { + "val": "FMA:67338" + }, + { + "val": "MA:0002765" + }, + { + "val": "MAT:0000131" + }, + { + "val": "MeSH:D012661" + }, + { + "val": "NCIt:C12602" + }, + { + "val": "NCIt:C13277" + }, + { + "val": "SAEL:93" + }, + { + "val": "WBbt:0005321" + }, + { + "val": "WBbt:0006798" + }, + { + "val": "ZFA:0009006" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000023", + "lbl": "oocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A female germ cell that has entered meiosis.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "subsets": ["http://purl.obolibrary.org/obo/cl#cellxgene_subset"], + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "oogonium" + } + ], + "xrefs": [ + { + "val": "BTO:0000964" + }, + { + "val": "CALOHA:TS-0711" + }, + { + "val": "FBbt:00004886" + }, + { + "val": "FMA:18644" + }, + { + "val": "MESH:D009865" + }, + { + "val": "NCIt:C12598" + }, + { + "val": "SNOMEDCT:86082002" + }, + { + "val": "WBbt:0006797" + }, + { + "val": "ZFA:0001109" + }, + { + "val": "ZFA:0009008" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000025", + "lbl": "egg cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A female gamete where meiosis has progressed to metaphase II and is able to participate in fertilization.", + "xrefs": ["GOC:tfm", "ISBN:0721662544"] + }, + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "mature oocyte" + }, + { + "pred": "hasExactSynonym", + "val": "ovum" + } + ], + "xrefs": [ + { + "val": "BTO:0000369" + }, + { + "val": "BTO:0003801" + }, + { + "val": "CALOHA:TS-2191" + }, + { + "val": "FBbt:00057012" + }, + { + "val": "FMA:67343" + }, + { + "val": "MAT:0000213" + }, + { + "val": "MESH:D010063" + }, + { + "val": "MeSH:D010063" + }, + { + "val": "PO:0020094" + }, + { + "val": "SNOMEDCT:73153001" + }, + { + "val": "ZFA:0001570" + } + ], + "basicPropertyValues": [ + { + "pred": "http://xmlns.com/foaf/0.1/depiction", + "val": "https://www.swissbiopics.org/api/image/Egg_cell.svg" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000031", + "lbl": "neuroblast (sensu Vertebrata)", + "type": "CLASS", + "meta": { + "definition": { + "val": "A cell that will develop into a neuron often after a migration phase.", + "xrefs": ["GOC:NV", "http://en.wikipedia.org/wiki/Neuroblast"] + }, + "subsets": ["http://purl.obolibrary.org/obo/cl#cellxgene_subset"], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "neuroblast" + } + ], + "xrefs": [ + { + "val": "BTO:0000930" + }, + { + "val": "FMA:70563" + }, + { + "val": "ZFA:0009011" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000034", + "lbl": "stem cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A relatively undifferentiated cell that retains the ability to divide and proliferate throughout life to provide progenitor cells that can differentiate into specialized cells.", + "xrefs": ["GOC:tfm", "MESH:D013234"] + }, + "comments": [ + "This term applies to metazoan. For plant stem cells, consider using PO:0004011 β€˜initial cell’ or its parent PO:0004010 β€˜meristematic cell’." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/cl#general_cell_types_upper_slim", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "animal stem cell" + } + ], + "xrefs": [ + { + "val": "CALOHA:TS-2086" + }, + { + "val": "FMA:63368" + }, + { + "val": "NCIt:C12662" + }, + { + "val": "SNOMEDCT:419758009" + }, + { + "val": "ZFA:0005957" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000037", + "lbl": "hematopoietic stem cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A stem cell from which all cells of the lymphoid and myeloid lineages develop, including blood cells and cells of the immune system. Hematopoietic stem cells lack cell markers of effector cells (lin-negative). Lin-negative is defined by lacking one or more of the following cell surface markers: CD2, CD3 epsilon, CD4, CD5 ,CD8 alpha chain, CD11b, CD14, CD19, CD20, CD56, ly6G, ter119.", + "xrefs": [ + "GOC:add", + "GOC:dsd", + "GOC:tfm", + "PMID:19022770", + "http://en.wikipedia.org/wiki/Hematopoietic_stem_cell" + ] + }, + "comments": [ + "Markers differ between species, and two sets of markers have been described for mice. HSCs are reportedly CD34-positive, CD45-positive, CD48-negative, CD150-positive, CD133-positive, and CD244-negative." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/cl#blood_and_immune_upper_slim", + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "blood forming stem cell" + }, + { + "pred": "hasExactSynonym", + "val": "hemopoietic stem cell" + }, + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "HSC" + }, + { + "pred": "hasRelatedSynonym", + "val": "colony forming unit hematopoietic" + } + ], + "xrefs": [ + { + "val": "BTO:0000725" + }, + { + "val": "CALOHA:TS-0448" + }, + { + "val": "FMA:86475" + }, + { + "val": "MESH:D006412" + }, + { + "val": "NCIt:C12551" + }, + { + "val": "SNOMEDCT:418318001" + }, + { + "val": "VHOG:0001485" + }, + { + "val": "ZFA:0009014" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000038", + "lbl": "erythroid progenitor cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A progenitor cell committed to the erythroid lineage.", + "xrefs": ["GOC:add", "ISBN:0721601464"] + }, + "subsets": [ + "http://purl.obolibrary.org/obo/cl#blood_and_immune_upper_slim", + "http://purl.obolibrary.org/obo/cl#cellxgene_subset" + ], + "synonyms": [ + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "BFU-E" + }, + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "CFU-E" + }, + { + "pred": "hasRelatedSynonym", + "val": "blast forming unit erythroid" + }, + { + "pred": "hasRelatedSynonym", + "val": "burst forming unit erythroid" + }, + { + "pred": "hasRelatedSynonym", + "val": "colony forming unit erythroid" + }, + { + "pred": "hasRelatedSynonym", + "val": "erythroid stem cell" + } + ], + "xrefs": [ + { + "val": "BTO:0004911" + }, + { + "val": "NCIt:C12526" + }, + { + "val": "ZFA:0009015" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000040", + "lbl": "monoblast", + "type": "CLASS", + "meta": { + "definition": { + "val": "A myeloid progenitor cell committed to the monocyte lineage. This cell is CD11b-positive, has basophilic cytoplasm, euchromatin, and the presence of a nucleolus.", + "xrefs": [ + "GOC:add", + "PMID:1104740", + "http://en.wikipedia.org/wiki/Monoblast", + "http://www.copewithcytokines.de" + ] + }, + "comments": [ + "Morphology: mononuclear cell, diameter 12-20 _M, non-granular, N/C ratio 3/1 - 4/1; markers: CD11b (shared with many other myeloid cells); location: Adult: bone marrow; fetal: liver, Yolk Sac; role or process: hematopoiesis, monocyte development; lineage: hematopoietic, myeloid." + ], + "synonyms": [ + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "CFU-M" + }, + { + "pred": "hasRelatedSynonym", + "val": "colony forming unit macrophage" + }, + { + "pred": "hasRelatedSynonym", + "val": "colony forming unit monocyte" + }, + { + "pred": "hasRelatedSynonym", + "val": "monocyte stem cell" + } + ], + "xrefs": [ + { + "val": "CALOHA:TS-1195" + }, + { + "val": "FMA:83553" + }, + { + "val": "NCIt:C13014" + }, + { + "val": "SNOMEDCT:53945006" + }, + { + "val": "ZFA:0009017" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000041", + "lbl": "mature eosinophil", + "type": "CLASS", + "meta": { + "definition": { + "val": "A fully differentiated eosinophil, a granular leukocyte with a nucleus that usually has two lobes connected by one or more slender threads, and cytoplasm containing coarse, round granules that are uniform in size and which can be stained by the dye eosin. Cells are also differentiated from other granulocytes by a small nuclear-to-cytoplasm ratio (1:3). This cell type is CD49d-positive.", + "xrefs": [ + "GOC:add", + "GOC:dsd", + "GOC:tfm", + "ISBN:0721601464", + "http://www.cap.org" + ] + }, + "comments": [ + "Eosinophils are CD125-positive (IL-5R), GM-CSFR-positive, IL-3R-positive, VLA4-positive. They can also express MHC Class I & II, CD4, CD9, CD11a, CD11b, CD11c, CD13, CD15, CD16, CD17, CD18, CD24, CD25,CD28, CD29, CD32, CD33, CD35, CD37, CD39, CD43, CD44, CD45, CD45RB, CD45RO, CD46, CD47, CD48, CD49d, CD49f, CD50, CD52, CD53, CD54, CD55, CD58, CD59, CD62L, CD63, CD65, CD66, CD69, CD71, CD76, CD80, CD81, CD82, CD86, CD87, CD88, CD89, CD92, CD95, CD97, CD98, CD99, CD100, CD101, CD116, CD117, CD119, CD120, CD123, CD124, CD125, CD131, CD137, CD139, CD148, CD149, CD151, CD153, CD156, CD162, CD161, CD162, CD165, CD174, CD182, CD183, CD191, CD192, CD193, CD196, CD213, IL9R, ad integrin, beta-7 integrin, FceRI, IL13Ra1, TGFbR, PAFR, LTB4R, C3aR, CystLT1R, CystLT2R, fMLPR, CRTH2 (PGD2 receptor), histamine 4R, IDO, KYN, PAR-2, Siglec-8, Siglec-10, LIR1, LIR2, LIR3, LIR7, TLR7, TLR8, and VLA-4. Eosinophils can also secrete CXCL1, eotaxin-1, GM-CSF, IL-2, IL-3, IL-4, IL-5, IL-6, IL-8, IL-10, IL-12, IL-13, IL-16, IL-18, IFN-gamma, LTC4, MIP-1alpha, NGF, PAF, RANTES, substance P, TGF-alpha, TGF-beta, TNF-alpha, and VIP." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasBroadSynonym", + "val": "polymorphonuclear leucocyte" + }, + { + "pred": "hasBroadSynonym", + "val": "polymorphonuclear leukocyte" + }, + { + "pred": "hasExactSynonym", + "val": "mature eosinocyte" + }, + { + "pred": "hasExactSynonym", + "val": "mature eosinophil leucocyte" + }, + { + "pred": "hasExactSynonym", + "val": "mature eosinophil leukocyte" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0000116", + "val": "The status of eosinophils as true professional antigen presenting cells is unclear, despite their ability to present exogenous peptides and peptides processed from exogenous proteins (in certain studies) via MHC Class II and activate T cells. Per the equivalence axioms, 'eosinophil' is reasoned to be a subclass of 'professional antigen presenting cell', though the role of eosinophils as such in the body may be limited." + }, + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000042", + "lbl": "neutrophilic myeloblast", + "type": "CLASS", + "meta": { + "definition": { + "val": "A myeloblast committed to the neutrophil lineage. This cell type is GATA-1 positive, C/EBPa-positive, AML-1-positive, c-myb-positive and has low expression of PU.1 transcription factor.", + "xrefs": [ + "GOC:add", + "ISBN:0721601464", + "PMID:12560239", + "PMID:15514007" + ] + }, + "comments": [ + "These cells are CD11b-negative, CD15-negative, CD16-negative, CD35-negative, CD49d-positive, CD68-positive, lactotransferrin-negative, and fMLP receptor-negative. They are found in the Band 3 fraction." + ], + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "neutrophilic granuloblast" + } + ], + "xrefs": [ + { + "val": "ZFA:0009018" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000043", + "lbl": "mature basophil", + "type": "CLASS", + "meta": { + "definition": { + "val": "A fully differentiated basophil, a granular leukocyte with an irregularly shaped, pale-staining nucleus that is partially constricted into two lobes, and with cytoplasm that contains coarse granules of variable size. Basophils contain vasoactive amines such as histamine and serotonin, which are released on appropriate stimulation.", + "xrefs": [ + "GOC:add", + "GOC:dsd", + "GOC:tfm", + "ISBN:0721601464", + "PMID:18466030", + "PMID:19231594", + "PMID:20837449", + "http://www.cap.org" + ] + }, + "comments": [ + "Mature basophils are also capable of producing IL-3, IL-5, IL-6, IL-8, IL-13, IL-25, CCL22, tslp, vegf, and LTC4." + ], + "synonyms": [ + { + "pred": "hasBroadSynonym", + "val": "polymorphonuclear leucocyte" + }, + { + "pred": "hasBroadSynonym", + "val": "polymorphonuclear leukocyte" + }, + { + "pred": "hasExactSynonym", + "val": "mature basophil leucocyte" + }, + { + "pred": "hasExactSynonym", + "val": "mature basophil leukocyte" + } + ], + "xrefs": [ + { + "val": "BTO:0001026" + }, + { + "val": "CALOHA:TS-0688" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000047", + "lbl": "neural stem cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "An undifferentiated neural cell that originates from the neuroectoderm and has the capacity both to perpetually self-renew without differentiating and to generate multiple central nervous system neuronal and glial cell types.", + "xrefs": ["PMID:30639325"] + }, + "subsets": ["http://purl.obolibrary.org/obo/cl#cellxgene_subset"], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "NSC" + }, + { + "pred": "hasExactSynonym", + "val": "neuronal stem cell", + "xrefs": ["PMID:16305818"] + } + ], + "xrefs": [ + { + "val": "BTO:0002881" + }, + { + "val": "CALOHA:TS-2360" + }, + { + "val": "FMA:86684" + }, + { + "val": "NCIt:C12985" + }, + { + "val": "ZFA:0009019" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000048", + "lbl": "multi fate stem cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A stem cell that can give rise to multiple lineages of cells.", + "xrefs": ["GOC:add"] + }, + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "multi-fate stem cell" + }, + { + "pred": "hasExactSynonym", + "val": "multifate stem cell" + }, + { + "pred": "hasExactSynonym", + "val": "multipotent cell" + }, + { + "pred": "hasExactSynonym", + "val": "multipotent stem cell" + } + ], + "xrefs": [ + { + "val": "FMA:84789" + }, + { + "val": "ZFA:0009020" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000049", + "lbl": "common myeloid progenitor", + "type": "CLASS", + "meta": { + "definition": { + "val": "A progenitor cell committed to myeloid lineage, including the megakaryocyte and erythroid lineages.", + "xrefs": ["GOC:add", "ISBN:0878932437", "MESH:D023461"] + }, + "comments": [ + "This cell type is intended to be compatible with any vertebrate common myeloid progenitor. For mammalian CMP known to be CD34-positive, please use the term 'common myeloid progenitor, CD34-positive' (CL_0001059)." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "common myeloid precursor" + }, + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "CFU-GEMM", + "xrefs": ["ISBN:0878932437"] + }, + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "CFU-S", + "xrefs": ["ISBN:0878932437"] + }, + { + "synonymType": "http://purl.obolibrary.org/obo/OMO_0003000", + "pred": "hasRelatedSynonym", + "val": "CMP", + "xrefs": ["ISBN:0878932437"] + }, + { + "pred": "hasRelatedSynonym", + "val": "colony forming unit granulocyte, erythrocyte, macrophage, and megakaryocyte", + "xrefs": ["ISBN:0878932437"] + }, + { + "pred": "hasRelatedSynonym", + "val": "multipotential myeloid stem cell", + "xrefs": ["ISBN:0878932437"] + }, + { + "pred": "hasRelatedSynonym", + "val": "myeloid stem cell", + "xrefs": ["ISBN:0878932437"] + }, + { + "pred": "hasRelatedSynonym", + "val": "pluripotent stem cell (bone marrow)", + "xrefs": ["ISBN:0878932437"] + } + ], + "xrefs": [ + { + "val": "BTO:0004730" + }, + { + "val": "ZFA:0009021" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000050", + "lbl": "megakaryocyte-erythroid progenitor cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "A progenitor cell committed to the megakaryocyte and erythroid lineages.", + "xrefs": [ + "GOC:add", + "GOC:dsd", + "GOC:tfm", + "MESH:D055015", + "PMID:16647566", + "http://en.wikipedia.org/wiki/Megakaryocyte-erythroid_progenitor_cell" + ] + }, + "comments": [ + "MEPs are reportedly CD19-negative, CD34-negative, CD45RA-negative, CD110-positive, CD117-positive, and SCA1-negative and reportedly express the transcription factors GATA-1 and NF-E2." + ], + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasExactSynonym", + "val": "CFU-EM" + }, + { + "pred": "hasExactSynonym", + "val": "CFU-MegE" + }, + { + "pred": "hasExactSynonym", + "val": "MEP" + }, + { + "pred": "hasExactSynonym", + "val": "Meg/E progenitor" + }, + { + "pred": "hasExactSynonym", + "val": "colony forming unit erythroid megakaryocyte" + }, + { + "pred": "hasExactSynonym", + "val": "megakaryocyte/erythrocyte progenitor" + }, + { + "pred": "hasExactSynonym", + "val": "megakaryocyte/erythroid progenitor cell" + } + ], + "xrefs": [ + { + "val": "ZFA:0009022" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + } + ] + } + } + ], + "edges": [ + { + "sub": "http://dbpedia.org/resource/China", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/NCIT_C25464" + }, + { + "sub": "http://dbpedia.org/resource/India", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/NCIT_C25464" + }, + { + "sub": "http://dbpedia.org/resource/Iran", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/NCIT_C25464" + }, + { + "sub": "http://dbpedia.org/resource/Japan", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/NCIT_C25464" + }, + { + "sub": "http://dbpedia.org/resource/North_Korea", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/NCIT_C25464" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000000", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/GO_0005575" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000002", + "pred": "is_a", + "obj": "http://www.w3.org/2002/07/owl#Thing" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000007", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0002321" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000010", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000010", + "pred": "http://purl.obolibrary.org/obo/RO_0000056", + "obj": "http://www.ebi.ac.uk/efo/EFO_0002694" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000015", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000586" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000019", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000015" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000019", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/UBERON_0000061" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000019", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0000079" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000023", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000586" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000023", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0000474" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000025", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000586" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000025", + "pred": "is_a", + "obj": "http://www.ebi.ac.uk/efo/EFO_0000988" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000031", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000055" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000034", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_1000497", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0008019", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002494", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002351", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002319", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002319", + "pred": "is_a", + "obj": "http://www.ebi.ac.uk/efo/EFO_0002963" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002319", + "pred": "http://purl.obolibrary.org/obo/RO_0001025", + "obj": "http://purl.obolibrary.org/obo/UBERON_0001016" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002321", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002092", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0001063", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000988", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000670", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000628", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000586", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000520", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000520", + "pred": "is_a", + "obj": "http://www.ebi.ac.uk/efo/EFO_0000324" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000521", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000000" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000521", + "pred": "is_a", + "obj": "http://www.ebi.ac.uk/efo/EFO_0000324" + } + ] + } + ] +} diff --git a/tests/gentropy/data_samples/eqtl_catalogue_studies_sample.tsv b/tests/gentropy/data_samples/eqtl_catalogue_studies_sample.tsv deleted file mode 100644 index f756ecd6e..000000000 --- a/tests/gentropy/data_samples/eqtl_catalogue_studies_sample.tsv +++ /dev/null @@ -1,11 +0,0 @@ -study qtl_group tissue_ontology_id tissue_ontology_term tissue_label condition_label quant_method ftp_path -GTEx_V8 Adipose_Subcutaneous UBER_0002190 subcutaneous adipose tissue Adipose - Subcutaneous naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz -GTEx_V8 Adipose_Visceral_Omentum UBER_0010414 omental fat pad Adipose - Visceral (Omentum) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adipose_Visceral_Omentum.tsv.gz -GTEx_V8 Adrenal_Gland UBER_0002369 adrenal gland Adrenal Gland naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Adrenal_Gland.tsv.gz -GTEx_V8 Artery_Aorta UBER_0001496 ascending aorta Artery - Aorta naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Aorta.tsv.gz -GTEx_V8 Artery_Coronary UBER_0001621 coronary artery Artery - Coronary naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Coronary.tsv.gz -GTEx_V8 Artery_Tibial UBER_0007610 tibial artery Artery - Tibial naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Artery_Tibial.tsv.gz -GTEx_V8 Brain_Amygdala UBER_0001876 amygdala Brain - Amygdala naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Amygdala.tsv.gz -GTEx_V8 Brain_Anterior_cingulate_cortex_BA24 UBER_0009835 anterior cingulate cortex Brain - Anterior cingulate cortex (BA24) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Anterior_cingulate_cortex_BA24.tsv.gz -GTEx_V8 Brain_Caudate_basal_ganglia UBER_0001873 caudate nucleus Brain - Caudate (basal ganglia) naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Caudate_basal_ganglia.tsv.gz -GTEx_V8 Brain_Cerebellar_Hemisphere UBER_0002037 cerebellum Brain - Cerebellar Hemisphere naive ge ftp://ftp.ebi.ac.uk/pub/databases/spot/eQTL/imported/GTEx_V8/ge/Brain_Cerebellar_Hemisphere.tsv.gz diff --git a/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp b/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp new file mode 100644 index 000000000..052399388 --- /dev/null +++ b/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp @@ -0,0 +1,90 @@ +trait region v rsid chromosome position allele1 allele2 maf beta se p mean sd prob cs cs_specific_prob low_purity lead_r2 mean_99 sd_99 prob_99 cs_99 cs_specific_prob_99 low_purity_99 lead_r2_99 alpha1 alpha2 alpha3 alpha4 alpha5 alpha6 alpha7 alpha8 alpha9 alpha10 mean1 mean2 mean3 mean4 mean5 mean6 mean7 mean8 mean9 mean10 sd1 sd2 sd3 sd4 sd5 sd6 sd7 sd8 sd9 sd10 lbf_variable1 lbf_variable2 lbf_variable3 lbf_variable4 lbf_variable5 lbf_variable6 lbf_variable7 lbf_variable8 lbf_variable9 lbf_variable10 +AB1_EBV chr6:1412516-4412516 6:2898066:G:T chr6_2898066_G_T chr6 2898066 G T 0.413765 0.192277 0.0298155 1.12676e-10 0.0329796138322914 0.0726322608911893 0.175343223649957 1 0.17509358936193 0 0.829216035769 0.0329796138322914 0.0726322608911893 0.175343223649957 1 0.17509358936193 0 0.829216035769 0.17509358936193 1.43993284524406e-05 3.60778561866872e-05 3.60648003884279e-05 3.60463349785855e-05 3.60278897859947e-05 3.60134896639449e-05 3.60060022461947e-05 3.60073664773458e-05 3.60187793017426e-05 0.0329766994994914 2.57161576786077e-07 3.31357531479788e-07 3.31581920897055e-07 3.31896507403073e-07 3.32212185390434e-07 3.32463786669888e-07 3.32605524722194e-07 3.32606528595316e-07 3.3244723805964e-07 0.0726311826236639 0.000126488575709164 0.000132387886331515 0.000132445000681512 0.000132525304968958 0.00013260558503703 0.000132668849958987 0.000132703150483526 0.000132700432413816 0.000132655610635964 18.5528693035569 -0.907607419163184 -0.195319530537169 -0.195641777295255 -0.196097663493068 -0.196552998035164 -0.196908246717843 -0.197092464695888 -0.197057687849098 -0.196774385008403 +AB1_EBV chr6:1412516-4412516 6:2898362:A:G chr6_2898362_A_G chr6 2898362 A G 0.443219 0.194397 0.0300071 9.27257e-11 0.0241861868176693 0.0638457314593366 0.128984802300941 1 0.128501831150163 0 0.468032488641 0.0241861868176693 0.0638457314593366 0.128984802300941 1 0.128501831150163 0 0.468032488641 0.128501831150163 4.5718571259867e-05 6.35067335181723e-05 6.35268204571264e-05 6.35549284123062e-05 6.35828685460672e-05 6.36046221942562e-05 6.36159391721562e-05 6.36139574209168e-05 6.35968920726836e-05 0.0241721312923613 2.13319750249321e-06 1.48299548305333e-06 1.48511049788324e-06 1.48808727845368e-06 1.49105919339296e-06 1.49338558929439e-06 1.49461138816016e-06 1.49442930680649e-06 1.49264906846324e-06 0.0638408505215491 0.000369070254874925 0.000245869167457302 0.000246119260779774 0.000246471397738596 0.000246822988506741 0.000247098297537043 0.000247243598398107 0.000247222620317828 0.000247012843232762 18.2434918306617 0.247715599243637 0.370147134295912 0.37050307766634 0.371001689249645 0.371497718747115 0.371884315841652 0.372085936546344 0.372051672829573 0.371749767645852 +AB1_EBV chr6:1412516-4412516 6:2898390:T:C chr6_2898390_T_C chr6 2898390 T C 0.0759868 0.063491 0.056021 0.25707 4.31960345414416e-05 0.00196441267952157 0.00075046097081477 -1 NA NA NA 4.31960345414416e-05 0.00196441267952157 0.00075046097081477 -1 NA NA NA 3.93838174054942e-10 8.09816386834445e-05 8.35285041586315e-05 8.358390349547e-05 8.36617711445916e-05 8.37390173140435e-05 8.37985885393119e-05 8.38283740382775e-05 8.38201989302556e-05 8.37690030828716e-05 2.21782417886126e-11 8.40987313953194e-06 4.32181362915771e-06 4.32953616230941e-06 4.34041881168691e-06 4.35126272348911e-06 4.35969622337004e-06 4.36402915653852e-06 4.36311925498564e-06 4.35626326213054e-06 1.56709910069891e-06 0.00104868422604798 0.000584775010658085 0.000585504251701282 0.000586531786129352 0.000587555924454652 0.000588353554304855 0.000588766075105534 0.00058868635013728 0.000588048090257165 -1.35977706153615 0.819433456645043 0.644189135136349 0.644891851168843 0.645879279429021 0.646858672726141 0.647614336265917 0.647993424205583 0.647892786053872 0.647248212724249 +AB1_EBV chr6:1412516-4412516 6:2898544:G:A chr6_2898544_G_A chr6 2898544 G A 0.000162658 -1.06485 1.263 0.399165 -0.000142307972554879 0.0174158850922084 0.000311180806728872 -1 NA NA NA -0.000142307972554879 0.0174158850922084 0.000311180806728872 -1 NA NA NA 3.3135651989527e-10 1.52689507421236e-05 3.70370646643062e-05 3.70247425398274e-05 3.70073367344066e-05 3.69899109471804e-05 3.69762228369255e-05 3.69689522016209e-05 3.69699116314651e-05 3.6980218847936e-05 -3.43352664772061e-10 -1.31256485573238e-05 -1.61079999492037e-05 -1.6119506258209e-05 -1.6135711269742e-05 -1.61518735029245e-05 -1.61645243654611e-05 -1.61712251774856e-05 -1.61703323205355e-05 -1.6160807801329e-05 2.95278730463148e-05 0.00574326803029291 0.00580365618281197 0.00580635729320344 0.00581016191629574 0.00581395759104792 0.00581692952751578 0.00581850423125729 0.00581829515872435 0.00581605883240119 -1.53252226561108 -0.848967586219725 -0.169079646723388 -0.169372702017943 -0.169786674000275 -0.17020115447332 -0.170526747831395 -0.170699687623306 -0.170676847074374 -0.17043169077503 +AB1_EBV chr6:1412516-4412516 6:2898634:A:G chr6_2898634_A_G chr6 2898634 A G 0.00990053 -0.0578846 0.155065 0.708929 3.36036046428797e-06 0.00177237672153217 0.00027298259335895 -1 NA NA NA 3.36036046428797e-06 0.00177237672153217 0.00027298259335895 -1 NA NA NA 2.45728985394081e-10 1.18511459605607e-05 3.26983764410425e-05 3.26831287402668e-05 3.26616014503584e-05 3.26400678296922e-05 3.26231695999668e-05 3.26142077268511e-05 3.26154135009179e-05 3.26281696699098e-05 -1.13844933399768e-11 1.98687927513989e-07 3.94710720255768e-07 3.94852414729217e-07 3.95050128659409e-07 3.95248276157307e-07 3.95406902746122e-07 3.95498447227266e-07 3.95504388775756e-07 3.95412642716477e-07 2.50933551331188e-06 0.000507185455541354 0.000599816995638025 0.00059999301326225 0.000600240532874255 0.00060048710965031 0.000600680011385158 0.000600782359514579 0.000600769347073544 0.000600625192283742 -1.83148791747326 -1.10236442097249 -0.29367337908761 -0.294100104367622 -0.294702736769016 -0.295305744621835 -0.295779068020591 -0.29603010504238 -0.295996246331836 -0.295638819167599 +AB1_EBV chr6:1412516-4412516 6:2898644:T:C chr6_2898644_T_C chr6 2898644 T C 0.118276 0.0617586 0.0458201 0.177706 0.000125511810900469 0.0034159962920344 0.00182190717924902 -1 NA NA NA 0.000125511810900469 0.0034159962920344 0.00182190717924902 -1 NA NA NA 4.99625110164512e-10 0.000374713090516501 0.000180149143340477 0.000180420738438503 0.000180804029116973 0.000181186404788696 0.000181484208566077 0.000181637677334594 0.000181606348560438 0.000181365328632569 2.78040407063015e-11 4.2635373091066e-05 1.02671877785273e-05 1.02939763337702e-05 1.03318266007943e-05 1.03696614548733e-05 1.03992204262546e-05 1.04145817520178e-05 1.04117330753764e-05 1.03882225837485e-05 1.60359727996177e-06 0.00235589933186244 0.000869385262846467 0.000870883775241722 0.000872998948126608 0.000875111357562359 0.000876761378346027 0.000877621128059248 0.000877468732854278 0.000876167427429173 -1.12185912318842 2.35137165177169 1.41278627628876 1.41433245064316 1.41651087554207 1.41868000920298 1.42036681690019 1.4212358006416 1.42106019484617 1.4196985525637 +AB1_EBV chr6:1412516-4412516 6:2898830:A:G chr6_2898830_A_G chr6 2898830 A G 0.000489288 -0.517711 0.741123 0.484834 -7.05337249388736e-05 0.00977642959411629 0.000301195614534455 -1 NA NA NA -7.05337249388736e-05 0.00977642959411629 0.000301195614534455 -1 NA NA NA 2.97764493146971e-10 1.43401826588032e-05 3.59071858643746e-05 3.58941405813954e-05 3.58757109199825e-05 3.58572625522856e-05 3.5842773584086e-05 3.58350787098728e-05 3.58360952711092e-05 3.584700788488e-05 -1.50380125009478e-10 -6.30023739860649e-06 -8.01001018220035e-06 -8.01556149521334e-06 -8.02337146677288e-06 -8.03115738911102e-06 -8.03725003519927e-06 -8.04047655572757e-06 -8.04004705958623e-06 -8.03546297633142e-06 1.53506655570811e-05 0.00312826418533324 0.00326989814640512 0.00327130492779428 0.00327328536956076 0.00327526049902121 0.00327680659330808 0.0032776256749774 0.00327751699993004 0.00327635402345175 -1.63941427810691 -0.911723416607235 -0.200061366819909 -0.20038504129272 -0.200842366638393 -0.2013002246487 -0.201659854812704 -0.201850852419317 -0.201825596480631 -0.201554733229527 +AB1_EBV chr6:1412516-4412516 6:2898852:T:C chr6_2898852_T_C chr6 2898852 T C 0.0024569 -0.0135518 0.324193 0.966657 -1.90309295779787e-05 0.00392799672003962 0.000283694464996431 -1 NA NA NA -1.90309295779787e-05 0.00392799672003962 0.000283694464996431 -1 NA NA NA 2.34840617180525e-10 1.28335944565251e-05 3.39111799170108e-05 3.38970129876025e-05 3.38770069576382e-05 3.3856987559621e-05 3.3841267667435e-05 3.38329164730246e-05 3.38340098433433e-05 3.38458341753585e-05 -2.09651795148505e-12 -1.63067161461712e-06 -2.16968783989117e-06 -2.17123876945852e-06 -2.17342034713896e-06 -2.17559432396506e-06 -2.17729339929383e-06 -2.17818917940871e-06 -2.17806108789175e-06 -2.17677091979559e-06 4.91110635777357e-06 0.0011870206897283 0.00132217297406661 0.001322651864879 0.00132332577835033 0.00132399749839758 0.00132452293088544 0.00132480093897028 0.00132476346769777 0.00132436755008538 -1.87681010143231 -1.02272268973018 -0.257254054557634 -0.257632210418853 -0.258166333679878 -0.25870094760849 -0.259120833215976 -0.259343929571735 -0.259314724759633 -0.258998910137287 +AB1_EBV chr6:1412516-4412516 6:2899158:A:C chr6_2899158_A_C chr6 2899158 A C 0.0385391 -0.0845606 0.0783558 0.280505 -1.06305709374504e-06 0.000890585228214677 0.000271879605582837 -1 NA NA NA -1.06305709374504e-06 0.000890585228214677 0.000271879605582837 -1 NA NA NA 3.89971767959007e-10 1.18853024263449e-05 3.25560426474199e-05 3.25408385949403e-05 3.25193782421875e-05 3.2497910462905e-05 3.24810583812967e-05 3.24721091331244e-05 3.24732843530629e-05 3.24859607402584e-05 -3.04216196484357e-11 -1.20773208732576e-07 -1.17467876151092e-07 -1.17558562261101e-07 -1.17689048444265e-07 -1.17819396074175e-07 -1.1792032044286e-07 -1.17971037817629e-07 -1.17957314252656e-07 -1.17869907949035e-07 2.17049329642282e-06 0.000257383025890685 0.000301128541857739 0.000301216604637751 0.000301340511307874 0.000301463928398313 0.000301560402178935 0.000301611424323912 0.000301604540952648 0.000301531828463628 -1.36964281405956 -1.09948644286867 -0.298035812202123 -0.298463235801365 -0.299066691853802 -0.299670559011449 -0.300144727480335 -0.300396577946486 -0.300363498356908 -0.300006815940666 +AB1_EBV chr6:1412516-4412516 6:2899177:C:T chr6_2899177_C_T chr6 2899177 C T 0.00149376 0.210318 0.395069 0.594478 1.1087286785856e-05 0.00454796513625276 0.000274177154775179 -1 NA NA NA 1.1087286785856e-05 0.00454796513625276 0.000274177154775179 -1 NA NA NA 2.67372961757553e-10 1.20357475324825e-05 3.28237946821668e-05 3.28087983026664e-05 3.27876271505826e-05 3.27664482961326e-05 3.27498248649085e-05 3.27410018608325e-05 3.27421727690368e-05 3.27546968813631e-05 5.32485539737573e-11 9.41836094528548e-07 1.26508166244442e-06 1.26597518122759e-06 1.26723377472505e-06 1.268490108755e-06 1.26947525977421e-06 1.26999997624907e-06 1.26993668153731e-06 1.26920479806084e-06 7.16606946438526e-06 0.0013219318002017 0.00153689317083669 0.00153736560443222 0.00153803021717581 0.00153869238437754 0.00153921027711139 0.00153948458599627 0.00153944848834106 0.00153905955204809 -1.74707261650093 -1.0869078068944 -0.289845105629987 -0.29026238810814 -0.29085163390118 -0.291441278779356 -0.291904213443387 -0.292149946326287 -0.292117295645589 -0.291768466701535 +AB1_EBV chr6:1412516-4412516 6:2899240:C:G chr6_2899240_C_G chr6 2899240 C G 0.0666566 -0.0741942 0.0595902 0.213105 -2.35036062319914e-06 0.00069660721485727 0.000277034829564426 -1 NA NA NA -2.35036062319914e-06 0.00069660721485727 0.000277034829564426 -1 NA NA NA 5.29478798776676e-10 1.2187859861444e-05 3.31625006174758e-05 3.31473453882313e-05 3.31259462375983e-05 3.31045519310923e-05 3.30877873025634e-05 3.30789417366297e-05 3.30802378336914e-05 3.30930509408374e-05 -3.97653759915523e-11 -1.80278726260054e-07 -2.7087361447815e-07 -2.70978473752448e-07 -2.71125234085206e-07 -2.71274104665597e-07 -2.71396403440742e-07 -2.71472184299646e-07 -2.71487842059741e-07 -2.71434274781564e-07 2.19598734227066e-06 0.000203049208153187 0.000235341514858765 0.000235413753819564 0.000235515338999907 0.000235616680522203 0.000235696231531389 0.000235738912010994 0.000235734565442074 0.000235676718860371 -1.06382403655627 -1.07434862642961 -0.279579067553628 -0.279996473824015 -0.28058600754497 -0.281175559326416 -0.281637577243573 -0.281881239704408 -0.281845169961472 -0.281491515746687 +AB1_EBV chr6:1412516-4412516 6:2899287:G:A chr6_2899287_G_A chr6 2899287 G A 0.000973672 0.986415 0.535162 0.065298 0.000205637050101746 0.0126007782851599 0.000497212565959249 -1 NA NA NA 0.000205637050101746 0.0126007782851599 0.000497212565959249 -1 NA NA NA 1.21738607486518e-09 3.6312730369849e-05 5.75982567906221e-05 5.76063163334434e-05 5.76176058640543e-05 5.76288416022498e-05 5.76376454787103e-05 5.76423596489159e-05 5.76418647761721e-05 5.76354359891861e-05 1.1680419720311e-09 2.75315948481859e-05 2.21712096584771e-05 2.21977200026116e-05 2.22350866021457e-05 2.22724309351061e-05 2.23017363944456e-05 2.23173233289229e-05 2.2315353047048e-05 2.22934272428311e-05 3.82248679592031e-05 0.00548996456467016 0.00399781093087686 0.00400131834219449 0.00400626261432472 0.00401120330696571 0.00401507928280891 0.00401713908431259 0.00401687504406763 0.00401397001993241 -0.231255883141779 0.0173793892737324 0.272493497554994 0.272673111793488 0.272925321253496 0.273176811812416 0.273374093684475 0.273479589676235 0.273467892984359 0.273322751959984 +AB1_EBV chr6:1412516-4412516 6:2899309:C:T chr6_2899309_C_T chr6 2899309 C T 0.00201975 -0.222409 0.355153 0.531161 -5.69774573358679e-05 0.00551697685252187 0.00034144100434419 -1 NA NA NA -5.69774573358679e-05 0.00551697685252187 0.00034144100434419 -1 NA NA NA 2.8470006636764e-10 1.81775181581979e-05 4.04492007225223e-05 4.04391980402028e-05 4.04250432914032e-05 4.0410845371332e-05 4.03996652542573e-05 4.03936943770997e-05 4.03944168669415e-05 4.04027431440506e-05 -6.20618320233197e-11 -5.67953826532967e-06 -6.39495570484508e-06 -6.39996837016291e-06 -6.40702208170669e-06 -6.41405240374765e-06 -6.41954772365366e-06 -6.42244442944812e-06 -6.42202579005806e-06 -6.41784050508404e-06 6.97085070922511e-06 0.00195382940556986 0.00182064312290325 0.00182165207819596 0.00182307294576125 0.00182449032343091 0.00182559954701346 0.00182618589315656 0.00182610460264635 0.00182526475596744 -1.68428093331602 -0.674603424930791 -0.0809519219688912 -0.0811595453629046 -0.0814533807374165 -0.0817481541047984 -0.0819803287269014 -0.0821044253045882 -0.0820896506889417 -0.0819171524572564 +AB1_EBV chr6:1412516-4412516 6:2899314:G:A chr6_2899314_G_A chr6 2899314 G A 0.00135432 -0.0619992 0.437623 0.887339 -2.43115488702986e-05 0.0052673935976394 0.000282464733497689 -1 NA NA NA -2.43115488702986e-05 0.0052673935976394 0.000282464733497689 -1 NA NA NA 2.3761345399726e-10 1.26853254402591e-05 3.37776612443965e-05 3.37629959130597e-05 3.37422920681702e-05 3.37215779436554e-05 3.3705316942895e-05 3.36966852850623e-05 3.36978302318604e-05 3.37100809368494e-05 -1.60019770592677e-11 -2.02382570470464e-06 -2.78067427247183e-06 -2.78220489258914e-06 -2.78436135757928e-06 -2.78651083235294e-06 -2.78819262804003e-06 -2.78908448212784e-06 -2.78896942551408e-06 -2.78770927294178e-06 6.74620903076303e-06 0.00157718883328219 0.00177478256886408 0.00177538443340019 0.00177623154657695 0.00177707582465066 0.001777736310445 0.00177808617502091 0.00177804004370986 0.00177754378462498 -1.86507195026131 -1.0343431411693 -0.261199131574553 -0.261593701171978 -0.262150849036905 -0.262708425310302 -0.26314623017427 -0.263378645288213 -0.263347779268952 -0.263017904506943 +AB1_EBV chr6:1412516-4412516 6:2899350:T:C chr6_2899350_T_C chr6 2899350 T C 0.0355572 -0.000819206 0.0800958 0.991839 7.32864915311251e-06 0.0010478896155351 0.000299176292555825 -1 NA NA NA 7.32864915311251e-06 0.0010478896155351 0.000299176292555825 -1 NA NA NA 2.35265856190137e-10 1.43878771095247e-05 3.56470650085047e-05 3.56345405861951e-05 3.56168563699093e-05 3.55991379878365e-05 3.55851838546828e-05 3.55776997009629e-05 3.55785165932683e-05 3.55887681763074e-05 -1.23441442927995e-12 6.88880582696483e-07 8.27671568238661e-07 8.28342793131389e-07 8.29288982520426e-07 8.30230315026994e-07 8.30961543885504e-07 8.31338047714907e-07 8.31262512882923e-07 8.30674041429651e-07 1.21663962920582e-06 0.000339449598993973 0.000349968305915352 0.000350124878355504 0.000350345466973101 0.000350565296261939 0.000350736897475 0.000350826848316304 0.000350812640677258 0.00035068013845627 -1.87500098307431 -0.908403004792035 -0.207331990118194 -0.207643699799531 -0.208083837774638 -0.208524929091143 -0.208872460501747 -0.209059089630061 -0.209039240525643 -0.208784747312844 +AB1_EBV chr6:1412516-4412516 6:2899430:C:T chr6_2899430_C_T chr6 2899430 C T 0.000430113 0.554905 0.722716 0.442603 5.99156548867282e-05 0.00925033668662987 0.000294727962604879 -1 NA NA NA 5.99156548867282e-05 0.00925033668662987 0.000294727962604879 -1 NA NA NA 3.11709759048175e-10 1.37827163651308e-05 3.51696672118842e-05 3.51561909498981e-05 3.51371577219624e-05 3.51181105109568e-05 3.51031565024186e-05 3.50952206845135e-05 3.50962811425252e-05 3.51075610491758e-05 1.67637675055622e-10 5.27800908307061e-06 6.81350052228466e-06 6.81818455565397e-06 6.82477697793433e-06 6.83135208246479e-06 6.83650155819372e-06 6.83923579239388e-06 6.83888830119467e-06 6.83503837586246e-06 1.57838568324735e-05 0.00290440207718282 0.00310074207519064 0.00310200196189509 0.00310377565859856 0.00310554461097979 0.00310692951042729 0.00310766375394084 0.00310756776217689 0.00310652822535614 -1.59364466532564 -0.951373619511788 -0.220814821468332 -0.221158376272983 -0.221643662025386 -0.222129386452423 -0.22251077260167 -0.222713159948769 -0.222686055239937 -0.22239831294462 +AB1_EBV chr6:1412516-4412516 6:2899448:A:G chr6_2899448_A_G chr6 2899448 A G 0.00026419 0.82525 0.994775 0.406774 0.000105775492105234 0.0134979386420686 0.00030746990816144 -1 NA NA NA 0.000105775492105234 0.0134979386420686 0.00030746990816144 -1 NA NA NA 3.28071092823362e-10 1.4927362759166e-05 3.66168144960311e-05 3.66041907262449e-05 3.65863580856004e-05 3.65685066985302e-05 3.65544866637575e-05 3.65470429953807e-05 3.65480326160835e-05 3.65586017273023e-05 2.63854267004587e-10 9.65701937130248e-06 1.19857159185444e-05 1.19941284407886e-05 1.20059722797453e-05 1.20177841993937e-05 1.20270313207347e-05 1.20319336962253e-05 1.20312923835425e-05 1.20243506406901e-05 2.30045101988549e-05 0.00440559444046247 0.00450385284642857 0.0045058870612298 0.00450875179867735 0.00451160956843206 0.00451384716570932 0.00451503315975474 0.00451487684830838 0.00451319510196308 -1.54248682940356 -0.871593033839509 -0.180491258267593 -0.180796373893336 -0.181227416082072 -0.18165895556074 -0.181997895073484 -0.182177838391413 -0.182153872189501 -0.18189833484089 +AB1_EBV chr6:1412516-4412516 6:2899745:G:A chr6_2899745_G_A chr6 2899745 G A 0.000117045 -1.36897 1.53632 0.372891 -0.000214482894300735 0.0226752228956154 0.000327842170640524 -1 NA NA NA -0.000214482894300735 0.0226752228956154 0.000327842170640524 -1 NA NA NA 3.4598841215619e-10 1.68188102648398e-05 3.8921837227274e-05 3.89108912347048e-05 3.88954221464638e-05 3.88799280587529e-05 3.88677527068588e-05 3.88612850417718e-05 3.88621420421056e-05 3.88713185192388e-05 -4.62627639678193e-10 -2.05989778749332e-05 -2.41715975197179e-05 -2.41900701729451e-05 -2.42160880585753e-05 -2.42420440626695e-05 -2.42623674480377e-05 -2.42731382353883e-05 -2.42717148466788e-05 -2.42564334541495e-05 3.76293905253514e-05 0.00778454364442189 0.00751610979510354 0.00752002589184257 0.00752554294920676 0.00753104868167867 0.00753536087793154 0.007537646547676 0.007537344158716 0.00753410079872939 -1.48931187709545 -0.752291070730094 -0.119443344210645 -0.119684916699199 -0.120026296017635 -0.120368223581343 -0.120636900301013 -0.120779606416229 -0.120760665282574 -0.120558169179215 +AB1_EBV chr6:1412516-4412516 6:2900248:C:A chr6_2900248_C_A chr6 2900248 C A 0.0666209 -0.0745332 0.0595208 0.210489 -2.40599263449429e-06 0.000696875971842839 0.0002773208531206 -1 NA NA NA -2.40599263449429e-06 0.000696875971842839 0.0002773208531206 -1 NA NA NA 5.34239928424041e-10 1.22100123955882e-05 3.31954458722522e-05 3.3180303528717e-05 3.3158922412406e-05 3.31375463876293e-05 3.31207967544259e-05 3.31119604398682e-05 3.31132583693554e-05 3.3126064771795e-05 -4.02961574085908e-11 -1.85072747193858e-07 -2.77214528631182e-07 -2.77323368982149e-07 -2.77475730133333e-07 -2.77630186771891e-07 -2.77756864285653e-07 -2.77834980447318e-07 -2.77850367011055e-07 -2.7779356488044e-07 2.21076556571287e-06 0.000203341460822337 0.000235408256271966 0.000235480799123452 0.000235582812396303 0.000235684585134965 0.000235764481250163 0.000235807357421787 0.000235803014119548 0.000235744951193583 -1.05487211849611 -1.07253268608871 -0.278586111646277 -0.279002675800522 -0.279591023977834 -0.280179381363973 -0.280640442051281 -0.280883558606506 -0.280847472595501 -0.280494406880535 +AB1_EBV chr6:1412516-4412516 6:2900335:G:A chr6_2900335_G_A chr6 2900335 G A 0.0141425 0.0871561 0.128692 0.49825 -4.8508851812967e-06 0.00150079197313381 0.000276535291099278 -1 NA NA NA -4.8508851812967e-06 0.00150079197313381 0.000276535291099278 -1 NA NA NA 2.9118904773619e-10 1.22127022947677e-05 3.30969532069184e-05 3.30818377973087e-05 3.30604993683275e-05 3.30391480522195e-05 3.30223804765177e-05 3.30134663789116e-05 3.30146157602308e-05 3.30271970744514e-05 2.43074616704319e-11 -4.01449309932804e-07 -5.55372192291594e-07 -5.55610515295359e-07 -5.55946267795425e-07 -5.56278692320696e-07 -5.56535030480033e-07 -5.56664687226849e-07 -5.56633503268646e-07 -5.56419290146967e-07 2.59576698269183e-06 0.000439789713479433 0.000506778882168131 0.000506934685916685 0.000507153885835485 0.000507372164401548 0.000507542686144415 0.000507632676254687 0.00050762007726774 0.000507490860118933 -1.6617444558951 -1.07231240761235 -0.28155757562021 -0.281974683704746 -0.282563659917823 -0.283153189855267 -0.283616300020534 -0.283862567999277 -0.283830864503621 -0.283483458915005 +AB1_EBV chr6:1412516-4412516 6:2900414:T:A chr6_2900414_T_A chr6 2900414 T A 0.000665535 -0.139883 0.716694 0.845254 -3.82750989083661e-05 0.00859039307097078 0.000281652410816347 -1 NA NA NA -3.82750989083661e-05 0.00859039307097078 0.000281652410816347 -1 NA NA NA 2.39508370320693e-10 1.26326017337332e-05 3.36824589320091e-05 3.36678668884519e-05 3.36472607420992e-05 3.3626640591405e-05 3.36104486317959e-05 3.36018459573805e-05 3.36029700713173e-05 3.36151449528514e-05 -3.39828253445488e-11 -3.20715310728596e-06 -4.3744647901316e-06 -4.37709079805373e-06 -4.38078008181301e-06 -4.38445091094579e-06 -4.3873144802804e-06 -4.38881848885003e-06 -4.38859190152779e-06 -4.38640036665243e-06 1.11779046586714e-05 0.00256822572033681 0.00289485122527406 0.00289583737532278 0.0028972246820386 0.00289860691148584 0.00289968767710333 0.00290025922613081 0.00290018176576873 0.00289936678143994 -1.85712879532708 -1.03850807792568 -0.264021610257959 -0.264415230773286 -0.264971208724758 -0.265527725276927 -0.265964838061926 -0.266197113647407 -0.26616677170098 -0.265838126664907 +AB1_EBV chr6:1412516-4412516 6:2900482:G:A chr6_2900482_G_A chr6 2900482 G A 0.00263659 -0.148118 0.285531 0.603939 -7.81711333268456e-06 0.00328394972541939 0.000274033837365906 -1 NA NA NA -7.81711333268456e-06 0.00328394972541939 0.000274033837365906 -1 NA NA NA 2.65623587561404e-10 1.19997776301267e-05 3.28099467075179e-05 3.2795070836965e-05 3.27740673447991e-05 3.27530575777528e-05 3.27365702526763e-05 3.27278256360016e-05 3.2729000636728e-05 3.27414447134073e-05 -3.725607632674e-11 -6.3084943095232e-07 -8.95451470538984e-07 -8.96264942137871e-07 -8.97407813111108e-07 -8.98550900264671e-07 -8.99452015723433e-07 -8.99940070338565e-07 -8.99899885363641e-07 -8.99259548177639e-07 5.13525367516566e-06 0.000951241529523494 0.00111007623869679 0.00111042320525827 0.00111091123194518 0.00111139758053865 0.00111177816708481 0.00111198007054922 0.00111195422561528 0.00111166951609209 -1.75363693846563 -1.08990087061697 -0.290267082941084 -0.290680883726823 -0.29126528416087 -0.291850033955015 -0.292309018514408 -0.29255246537276 -0.2925196752518 -0.292173136894739 +AB1_EBV chr6:1412516-4412516 6:2900706:G:A chr6_2900706_G_A chr6 2900706 G A 0.0666048 -0.0748309 0.059488 0.208422 -2.4505317402585e-06 0.000697356259738811 0.000277550020485684 -1 NA NA NA -2.4505317402585e-06 0.000697356259738811 0.000277550020485684 -1 NA NA NA 5.38086030734586e-10 1.22277846647579e-05 3.32218387383518e-05 3.32067068942862e-05 3.31853404764832e-05 3.31639793445744e-05 3.31472419094258e-05 3.31384130878286e-05 3.31397124354581e-05 3.31525132685726e-05 -4.07404343673439e-11 -1.88905566542675e-07 -2.82291734212634e-07 -2.82403759486555e-07 -2.82560601359849e-07 -2.82719528341308e-07 -2.82849712802439e-07 -2.82929704285372e-07 -2.82944884411671e-07 -2.82885508381631e-07 2.22349317817976e-06 0.000203652812363333 0.000235551223885542 0.000235624038880583 0.00023572643548321 0.000235828593919897 0.000235908797992618 0.000235951847624438 0.000235947504759349 0.000235889244887071 -1.04769870490789 -1.07107819555023 -0.277791352642094 -0.2782072380547 -0.278794630610174 -0.279382025404102 -0.279842315022417 -0.280084992562041 -0.280048895046835 -0.279696305926548 +AB1_EBV chr6:1412516-4412516 6:2900779:G:T chr6_2900779_G_T chr6 2900779 G T 0.000293308 0.222851 0.892501 0.802825 3.93278283454109e-05 0.0105165019832976 0.000278429524439683 -1 NA NA NA 3.93278283454109e-05 0.0105165019832976 0.000278429524439683 -1 NA NA NA 2.42119911334643e-10 1.23805452883762e-05 3.33120134147895e-05 3.32971316570212e-05 3.32761196029438e-05 3.32550934598933e-05 3.32385807075095e-05 3.32298022254387e-05 3.32309351934593e-05 3.32433277153777e-05 5.30951482486496e-11 3.30691633667144e-06 4.49426732413003e-06 4.49670771714816e-06 4.50013763168623e-06 4.50354268658721e-06 4.50618537893779e-06 4.50754993946109e-06 4.50728872163161e-06 4.50517951400913e-06 1.41407276088693e-05 0.00310971365275386 0.00354793619288009 0.00354907774513592 0.00355068362647631 0.00355228303996116 0.00355353284435313 0.00355419270368656 0.00355410085553536 0.0035531545954489 -1.84628405589504 -1.0586626772132 -0.275080710503293 -0.275487851612368 -0.276062846421069 -0.276638410697475 -0.277090557128362 -0.277330987653494 -0.277300004725495 -0.276960757973803 +AB1_EBV chr6:1412516-4412516 6:2901299:T:A chr6_2901299_T_A chr6 2901299 T A 0.000160786 -1.26096 1.47459 0.392483 -0.000170522636125533 0.0204851026808546 0.000312954617270877 -1 NA NA NA -0.000170522636125533 0.0204851026808546 0.000312954617270877 -1 NA NA NA 3.35255518153791e-10 1.53990054822489e-05 3.7241766909278e-05 3.72296882854881e-05 3.72126196025097e-05 3.71955283613543e-05 3.71821013619481e-05 3.71749684918958e-05 3.7175909131918e-05 3.71860208911237e-05 -4.12416769738376e-10 -1.57052145928113e-05 -1.93033337994492e-05 -1.93174668113558e-05 -1.93373577642266e-05 -1.93571929576123e-05 -1.93727175786129e-05 -1.93809394925251e-05 -1.93798430306353e-05 -1.93681576815342e-05 3.49162021266074e-05 0.00677140504927717 0.00682423602985352 0.00682747911755856 0.00683204596431248 0.00683660189556094 0.00684016907512273 0.00684205909989392 0.00684180805236277 0.00683912400865881 -1.52082417887053 -0.840486061150979 -0.163567907810423 -0.163852593283656 -0.164254916728738 -0.164657804117231 -0.164974328567028 -0.165142473531004 -0.165120282230847 -0.164881926566009 +AB1_EBV chr6:1412516-4412516 6:2901437:T:C chr6_2901437_T_C chr6 2901437 T C 0.00243636 0.160119 0.310196 0.605724 2.96061315937843e-05 0.00409536289602358 0.000301337566358306 -1 NA NA NA 2.96061315937843e-05 0.00409536289602358 0.000301337566358306 -1 NA NA NA 2.66812142111886e-10 1.43959073204915e-05 3.59189719774459e-05 3.59056435298025e-05 3.58868259382378e-05 3.58679869005927e-05 3.58531811787001e-05 3.58452976161622e-05 3.58462883764916e-05 3.58573568471173e-05 4.13834474904866e-11 2.67310651563078e-06 3.35915900741316e-06 3.36132554446077e-06 3.36437932025667e-06 3.36742138929354e-06 3.36979562569709e-06 3.3710412365638e-06 3.37084698290736e-06 3.36901458811364e-06 5.61130019692742e-06 0.00131551545531481 0.00136920959834915 0.00136978442111869 0.00137059415886078 0.00137140149547561 0.00137203287982255 0.00137236629721574 0.00137231946856703 0.00137184035323422 -1.74917233754388 -0.907845037079717 -0.199733182394312 -0.200064623936376 -0.200532594469493 -0.201001184952951 -0.201369528957596 -0.201565728180789 -0.201541200093894 -0.201266076817944 +AB1_EBV chr6:1412516-4412516 6:2901740:C:T chr6_2901740_C_T chr6 2901740 C T 0.00113492 -0.660862 0.469182 0.158971 -0.000104368763391992 0.00837225553970323 0.00038399391514754 -1 NA NA NA -0.000104368763391992 0.00837225553970323 0.00038399391514754 -1 NA NA NA 6.27557957401794e-10 2.23904185497478e-05 4.52285784811251e-05 4.52228368637095e-05 4.52146905460237e-05 4.52064991309838e-05 4.52000393455772e-05 4.51965963634224e-05 4.51970426383519e-05 4.52019040545982e-05 -4.08017420349811e-10 -1.12431861891166e-05 -1.16039623831258e-05 -1.1614574853731e-05 -1.16295246741969e-05 -1.16444459722166e-05 -1.16561338320443e-05 -1.16623272812409e-05 -1.16615012891556e-05 -1.16526988997442e-05 2.00042363984756e-05 0.00316816247511648 0.00273361515849696 0.00273543568248955 0.00273800114071713 0.00274056251299853 0.00274256942538591 0.00274363323642256 0.00274349175815446 0.00274198074860733 -0.893881131580187 -0.466155865372607 0.0307303486857835 0.0306430911317879 0.030519189006661 0.0303945097545189 0.0302961294412096 0.0302436639934607 0.0302504265993964 0.0303243763281786 +AB1_EBV chr6:1412516-4412516 6:2901779:C:T chr6_2901779_C_T chr6 2901779 C T 0.000474125 0.464259 0.713054 0.514991 7.42781689841096e-05 0.00962408463873327 0.000306219320683976 -1 NA NA NA 7.42781689841096e-05 0.00962408463873327 0.000306219320683976 -1 NA NA NA 2.86243935440098e-10 1.48599589426249e-05 3.64684340513584e-05 3.64559467233702e-05 3.64383065447139e-05 3.64206442766831e-05 3.64067651396288e-05 3.63993818493059e-05 3.6400330025449e-05 3.64107439124906e-05 1.27023445979675e-10 6.82486782147636e-06 8.41039220824134e-06 8.41655434299846e-06 8.42523035358088e-06 8.43387953285573e-06 8.44064190143476e-06 8.44420944646573e-06 8.44370167347457e-06 8.43856468013581e-06 1.40881940768886e-05 0.00314110358222158 0.00321124072749791 0.00321270312520817 0.00321476262578972 0.00321681678949376 0.00321842434512764 0.00321927474243777 0.00321915878472844 0.00321794486437146 -1.67887279230573 -0.876118713070541 -0.184551739732469 -0.184854515897884 -0.185282258223097 -0.185710588499166 -0.186047215015958 -0.186226325978645 -0.186203388508407 -0.185950941202606 +AB1_EBV chr6:1412516-4412516 6:2901780:G:C chr6_2901780_G_C chr6 2901780 G C 0.0602314 -0.0252196 0.0618397 0.683405 8.57138514535798e-06 0.000910498237234011 0.000327196293954057 -1 NA NA NA 8.57138514535798e-06 0.000910498237234011 0.000327196293954057 -1 NA NA NA 2.57933295715376e-10 1.67770980844004e-05 3.88435654164233e-05 3.88334085586811e-05 3.88190914231861e-05 3.8804753336167e-05 3.87934701671027e-05 3.87874356121324e-05 3.87881299708099e-05 3.87964586105363e-05 -6.84061171967653e-12 8.24205140773222e-07 9.65577315271994e-07 9.66393292140342e-07 9.67546441330625e-07 9.68697563004973e-07 9.6959771249865e-07 9.70071031874967e-07 9.69998525976611e-07 9.69304963098313e-07 1.06983434732419e-06 0.000312499195642551 0.000301785553703583 0.000301950290219811 0.000302182775581074 0.000302414863899145 0.000302596525548325 0.000302692435916132 0.000302678731690022 0.000302540389994796 -1.78301615295971 -0.754774242278217 -0.121456368887976 -0.121678186993833 -0.121990684503573 -0.1223036050414 -0.122549890070179 -0.122681748558017 -0.122666958507057 -0.122485865185222 +AB1_EBV chr6:1412516-4412516 6:2901784:T:C chr6_2901784_T_C chr6 2901784 T C 0.000474114 0.464262 0.713054 0.514988 7.4278229790865e-05 0.00962408661564884 0.000306219369939686 -1 NA NA NA 7.4278229790865e-05 0.00962408661564884 0.000306219369939686 -1 NA NA NA 2.86244808138723e-10 1.48599605837659e-05 3.64684400314365e-05 3.64559526953849e-05 3.64383125054799e-05 3.64206502263469e-05 3.64067710808445e-05 3.63993877865356e-05 3.6400335964364e-05 3.64107498594699e-05 1.27024809591101e-10 6.82487019409241e-06 8.41039954058659e-06 8.4165616667619e-06 8.42523766538765e-06 8.43388683287977e-06 8.44064919253504e-06 8.44421673344543e-06 8.44370896243587e-06 8.43857197793072e-06 1.40882463064968e-05 0.00314110399239066 0.00321124141832974 0.00321270381557033 0.00321476331550199 0.00321681747857059 0.00321842503373471 0.00321927543085274 0.00321915947330345 0.00321794555349866 -1.67886974351696 -0.876118602630065 -0.184551575752915 -0.184854352083343 -0.185282094637956 -0.185710425139527 -0.186047051826089 -0.186226162865182 -0.186203225352894 -0.185950777872275 +AB1_EBV chr6:1412516-4412516 6:2901906:G:T chr6_2901906_G_T chr6 2901906 G T 0.000732806 -0.514416 0.561698 0.35976 -0.000114028330580257 0.00962161397599455 0.000370399667817156 -1 NA NA NA -0.000114028330580257 0.00962161397599455 0.000370399667817156 -1 NA NA NA 3.52125777245866e-10 2.11518692151745e-05 4.36868584718273e-05 4.36801706901131e-05 4.3670704489078e-05 4.36611964857497e-05 4.36536971131505e-05 4.36496837702575e-05 4.36501604902728e-05 4.36557399258389e-05 -1.7600131130793e-10 -1.21396951826313e-05 -1.26963525001502e-05 -1.27078425352357e-05 -1.27240367061852e-05 -1.27401984318054e-05 -1.27528498983887e-05 -1.27595380654515e-05 -1.27586100625871e-05 -1.27490311965107e-05 1.40160216167457e-05 0.00359352235404155 0.00314855773213012 0.00315059007537553 0.00315345483706459 0.00315631482545548 0.0031585548423876 0.00315974055082775 0.0031595791217589 0.0031578873594886 -1.47172872721918 -0.523060708855343 -0.00395147022989217 -0.00406486929332406 -0.00422535763315501 -0.00438659746392567 -0.00451385013387107 -0.00458208072348754 -0.00457427071126393 -0.0044800622103649 +AB1_EBV chr6:1412516-4412516 6:2901927:C:A chr6_2901927_C_A chr6 2901927 C A 0.000122246 -1.13981 1.35456 0.40009 -0.000159865798488725 0.0189320928496257 0.000314385192374811 -1 NA NA NA -0.000159865798488725 0.0189320928496257 0.000314385192374811 -1 NA NA NA 3.31831868939229e-10 1.55355647665652e-05 3.74034876093184e-05 3.73914278597979e-05 3.73743921275384e-05 3.73573359212473e-05 3.73439376908123e-05 3.73368215672707e-05 3.73377627028184e-05 3.73478552980006e-05 -3.69538033917271e-10 -1.47921828239582e-05 -1.80888781861212e-05 -1.81019823473878e-05 -1.81204396926077e-05 -1.81388504163526e-05 -1.81532633341475e-05 -1.81608999283469e-05 -1.81598876287449e-05 -1.81490445930246e-05 3.17180559629383e-05 0.00628352839668168 0.00630368303904831 0.00630668925041208 0.00631092398764079 0.00631514915690365 0.00631845770904774 0.0063202110540328 0.00631997875775944 0.00631748983560914 -1.53108873892888 -0.831657092764422 -0.159234853978305 -0.159517631922922 -0.159917089674251 -0.160317050330861 -0.160631240290594 -0.160798105215386 -0.160776010328358 -0.160539346534644 +AB1_EBV chr6:1412516-4412516 6:2901956:C:G chr6_2901956_C_G chr6 2901956 C G 0.00422977 -0.169267 0.237368 0.475785 -1.62815035121505e-05 0.00293764001846143 0.000287893968729858 -1 NA NA NA -1.62815035121505e-05 0.00293764001846143 0.000287893968729858 -1 NA NA NA 3.00922682592311e-10 1.31499796504163e-05 3.43960612222218e-05 3.4382081817001e-05 3.4362329904722e-05 3.43425610815575e-05 3.4327038236061e-05 3.43187958648315e-05 3.43198858566079e-05 3.43315780105471e-05 -4.97429504469612e-11 -1.38546252123471e-06 -1.85768974678648e-06 -1.85894190280673e-06 -1.8606983796764e-06 -1.86244754062533e-06 -1.86381550540057e-06 -1.86453972766464e-06 -1.86444344328619e-06 -1.86341500171895e-06 4.97775331539796e-06 0.000897851438327447 0.000987627332533439 0.000987999491806122 0.000988522889854285 0.000989044558694027 0.000989452722598915 0.000989668899040274 0.00098964024095878 0.000989333352109394 -1.62886379742584 -0.998368778284787 -0.243056747167402 -0.243423557200197 -0.243941953653876 -0.244460920015889 -0.244868497471278 -0.245084929834525 -0.245056280985397 -0.244749262376344 +AB1_EBV chr6:1412516-4412516 6:2902097:A:C chr6_2902097_A_C chr6 2902097 A C 0.381506 0.171729 0.0305523 1.90055e-08 0.000152423497918228 0.00495139434682274 0.0013570758271243 -1 NA NA NA 0.000152423497918228 0.00495139434682274 0.0013570758271243 -1 NA NA NA 0.000843526188656871 3.91741028318361e-05 5.93126743663999e-05 5.93282533599584e-05 5.93500295728665e-05 5.93716631818064e-05 5.93884955045684e-05 5.93972332518681e-05 5.93956532569341e-05 5.93823609924639e-05 0.000139928800104302 1.7518564521159e-06 1.33642690192504e-06 1.3382905777224e-06 1.34091346719012e-06 1.34353208568464e-06 1.3455820506066e-06 1.34666229599662e-06 1.34650175732951e-06 1.3449322253552e-06 0.00489504602054235 0.000333052358433822 0.000234759365008444 0.000234991037227334 0.00023531723633409 0.000235642941485097 0.000235898001954203 0.000236032634770317 0.0002360132076357 0.000235818808107556 13.2173843463615 0.093226897020803 0.301824210520419 0.302126531966772 0.302549762227976 0.302970708901167 0.303298701362282 0.303469528717203 0.30343981645509 0.303182394556006 +AB1_EBV chr6:1412516-4412516 6:2902159:A:G chr6_2902159_A_G chr6 2902159 A G 0.199925 -0.0167221 0.036845 0.649937 1.27910315514759e-05 0.000823906046209054 0.000470625668141822 -1 NA NA NA 1.27910315514759e-05 0.000823906046209054 0.000470625668141822 -1 NA NA NA 2.7512128114274e-10 3.45131117258491e-05 5.44921382732307e-05 5.45025758305991e-05 5.45172433642999e-05 5.45316126904354e-05 5.4542362454444e-05 5.4547147694049e-05 5.45443895335381e-05 5.45331019684047e-05 -5.64309864838996e-12 1.76043634854507e-06 1.37247712640654e-06 1.37433592409176e-06 1.37695732716769e-06 1.37956536863081e-06 1.38158671720971e-06 1.38261411351815e-06 1.38237255902427e-06 1.38069170998055e-06 6.93135129452434e-07 0.000362684329388557 0.00026070914685714 0.000260955264477976 0.000261302336434109 0.00026164802637794 0.000261916803312259 0.000262055077651312 0.00026202666807898 0.000261809108603266 -1.71850513793224 -0.0334496875492922 0.217057633759386 0.21728885503609 0.217614186526596 0.217934230040226 0.218175864601768 0.218287304678361 0.218233627265473 0.217993058133872 +AB1_EBV chr6:1412516-4412516 6:2912043:G:A chr6_2912043_G_A chr6 2912043 G A 0.379836 0.195819 0.0298776 5.60015e-11 0.0627098030382369 0.0914758405630092 0.327483481692081 1 0.327287739668512 0 0.988626524209 0.0627098030382369 0.0914758405630092 0.327483481692081 1 0.327287739668512 0 0.988626524209 0.327287739668512 1.34116556674083e-05 3.47479906129698e-05 3.47341023926405e-05 3.47144673802213e-05 3.46948481583097e-05 3.46795126959479e-05 3.46714989293944e-05 3.46728600996272e-05 3.46848650779766e-05 0.0627075544730858 1.93070115154659e-07 2.56351789036658e-07 2.56517545891351e-07 2.56749448141219e-07 2.56982473311057e-07 2.57169098245676e-07 2.57275938042434e-07 2.57280452181013e-07 2.57168291095261e-07 0.0914750699783512 0.000115965451802635 0.000126090501441368 0.000126139059796606 0.000126207301983071 0.000126275491956345 0.000126329203768056 0.000126358304086684 0.000126355963029962 0.000126317856103039 19.1783883980353 -0.978664834606986 -0.232877059385462 -0.233237126234329 -0.233746329660068 -0.234255144961051 -0.234652727503607 -0.234860125362074 -0.234823978507148 -0.234511407819073 +AB1_EBV chr6:1412516-4412516 6:2912091:T:C chr6_2912091_T_C chr6 2912091 T C 0.0014968 0.849767 0.39658 0.0321336 0.000467799155561597 0.0178107769162849 0.000999898076620487 -1 NA NA NA 0.000467799155561597 0.0178107769162849 0.000999898076620487 -1 NA NA NA 2.14748023589044e-09 0.000129030020977694 0.000108607514244686 0.000108695992067434 0.000108820817330923 0.000108945579309375 0.000109043388481492 0.00010909516101071 0.000109088003495295 0.000109013906271378 1.7706840523719e-09 0.000105696396775546 4.49708995093949e-05 4.50550210557385e-05 4.5173821756935e-05 4.52927095848752e-05 4.53860323694479e-05 4.54355104110357e-05 4.5428780052821e-05 4.53582133617496e-05 4.23059122786113e-05 0.0102300083056357 0.00513146611005017 0.0051381716493634 0.00514763567977716 0.0051570999330498 0.00516452473746057 0.00516846065280203 0.00516792812105516 0.00516231993799184 0.336333289791154 1.28525610863321 0.90674179140902 0.907595813479623 0.908799794774941 0.910002132328979 0.910944034613751 0.911442419834467 0.91137369825334 0.910660619838302 +AB1_EBV chr6:1412516-4412516 6:2912215:A:C chr6_2912215_A_C chr6 2912215 A C 0.000455488 0.61666 0.755233 0.414205 0.000112004643456391 0.0113904316010689 0.000333457603954423 -1 NA NA NA 0.000112004643456391 0.0113904316010689 0.000333457603954423 -1 NA NA NA 3.24538856818094e-10 1.7385629796308e-05 3.95513804269452e-05 3.95409324142499e-05 3.95261701037205e-05 3.95113845208808e-05 3.94997674441308e-05 3.94936005032933e-05 3.94944279729676e-05 3.95031985094307e-05 1.94930595906053e-10 1.09430535165028e-05 1.25985989515895e-05 1.26084517781145e-05 1.26223360989094e-05 1.263619241875e-05 1.26470466233653e-05 1.26528047819961e-05 1.26520552817327e-05 1.2643909074835e-05 1.72577400195345e-05 0.00396527667424546 0.00376819718924355 0.00377022680744795 0.00377308699655655 0.00377594195077436 0.00377817858479035 0.0037793647338638 0.00377920899661583 0.00377752828442837 -1.55331188807753 -0.719144998187052 -0.103398208696467 -0.103622709454589 -0.103939870307167 -0.104257506731746 -0.104507043474584 -0.104639472108447 -0.104621631762101 -0.104433191173421 +AB1_EBV chr6:1412516-4412516 6:2912223:A:G chr6_2912223_A_G chr6 2912223 A G 0.000327161 -0.974896 0.897826 0.277549 -0.000143823315763218 0.0139369815289686 0.000341294746581511 -1 NA NA NA -0.000143823315763218 0.0139369815289686 0.000341294746581511 -1 NA NA NA 4.15651617156049e-10 1.81159684822268e-05 4.04369439533612e-05 4.04273931742459e-05 4.0413883888316e-05 4.0400344441517e-05 4.03897002915185e-05 4.03840447014201e-05 4.03847944480235e-05 4.0392817733862e-05 -3.94185719873914e-10 -1.42532764371269e-05 -1.61503880112751e-05 -1.6163647332254e-05 -1.61823187080979e-05 -1.62009487904163e-05 -1.62155396124606e-05 -1.62232739594452e-05 -1.62222517278753e-05 -1.62112769985464e-05 2.64761296927553e-05 0.00492195420313575 0.00460091996559752 0.00460353106509021 0.00460720952302008 0.00461088108504921 0.00461375733109938 0.00461528214251335 0.00461508042144129 0.00461291664214722 -1.305869710077 -0.677995203493559 -0.0812549842375656 -0.0814515043997215 -0.0817294705755023 -0.0820080421202665 -0.0822270186896716 -0.0823433444879065 -0.0823278906719001 -0.0821628444267333 +AB1_EBV chr6:1412516-4412516 6:2912235:C:A chr6_2912235_C_A chr6 2912235 C A 0.000894445 0.0390669 0.502805 0.938068 1.64477341850827e-05 0.00582199394394285 0.000275236633743181 -1 NA NA NA 1.64477341850827e-05 0.00582199394394285 0.000275236633743181 -1 NA NA NA 2.35335244481712e-10 1.2109466439747e-05 3.2946910297286e-05 3.29319569945197e-05 3.29108465588616e-05 3.28897269237278e-05 3.28731475226994e-05 3.28643438621222e-05 3.2865502937009e-05 3.28779796697682e-05 8.25512316693382e-12 1.36304292983158e-06 1.88139085922139e-06 1.88260803746861e-06 1.88432243632932e-06 1.88603061134145e-06 1.88736476632332e-06 1.88806645059385e-06 1.88796128625787e-06 1.88693855259211e-06 7.64087884500099e-06 0.0016974102170611 0.00196684251598381 0.00196745566043838 0.00196831827899032 0.00196917766387594 0.00196984963868014 0.00197020521959275 0.00197015760253611 0.00196965166777194 -1.87470609089502 -1.08080149229204 -0.28610131851516 -0.286515584914988 -0.287100571028592 -0.287685995378918 -0.28814568808312 -0.288389821438491 -0.288357665025673 -0.288011711991038 +AB1_EBV chr6:1412516-4412516 6:2912261:G:A chr6_2912261_G_A chr6 2912261 G A 0.0199092 -0.220904 0.106552 0.0381531 -2.97706349596775e-05 0.00212370411917391 0.000423874556068071 -1 NA NA NA -2.97706349596775e-05 0.00212370411917391 0.000423874556068071 -1 NA NA NA 1.98958362816542e-09 2.7132197094122e-05 4.96130716799048e-05 4.96100894958993e-05 4.96057801356657e-05 4.96014037623309e-05 4.95979392558906e-05 4.95961163167247e-05 4.95964347585059e-05 4.95991841555843e-05 -4.3309240151892e-10 -3.52624448591988e-06 -3.26979385529758e-06 -3.2728905431541e-06 -3.27724678792719e-06 -3.28159386611135e-06 -3.28500081535703e-06 -3.28681127681543e-06 -3.28658270906846e-06 -3.28403752762494e-06 1.07857201849781e-05 0.000856007676657065 0.000685441550967017 0.0006859315780635 0.000686621517047654 0.000687310284091608 0.000687850150940657 0.000688136832127493 0.000688099988781492 0.00068769557453296 0.259963503034496 -0.274067882084955 0.123255535306186 0.123235121837409 0.123204504827758 0.123172782159143 0.123147457733531 0.123134412284021 0.123137721535353 0.123159550394981 +AB1_EBV chr6:1412516-4412516 6:2912516:CCA:C chr6_2912516_CCA_C chr6 2912516 CCA C 0.379568 0.196413 0.0298788 4.90908e-11 0.0705334503762503 0.0943211787286286 0.367291808726716 1 0.367106415849495 0 1 0.0705334503762503 0.0943211787286286 0.367291808726716 1 0.367106415849495 0 1 0.367106415849495 1.35826756661766e-05 3.49703766940184e-05 3.49566673877352e-05 3.49372826355214e-05 3.49179144495213e-05 3.4902779017062e-05 3.48948777422873e-05 3.48962391873188e-05 3.4908116627254e-05 0.0705310811656966 2.04829896721797e-07 2.69918706751321e-07 2.70097089742913e-07 2.703467265568e-07 2.70597474615109e-07 2.70798048480558e-07 2.70912405770814e-07 2.7091621239132e-07 2.70793992636531e-07 0.0943204169456985 0.000117874520944068 0.000127207470188182 0.000127257707273328 0.000127328309993585 0.00012739886603438 0.000127454449709537 0.000127484572709491 0.000127482165069385 0.000127442752777842 19.2932004436988 -0.965993856777881 -0.226497482700605 -0.226849888657321 -0.227348327734282 -0.227846347311053 -0.228235373839683 -0.228438069440508 -0.228402166017004 -0.228095464439732 +AB1_EBV chr6:1412516-4412516 6:2912529:A:G chr6_2912529_A_G chr6 2912529 A G 0.000327219 -0.97546 0.897843 0.277281 -0.000143953079553094 0.0139419926770435 0.0003413887961905 -1 NA NA NA -0.000143953079553094 0.0139419926770435 0.0003413887961905 -1 NA NA NA 4.15918375867138e-10 1.81252741493716e-05 4.04475101763738e-05 4.04379681637341e-05 4.0424471223517e-05 4.0410944096783e-05 4.04003095978191e-05 4.03946591265783e-05 4.03954082031063e-05 4.0403424239079e-05 -3.94667582594136e-10 -1.42693628376224e-05 -1.61645419108553e-05 -1.61778173275889e-05 -1.6196511395159e-05 -1.62151641464748e-05 -1.62297727421942e-05 -1.62375165200616e-05 -1.62364930492056e-05 -1.62255049563498e-05 2.64930551234239e-05 0.00492466914772154 0.00460244397516612 0.00460505719958363 0.00460873865501266 0.0046124132135329 0.00461529181034602 0.00461681786950121 0.00461661598421526 0.00461445043652855 -1.30522813156292 -0.67748166330158 -0.0809937171452315 -0.0811899588040905 -0.0814675321615681 -0.0817457110643343 -0.0819643796238738 -0.0820805419244524 -0.0820651095746605 -0.0819002949561405 +AB1_EBV chr6:1412516-4412516 6:2912588:C:T chr6_2912588_C_T chr6 2912588 C T 0.0254686 0.216313 0.0955807 0.0236265 1.47824004154632e-05 0.00146431229272919 0.000337611425283768 -1 NA NA NA 1.47824004154632e-05 0.00146431229272919 0.000337611425283768 -1 NA NA NA 2.72685699254245e-09 1.78248894962867e-05 4.00108805539477e-05 4.00017784606194e-05 3.99888907079696e-05 3.99759826507461e-05 3.99658550555137e-05 3.99605097334193e-05 3.99613013955271e-05 3.99690615313357e-05 5.70381630748495e-10 1.46467314122321e-06 1.65960336828124e-06 1.66106000252363e-06 1.66310974647536e-06 1.66515656502215e-06 1.66676273894097e-06 1.66761930038806e-06 1.66751779919677e-06 1.66632737178103e-06 1.19846816026332e-05 0.000515215638913325 0.000483618358084242 0.00048389907275914 0.000484294387774508 0.000484689129467184 0.000484998689925372 0.00048516333488638 0.000485142766776561 0.000484911717134194 0.575187779444314 -0.694193222496162 -0.0918473746636161 -0.0920351938219852 -0.0923011738682922 -0.0925675127810841 -0.0927763619162958 -0.092886408524647 -0.0928697090375366 -0.092709141603013 +AB1_EBV chr6:1412516-4412516 6:2912610:T:A chr6_2912610_T_A chr6 2912610 T A 0.000546427 0.109603 0.608951 0.857163 -1.7075059345342e-06 0.00689201795132011 0.000271185931488116 -1 NA NA NA -1.7075059345342e-06 0.00689201795132011 0.000271185931488116 -1 NA NA NA 2.37990235015101e-10 1.17752178586987e-05 3.24833629428342e-05 3.24680806295094e-05 3.24465064204478e-05 3.24249247619617e-05 3.2407984976631e-05 3.23989929381462e-05 3.24001832167821e-05 3.24129409677569e-05 2.37142738719595e-11 -1.10061281359889e-07 -1.99916178590291e-07 -1.99847078568636e-07 -1.99750046290116e-07 -1.99653339751115e-07 -1.99578768359799e-07 -1.99542536537732e-07 -1.99555699429243e-07 -1.99624719921246e-07 9.40928980680266e-06 0.00197272591095902 0.00233243168230848 0.00233310172729173 0.0023340440487014 0.00233498253666501 0.00233571624093277 0.00233610464497459 0.00233605323933057 0.0023355018923268 -1.86348751723285 -1.10879184787886 -0.300270756823125 -0.300701636214049 -0.301310080139224 -0.301918943002603 -0.302396985543454 -0.302650778155976 -0.302617152121965 -0.302257079085101 +AB1_EBV chr6:1412516-4412516 6:2912748:A:G chr6_2912748_A_G chr6 2912748 A G 0.00233851 0.432498 0.310772 0.164016 5.15277704475579e-05 0.00489060027618745 0.000345015214635036 -1 NA NA NA 5.15277704475579e-05 0.00489060027618745 0.000345015214635036 -1 NA NA NA 5.99956963572397e-10 1.85725654097157e-05 4.08444675074e-05 4.08350760770347e-05 4.08218020645658e-05 4.08085011268683e-05 4.0798045921e-05 4.07924931202076e-05 4.07932351053201e-05 4.08011247074387e-05 2.52393731776312e-10 5.20198836606858e-06 5.77436514648892e-06 5.77908582942781e-06 5.7857384974689e-06 5.79237838581503e-06 5.79757978057528e-06 5.8003381874085e-06 5.79997622281808e-06 5.79606763775497e-06 1.27576077926897e-05 0.0017479247396613 0.00161168129135818 0.00161260430278 0.00161390516855485 0.00161520381422027 0.0016162212837495 0.00161676081838625 0.00161668971463515 0.00161592466322812 -0.938859235450003 -0.65310347551445 -0.071227427838604 -0.0714176886195066 -0.0716865540907756 -0.0719559321725098 -0.0721676417039498 -0.072280045985508 -0.072264968322628 -0.0721051873355378 +AB1_EBV chr6:1412516-4412516 6:2913008:C:T chr6_2913008_C_T chr6 2913008 C T 0.0024573 0.210031 0.306679 0.493435 3.92406011765618e-05 0.00439665175954045 0.000320463764927226 -1 NA NA NA 3.92406011765618e-05 0.00439665175954045 0.000320463764927226 -1 NA NA NA 2.94217037452583e-10 1.61738961036959e-05 3.80830747887176e-05 3.80712201708452e-05 3.8054480217481e-05 3.80377114807026e-05 3.80245222278381e-05 3.80174874673335e-05 3.80183473959848e-05 3.80281706575051e-05 5.99168022206555e-11 3.7312241576727e-06 4.42780444533946e-06 4.43095386156343e-06 4.43539335038771e-06 4.43981828187131e-06 4.44327482738013e-06 4.4450921744079e-06 4.44481732150604e-06 4.44216283963094e-06 6.26270446596284e-06 0.00148867738379177 0.00146017212945563 0.00146088436225525 0.00146188805981231 0.00146288920935577 0.00146367244969592 0.00146408612234863 0.00146402790663259 0.00146343325414789 -1.65139944310006 -0.791390398419185 -0.141228853471726 -0.141500487863944 -0.14188403419878 -0.142268277828509 -0.142570554492937 -0.142731867937992 -0.142712360329771 -0.142487616557522 +AB1_EBV chr6:1412516-4412516 6:2913068:GGTTA:G chr6_2913068_GGTTA_G chr6 2913068 GGTTA G 0.00870822 -0.212726 0.162239 0.189793 -2.37283424156391e-05 0.00243803334876037 0.000332005245500255 -1 NA NA NA -2.37283424156391e-05 0.00243803334876037 0.000332005245500255 -1 NA NA NA 5.06606768772462e-10 1.77032100225915e-05 3.93273587257883e-05 3.93177261339309e-05 3.93041069449291e-05 3.9290448887226e-05 3.92796864739962e-05 3.92739177867756e-05 3.92745660964864e-05 3.9282510890253e-05 -1.0073654079631e-10 -2.44868290682411e-06 -2.6520195225503e-06 -2.65431910644349e-06 -2.65755833349504e-06 -2.660787970917e-06 -2.6633110343195e-06 -2.66463612161047e-06 -2.66443261042391e-06 -2.66249407251444e-06 5.74903715846843e-06 0.000868265459189036 0.000803893013679785 0.00080434590358937 0.000804984014857361 0.00080562066225268 0.000806118736528231 0.000806381510540053 0.00080634382910633 0.000805964947295852 -1.10798206205858 -0.701043009065389 -0.10907837817911 -0.109283644613869 -0.109573841275992 -0.10986489435211 -0.110094326242466 -0.110217489313817 -0.110204093492312 -0.110035430413266 +AB1_EBV chr6:1412516-4412516 6:2913328:C:T chr6_2913328_C_T chr6 2913328 C T 0.00154494 -0.519913 0.394744 0.187808 -0.000161875377546235 0.00962934039254081 0.00051506802660084 -1 NA NA NA -0.000161875377546235 0.00962934039254081 0.00051506802660084 -1 NA NA NA 5.4587505222394e-10 3.87066516912138e-05 5.95239253736136e-05 5.95343368544001e-05 5.95489780746768e-05 5.95635596947194e-05 5.95749601233526e-05 5.95809961611447e-05 5.95801979507378e-05 5.95716287271369e-05 -2.76619917891995e-10 -2.22515297726671e-05 -1.73788721996806e-05 -1.74002600883788e-05 -1.74304291144383e-05 -1.74605810644305e-05 -1.74842285353933e-05 -1.74967743770226e-05 -1.74951137467133e-05 -1.74773120275926e-05 1.49409272427542e-05 0.00426209489159326 0.00304332489050872 0.00304607056877729 0.00304994306445174 0.00305381280763353 0.00305684735233557 0.00305845712540929 0.00305824402669091 0.00305595981473945 -1.03332705323842 0.0812224741817866 0.305379533210553 0.305594127626087 0.305896277752671 0.306197619731943 0.306433525758578 0.306558548553959 0.306542039972419 0.306364597941301 +AB1_EBV chr6:1412516-4412516 6:2913533:T:C chr6_2913533_T_C chr6 2913533 T C 0.0012859 -0.294808 0.424332 0.487208 -6.72214334167609e-05 0.00655757133201166 0.000340136198118679 -1 NA NA NA -6.72214334167609e-05 0.00655757133201166 0.000340136198118679 -1 NA NA NA 2.97030235883492e-10 1.79362995702231e-05 4.03144028679426e-05 4.0304892078558e-05 4.02914423661257e-05 4.02779649470781e-05 4.02673714613803e-05 4.02617452136461e-05 4.02624971379401e-05 4.02704935005059e-05 -8.54411777701489e-11 -6.59200715981395e-06 -7.55700070228509e-06 -7.56326851622423e-06 -7.5720966468441e-06 -7.58090683326348e-06 -7.58780813207615e-06 -7.59146793888667e-06 -7.59098800441846e-06 -7.58580404177101e-06 8.76352213705461e-06 0.00230223142130359 0.00216660864196398 0.00216784043660966 0.00216957596391961 0.00217130839872426 0.00217266569311009 0.00217338540816428 0.00217329058718609 0.00217227022799917 -1.64188322277177 -0.687962421044489 -0.0842900092695089 -0.0844862553502468 -0.0847637589382444 -0.0850418089214982 -0.0852603280145701 -0.0853763504676799 -0.0853607861709023 -0.0851958051434307 +AB1_EBV chr6:1412516-4412516 6:2913796:C:T chr6_2913796_C_T chr6 2913796 C T 0.00941746 0.335343 0.157435 0.0331681 4.55657828344948e-05 0.00318684629739834 0.000431444673078984 -1 NA NA NA 4.55657828344948e-05 0.00318684629739834 0.000431444673078984 -1 NA NA NA 2.30538610436447e-09 2.6805498999232e-05 5.059013531817e-05 5.05900962554694e-05 5.05899572315649e-05 5.05897803915044e-05 5.05896517792012e-05 5.0589656828871e-05 5.05898513725928e-05 5.05902415684262e-05 7.66614930776059e-10 5.10995658072454e-06 5.03852061861102e-06 5.04382160905973e-06 5.05128657355206e-06 5.05874533200358e-06 5.06460140973759e-06 5.06772529294742e-06 5.06735321256222e-06 5.06300559036585e-06 1.76272160940659e-05 0.00125143232076605 0.00103343253982729 0.00103422980064459 0.00103535302842997 0.00103647526981979 0.0010373559353431 0.00103782480336434 0.00103776684453523 0.00103710997247525 0.407286288005157 -0.286181936403061 0.142757797463833 0.142796722497035 0.142850225803715 0.142903234516531 0.142945217211903 0.142969026586909 0.142969760675168 0.142943868591193 +AB1_EBV chr6:1412516-4412516 6:2913933:G:A chr6_2913933_G_A chr6 2913933 G A 0.002884 -0.0552494 0.28875 0.848259 -2.61276804153581e-06 0.0032733607704216 0.000271474463967358 -1 NA NA NA -2.61276804153581e-06 0.0032733607704216 0.000271474463967358 -1 NA NA NA 2.39012529715526e-10 1.17947687710751e-05 3.2516816670443e-05 3.25015864228945e-05 3.24800841838334e-05 3.24585740548146e-05 3.24416903315117e-05 3.24327282233183e-05 3.24339151204045e-05 3.2446631739486e-05 -1.29384107884142e-11 -1.92414475066341e-07 -3.01585412168728e-07 -3.01865121378649e-07 -3.02253440974626e-07 -3.02639599248237e-07 -3.02942240776185e-07 -3.0310396405733e-07 -3.03086152715454e-07 -3.02864696739472e-07 4.48984746872096e-06 0.000937747091442122 0.00110769083204224 0.00110801250403537 0.00110846483835581 0.00110891534026423 0.00110926755788719 0.00110945402956772 0.00110942937943025 0.00110916474980723 -1.85920118456897 -1.10713288072139 -0.299241414111716 -0.299670207306508 -0.300275749949801 -0.300881721012933 -0.301357493587462 -0.301610075005957 -0.301576591443828 -0.301218195436843 +AB1_EBV chr6:1412516-4412516 6:2914065:C:T chr6_2914065_C_T chr6 2914065 C T 0.068155 -0.0898974 0.0585507 0.124691 -4.55635943984205e-06 0.000739866387618746 0.000292226090615189 -1 NA NA NA -4.55635943984205e-06 0.000739866387618746 0.000292226090615189 -1 NA NA NA 7.9672360969625e-10 1.33992478416794e-05 3.49075399455961e-05 3.48931938639127e-05 3.48729310299871e-05 3.48526823296835e-05 3.4836842233479e-05 3.48285391892714e-05 3.48298863700927e-05 3.48421872513886e-05 -7.20626698041368e-11 -3.76640606337197e-07 -5.21489879796873e-07 -5.21762991004918e-07 -5.22146662381582e-07 -5.22532208711195e-07 -5.22840636116295e-07 -5.23016665719313e-07 -5.23022840888174e-07 -5.22834886216702e-07 3.03066573362912e-06 0.000226971358502165 0.000248648293365666 0.000248740065882767 0.000248869189393097 0.00024899818088449 0.000249099682591987 0.000249154498042909 0.000249149679517198 0.000249076993648462 -0.655209330404995 -0.979590415247006 -0.228295955476589 -0.228667316499166 -0.229191944030024 -0.229716250733307 -0.230126316235066 -0.230340975980472 -0.230305407785422 -0.229985904820172 +AB1_EBV chr6:1412516-4412516 6:2914194:A:T chr6_2914194_A_T chr6 2914194 A T 0.00109866 0.110877 0.477429 0.816353 2.7396613039195e-05 0.00576889745077796 0.000283171893704526 -1 NA NA NA 2.7396613039195e-05 0.00576889745077796 0.000283171893704526 -1 NA NA NA 2.41209623129335e-10 1.27864463223858e-05 3.38532563572749e-05 3.38386411599051e-05 3.38180096087545e-05 3.37973688864156e-05 3.37811670182675e-05 3.37725691856805e-05 3.37737148124725e-05 3.37859275631042e-05 2.65158009872724e-11 2.34098095477853e-06 3.12591812671548e-06 3.12766098049386e-06 3.13011841781008e-06 3.13256955050937e-06 3.13448944903574e-06 3.13551052109538e-06 3.13538478299653e-06 3.13395373995902e-06 7.5232896894886e-06 0.00173938842606516 0.00194239563817294 0.0019430608545397 0.00194399730246343 0.00194493075990924 0.00194566117493293 0.00194604829464393 0.00194599767055386 0.00194544938818315 -1.85005079976932 -1.02640326055915 -0.258963611281714 -0.259355729380369 -0.259909367859147 -0.260463396969321 -0.260898369481019 -0.261129207875246 -0.261098398065117 -0.260770463217731 +AB1_EBV chr6:1412516-4412516 6:2914212:A:G chr6_2914212_A_G chr6 2914212 A G 0.000394946 -0.38577 0.705803 0.584676 -7.44339347826138e-05 0.00955359514397322 0.000306979642194949 -1 NA NA NA -7.44339347826138e-05 0.00955359514397322 0.000306979642194949 -1 NA NA NA 2.72783652698342e-10 1.48189846981526e-05 3.65695054388094e-05 3.65567584070366e-05 3.6538753489373e-05 3.65207283449848e-05 3.65065684534308e-05 3.6499044020748e-05 3.65000288380522e-05 3.65106793034488e-05 -1.04259352605892e-10 -6.69676778652577e-06 -8.44708051792153e-06 -8.45288940020747e-06 -8.46106900742361e-06 -8.46922407475e-06 -8.47560366041431e-06 -8.47897779681471e-06 -8.47851789772401e-06 -8.47370038147977e-06 1.31352569982239e-05 0.00309901695153985 0.00319013108056283 0.00319155667504451 0.00319356441400493 0.00319556700346377 0.00319713453525078 0.00319796460227068 0.0031978534339785 0.00319667259720857 -1.72703816066681 -0.878879880785989 -0.181784097253166 -0.182093030823458 -0.182529420330056 -0.182966353574209 -0.183309625847713 -0.18349204928215 -0.183468179071459 -0.183210033274174 +AB1_EBV chr6:1412516-4412516 6:2914375:A:C chr6_2914375_A_C chr6 2914375 A C 0.449913 0.073551 0.029878 0.0138277 1.32216141683604e-05 0.000761528659714504 0.000536628417467266 -1 NA NA NA 1.32216141683604e-05 0.000761528659714504 0.000536628417467266 -1 NA NA NA 3.83151076045243e-09 4.30887802086399e-05 6.16439638151432e-05 6.1662884637203e-05 6.16893492695819e-05 6.17155657828099e-05 6.17358050208852e-05 6.17460236951692e-05 6.17435083053162e-05 6.17265813132754e-05 2.67335670903368e-10 1.95755214840349e-06 1.40105574913152e-06 1.40306874183386e-06 1.40590161913239e-06 1.40872631846429e-06 1.41093060082874e-06 1.41207967234115e-06 1.41188033327313e-06 1.4101516492809e-06 4.68962630555799e-06 0.000351002342680615 0.000238095951014486 0.000238338134818822 0.000238679108788393 0.000239019238319394 0.000239284959287019 0.000239424093383826 0.000239401448933722 0.000239195231478321 0.915297298109937 0.188473653824918 0.340376508638551 0.340723095858899 0.341208437665329 0.341689827993623 0.342062243003785 0.342251461519015 0.342207611579621 0.34189981886268 +AB1_EBV chr6:1412516-4412516 6:2914401:G:A chr6_2914401_G_A chr6 2914401 G A 0.0503909 0.0677083 0.0674605 0.315536 3.37903989382671e-05 0.00184438530310166 0.000575749305072093 -1 NA NA NA 3.37903989382671e-05 0.00184438530310166 0.000575749305072093 -1 NA NA NA 3.50376911289106e-10 4.96758289149142e-05 6.56915862278989e-05 6.57172605597296e-05 6.57532207183963e-05 6.57887312841917e-05 6.58158891851144e-05 6.58290990600566e-05 6.58245890958145e-05 6.58000155287485e-05 2.09034212952765e-11 5.36761997901145e-06 3.53441819355873e-06 3.53981002719482e-06 3.54739911063546e-06 3.55495242620422e-06 3.5608180386453e-06 3.56382125348346e-06 3.56316872122301e-06 3.55837028488939e-06 1.67453037152077e-06 0.000883963392274344 0.000570211614939072 0.000570825147685962 0.000571688993428737 0.000572549442921174 0.00057321911261408 0.000573564973504713 0.000573497202384529 0.000572960109854784 -1.47670769626281 0.330729485650394 0.40397204815025 0.404402500327367 0.405005797061682 0.405602213754799 0.406059458283852 0.406283857214265 0.406212233246936 0.405805239605961 +AB1_EBV chr6:1412516-4412516 6:2914502:C:G chr6_2914502_C_G chr6 2914502 C G 0.00245766 0.209088 0.306687 0.495389 3.9047537953121e-05 0.00438973837463217 0.000320070210425683 -1 NA NA NA 3.9047537953121e-05 0.00438973837463217 0.000320070210425683 -1 NA NA NA 2.93611457820829e-10 1.6136632346308e-05 3.80386339173337e-05 3.80267475798636e-05 3.80099629270098e-05 3.79931496362746e-05 3.79799255720913e-05 3.79728724915218e-05 3.7973735146357e-05 3.79835850669857e-05 5.95215988605005e-11 3.70917890764339e-06 4.40649934645662e-06 4.40962790391042e-06 4.41403798711645e-06 4.41843356693725e-06 4.42186713149864e-06 4.42367232750498e-06 4.42339916298949e-06 4.42076209746486e-06 6.24753246060531e-06 0.00148490108672485 0.00145806488870796 0.0014587742047661 0.00145977378640281 0.00146077082315774 0.001461550840378 0.00146196280796287 0.0014619048298717 0.00146131262253826 -1.65345983946009 -0.793697000984798 -0.142396480346853 -0.142669312665948 -0.143054549454361 -0.143440482085462 -0.143744082152327 -0.143906095325838 -0.143886489351122 -0.143660740246291 +AB1_EBV chr6:1412516-4412516 6:2914521:C:A chr6_2914521_C_A chr6 2914521 C A 0.20614 0.0703608 0.0371003 0.0578935 -6.93534828254422e-06 0.000613286361002598 0.000359322953560004 -1 NA NA NA -6.93534828254422e-06 0.000613286361002598 0.000359322953560004 -1 NA NA NA 1.43860220089813e-09 2.00500835682009e-05 4.24379611194419e-05 4.24317697338114e-05 4.24229792199924e-05 4.24141112696858e-05 4.2407050279112e-05 4.24031542841006e-05 4.24033531754856e-05 4.24082265653458e-05 1.00425433816151e-10 -7.24534959424452e-07 -7.73748294791053e-07 -7.74509417674381e-07 -7.75580896950382e-07 -7.76648408012684e-07 -7.7748073561931e-07 -7.77914685709095e-07 -7.77840636185839e-07 -7.77190673610843e-07 2.99064346024811e-06 0.000225325439176917 0.000201202997636832 0.00020133605363049 0.000201523476548863 0.000201710396361092 0.000201856448338797 0.000201933123478497 0.000201921237009441 0.0002018088618075 -0.0642899333933222 -0.576555667676539 -0.0329555345288934 -0.0330617406250537 -0.0332126789418901 -0.0333652329989018 -0.0334871992913355 -0.0335553653514253 -0.0335537863048128 -0.0334724685389816 +AB1_EBV chr6:1412516-4412516 6:2914554:C:T chr6_2914554_C_T chr6 2914554 C T 0.135995 0.038435 0.0429496 0.370848 6.47053539247435e-05 0.00223777734319599 0.00118259558244027 -1 NA NA NA 6.47053539247435e-05 0.00223777734319599 0.00118259558244027 -1 NA NA NA 3.18689749020099e-10 0.000179061771950524 0.000125039542732018 0.000125179499792941 0.000125376975572424 0.000125573802098581 0.000125726856413785 0.000125805389205695 0.000125788588193547 0.000125663596335013 1.05757319394502e-11 1.69376568691927e-05 5.92538130863974e-06 5.93861193914095e-06 5.95730092452391e-06 5.97597060943443e-06 5.99054552494914e-06 5.99811035205237e-06 5.99669074573156e-06 5.98507507534674e-06 9.6175766833845e-07 0.00137701733722103 0.000620409140951185 0.000621347699584995 0.00062267242076679 0.000623995031064763 0.000625027784623004 0.000625565655334832 0.000625469940626079 0.000624654936818488 -1.57149910479072 1.61294185159444 1.04763122349573 1.04878959712318 1.05042214635872 1.05204729742902 1.05330991974445 1.05395806450647 1.0538213965256 1.05279363140955 +AB1_EBV chr6:1412516-4412516 6:2914711:C:CCT chr6_2914711_C_CCT chr6 2914711 C CCT 0.320268 0.107084 0.0314276 0.000656009 1.00794454196126e-05 0.000672864308448527 0.000452688558775338 -1 NA NA NA 1.00794454196126e-05 0.000672864308448527 0.000452688558775338 -1 NA NA NA 6.11914659554838e-08 3.08908269105225e-05 5.27123673074265e-05 5.27172540270212e-05 5.27239006708949e-05 5.27303941178295e-05 5.27353567648797e-05 5.27378404526941e-05 5.27372196452797e-05 5.27331031379703e-05 6.3388208695703e-09 1.27285056200579e-06 1.09552090789256e-06 1.09683247897076e-06 1.0986735500374e-06 1.10050887668888e-06 1.10194389643366e-06 1.10269929246762e-06 1.10258691219298e-06 1.10149012205341e-06 2.67517074212337e-05 0.000282191907234753 0.000215119636993929 0.0002153036373749 0.000215562279839644 0.000215820285181988 0.000216022181983816 0.000216128707906801 0.000216113399346476 0.000215959815439381 3.68604585289092 -0.144329713316701 0.18385129614376 0.18398369439256 0.184166018796946 0.184345674945186 0.184484309070744 0.184555114723677 0.18454023165196 0.184428566659044 +AB1_EBV chr6:1412516-4412516 6:2914809:ATT:A chr6_2914809_ATT_A chr6 2914809 ATT A 0.000447573 -0.408113 0.842956 0.628283 -7.51047265041005e-05 0.0109514034494035 0.00029793787915644 -1 NA NA NA -7.51047265041005e-05 0.0109514034494035 0.00029793787915644 -1 NA NA NA 2.64208065930658e-10 1.40086248601729e-05 3.5542574882971e-05 3.55291586107761e-05 3.55102126508247e-05 3.54912513681538e-05 3.54763622448605e-05 3.54684571175488e-05 3.54695050079257e-05 3.54807223963272e-05 -1.07011080440611e-10 -6.57193498994277e-06 -8.54707725731676e-06 -8.5527244378763e-06 -8.5606772789815e-06 -8.56860768545149e-06 -8.57481477742161e-06 -8.57810429112542e-06 -8.57767155549499e-06 -8.57300721940919e-06 1.50551291235237e-05 0.00345722524180414 0.0036686736517724 0.00367018759650938 0.00367231949345491 0.00367444568572225 0.0036761100317613 0.00367699193386601 0.00367687539704228 0.0036756240603886 -1.75898023945295 -0.935115788042269 -0.210267535254518 -0.210605379803196 -0.211082521692463 -0.211560127054884 -0.211935205428116 -0.212134348712334 -0.212107916286927 -0.211825316827286 +AB1_EBV chr6:1412516-4412516 6:2914984:C:T chr6_2914984_C_T chr6 2914984 C T 0.000287449 0.354267 0.999662 0.723049 2.703077715997e-05 0.0114938828249797 0.00027396398143209 -1 NA NA NA 2.703077715997e-05 0.0114938828249797 0.00027396398143209 -1 NA NA NA 2.49377474437249e-10 1.20122914886385e-05 3.28004061135531e-05 3.27853154081789e-05 3.2764010103102e-05 3.27426964355368e-05 3.27259666666453e-05 3.27170867158878e-05 3.27182643369172e-05 3.2730867781985e-05 8.56525709482312e-11 2.27070858295486e-06 3.08874315563543e-06 3.09055516420125e-06 3.09310137612001e-06 3.09563882057952e-06 3.09762571652866e-06 3.09868271811578e-06 3.09855490771735e-06 3.09708106554615e-06 1.65152603369177e-05 0.00333543589553106 0.00388477309447274 0.00388594889741285 0.00388760268835554 0.00388925012559928 0.00389053841161184 0.00389122064397984 0.00389113073047462 0.00389016315885473 -1.81674945056399 -1.08885857313042 -0.290557908812972 -0.290978394291082 -0.291572197093555 -0.29216642522216 -0.292632977426566 -0.292880647345178 -0.292847765353393 -0.292496233211677 +AB1_EBV chr6:1412516-4412516 6:2915098:G:A chr6_2915098_G_A chr6 2915098 G A 0.00527826 0.0543171 0.215615 0.801105 -9.76874223221042e-06 0.00254577990784939 0.000278829707978434 -1 NA NA NA -9.76874223221042e-06 0.00254577990784939 0.000278829707978434 -1 NA NA NA 2.42262873180657e-10 1.23875645887906e-05 3.33603046810113e-05 3.33456713272467e-05 3.33250067920336e-05 3.330432922802e-05 3.32880930729057e-05 3.32794671508043e-05 3.32805938368856e-05 3.32928003399584e-05 1.295652743051e-11 -8.03849430033876e-07 -1.11801393012677e-06 -1.11877089860112e-06 -1.11983380012676e-06 -1.12089149424497e-06 -1.12171656441473e-06 -1.12214929538475e-06 -1.12208221811762e-06 -1.12144755768726e-06 3.41909754540966e-06 0.000751860547074559 0.000858931641245195 0.000859218031145905 0.000859620868089426 0.000860022209225979 0.000860336005987524 0.000860501937197444 0.000860479407270481 0.00086024269987228 -1.84569377129065 -1.05809587573848 -0.273632095064505 -0.274031139810482 -0.274594787229997 -0.275158957447462 -0.27560206020752 -0.275837513584008 -0.275806770292984 -0.275473667121246 +AB1_EBV chr6:1412516-4412516 6:2915224:C:T chr6_2915224_C_T chr6 2915224 C T 0.0682216 -0.0937519 0.0584923 0.108977 -5.20821122150971e-06 0.000759432459797402 0.000297929467887204 -1 NA NA NA -5.20821122150971e-06 0.000759432459797402 0.000297929467887204 -1 NA NA NA 8.86204646290237e-10 1.38755065518203e-05 3.55598635899948e-05 3.55458691901148e-05 3.55261005201324e-05 3.55063481147054e-05 3.5490904371254e-05 3.54828262789226e-05 3.54841786182658e-05 3.54962335818677e-05 -8.34908632156713e-11 -4.3910943201162e-07 -5.94966695873379e-07 -5.95295798613142e-07 -5.9575829500644e-07 -5.96222632316608e-07 -5.96593086246553e-07 -5.96802610781167e-07 -5.96805807681173e-07 -5.96573372116411e-07 3.29034782342141e-06 0.000237055757649994 0.000254735053338896 0.000254834640236507 0.000254974779840339 0.000255114813479599 0.000255225044981329 0.000255284621984149 0.000255279476045557 0.000255200670056554 -0.548769259026239 -0.944663822205111 -0.209781231050728 -0.21013515614902 -0.210635204852288 -0.211134852203649 -0.211525379115496 -0.211729305677665 -0.211694305328359 -0.211388240157156 +AB1_EBV chr6:1412516-4412516 6:2915401:C:T chr6_2915401_C_T chr6 2915401 C T 0.0200603 0.111735 0.106574 0.294442 2.65891628161913e-05 0.0020077713393796 0.00040294679285513 -1 NA NA NA 2.65891628161913e-05 0.0020077713393796 0.00040294679285513 -1 NA NA NA 4.07700965734278e-10 2.44724106421007e-05 4.73314047000324e-05 4.73276541540497e-05 4.73223445037227e-05 4.7316985754982e-05 4.73127293219974e-05 4.73104211616356e-05 4.73106421248228e-05 4.73137418639691e-05 4.51133110511089e-11 2.97815421029617e-06 2.94157430655294e-06 2.94440721491119e-06 2.94840324770975e-06 2.95239262933605e-06 2.95551581206691e-06 2.95716627297094e-06 2.95693551488462e-06 2.95456849415166e-06 3.08439022087468e-06 0.000781076959890063 0.000652341106383485 0.000652801889347646 0.000653451763617018 0.000654100709838075 0.000654609010407683 0.000654877985192742 0.000654841122017456 0.000654456890573819 -1.32518318215438 -0.377242602623381 0.0761752166918708 0.0761356706107117 0.0760797265014599 0.0760229850739513 0.075977550276229 0.0759524734576429 0.0759540325158889 0.0759859442442865 +AB1_EBV chr6:1412516-4412516 6:2915430:G:T chr6_2915430_G_T chr6 2915430 G T 0.246598 0.100933 0.0338728 0.0028847 1.43993571296611e-06 0.000398239121275289 0.000277947681035617 -1 NA NA NA 1.43993571296611e-06 0.000398239121275289 0.000277947681035617 -1 NA NA NA 1.95359444118897e-08 1.22955320476787e-05 3.32598606505559e-05 3.32449896815547e-05 3.32239748206454e-05 3.32029577224263e-05 3.31864839176995e-05 3.31777877703217e-05 3.317905715224e-05 3.31916490750607e-05 1.94451230905899e-09 1.15787296945157e-07 1.64947440322177e-07 1.6504072388084e-07 1.6516985957693e-07 1.6529933656796e-07 1.65403292068897e-07 1.65463735006879e-07 1.65468712156058e-07 1.65410804132149e-07 1.46776813293119e-05 0.000116878731773104 0.000134349021559498 0.000134392183985858 0.000134452796106265 0.000134513232529988 0.000134560645405559 0.000134586041806141 0.000134583378036163 0.000134548827726025 2.54429419021292 -1.06555304117893 -0.276647521581845 -0.277055038984506 -0.277631108644985 -0.278207392851923 -0.278659145756337 -0.278897509364558 -0.27886236153174 -0.278516524325726 +AB1_EBV chr6:1412516-4412516 6:2915652:C:G chr6_2915652_C_G chr6 2915652 C G 0.00124761 -0.701166 0.415776 0.091717 -0.00027199989545806 0.0132006112124618 0.000678245680799772 -1 NA NA NA -0.00027199989545806 0.0132006112124618 0.000678245680799772 -1 NA NA NA 9.39384588742169e-10 6.37939353453445e-05 7.671516910991e-05 7.67489388243181e-05 7.67965239366717e-05 7.68440271393261e-05 7.68812340125626e-05 7.69009327205877e-05 7.6898261707839e-05 7.68701825591455e-05 -6.42735476372314e-10 -4.60272210722758e-05 -2.81010998919438e-05 -2.81430624371292e-05 -2.82022796605134e-05 -2.82614948535306e-05 -2.83079517080839e-05 -2.8332590368358e-05 -2.83292911595377e-05 -2.82942615712114e-05 2.44607892199364e-05 0.00655992902413388 0.00403496960382416 0.00403931933825822 0.004045455705724 0.00405158954622103 0.00405640032779591 0.00405895155185838 0.00405861086096073 0.00405498528629517 -0.490492192682643 0.580869139139011 0.559100655149265 0.559580451515449 0.560256520781342 0.560931393109285 0.561459987811208 0.561739887129169 0.56170204193343 0.561303223541298 +AB1_EBV chr6:1412516-4412516 6:2915708:C:T chr6_2915708_C_T chr6 2915708 C T 0.268358 0.0578417 0.0337544 0.0866024 -1.55092260036492e-06 0.000399053682974076 0.000279038690448874 -1 NA NA NA -1.55092260036492e-06 0.000399053682974076 0.000279038690448874 -1 NA NA NA 9.99918434915411e-10 1.243560802191e-05 3.3379819889901e-05 3.33653505888417e-05 3.33449084962539e-05 3.33244451596598e-05 3.33083654268511e-05 3.32998042428375e-05 3.33008838108988e-05 3.33129225685633e-05 5.67792470097502e-11 -1.31052851840977e-07 -1.77031336788425e-07 -1.77166611653612e-07 -1.77355750962205e-07 -1.77543235607044e-07 -1.77688395240212e-07 -1.77762765137038e-07 -1.77747460064138e-07 -1.77630972318274e-07 2.08244294300018e-06 0.000118345449793908 0.000134579726341672 0.000134625602728603 0.000134690086743743 0.000134754291173147 0.000134804427965216 0.000134830835004099 0.000134827025019115 0.000134788913447476 -0.428043450143346 -1.05422501733844 -0.273047283166974 -0.273441154479705 -0.273997765178134 -0.27455513627753 -0.274993248416976 -0.275226599939566 -0.275197292241188 -0.274869447893877 +AB1_EBV chr6:1412516-4412516 6:2915966:T:A chr6_2915966_T_A chr6 2915966 T A 0.00245882 0.210171 0.306692 0.493166 3.92701027237077e-05 0.00439785149583809 0.000320520194884821 -1 NA NA NA 3.92701027237077e-05 0.00439785149583809 0.000320520194884821 -1 NA NA NA 2.94292097139502e-10 1.61795668167075e-05 3.80894059344709e-05 3.80775558887321e-05 3.80608224057336e-05 3.80440601186295e-05 3.80308758920353e-05 3.80238437443115e-05 3.80247031979213e-05 3.80345224615323e-05 5.99684729433109e-11 3.73475040204798e-06 4.43104049842842e-06 4.43419305617215e-06 4.43863698689777e-06 4.44306635199132e-06 4.44652636209089e-06 4.44834552482554e-06 4.44807037697052e-06 4.44541319581013e-06 6.26486940101891e-06 0.00148932064238078 0.00146053952541834 0.00146125220886662 0.00146225654360647 0.00146325832977999 0.0014640420683366 0.00146445600294546 0.00146439774651902 0.00146380270883261 -1.65114435891219 -0.791039850900761 -0.141062621632935 -0.141334084193934 -0.141717387334125 -0.142101387972814 -0.142403474591471 -0.142564688408347 -0.142545197074177 -0.1423206015918 +AB1_EBV chr6:1412516-4412516 6:2916048:T:C chr6_2916048_T_C chr6 2916048 T C 0.0131298 0.210555 0.133103 0.113674 1.16850326021304e-05 0.00172479358807696 0.000297227997039795 -1 NA NA NA 1.16850326021304e-05 0.00172479358807696 0.000297227997039795 -1 NA NA NA 7.32208667558176e-10 1.41088836751237e-05 3.54387090129078e-05 3.54260275712218e-05 3.54080972950051e-05 3.53901497406694e-05 3.5376061220974e-05 3.53685893673649e-05 3.53695947911179e-05 3.53802223669006e-05 1.4525943007589e-10 1.06636629333676e-06 1.32361564115894e-06 1.32468806841809e-06 1.32619359643205e-06 1.32769517608615e-06 1.32887230721187e-06 1.32949842177912e-06 1.32941971911649e-06 1.32853811916089e-06 6.44078982806224e-06 0.000550740041603564 0.000577003314918781 0.000577256969646812 0.00057761377192192 0.000577969673755596 0.000578248449890955 0.000578396376971511 0.000578377155963118 0.000578167815871085 -0.739651622406083 -0.927984342542101 -0.213194107964821 -0.213512316356463 -0.213962325976297 -0.214412827325076 -0.214766473181057 -0.214953998071122 -0.214928682878758 -0.214661860910844 +AB1_EBV chr6:1412516-4412516 6:2916260:G:GT chr6_2916260_G_GT chr6 2916260 G GT 0.341792 0.130362 0.0314309 3.36008e-05 4.16354152320501e-06 0.000467766307919146 0.000321953196178781 -1 NA NA NA 4.16354152320501e-06 0.000467766307919146 0.000321953196178781 -1 NA NA NA 8.59497209082973e-07 1.63936356890018e-05 3.81301738872002e-05 3.81196184125329e-05 3.81046546470492e-05 3.80896300407893e-05 3.80777742469636e-05 3.80713916328134e-05 3.80720403650775e-05 3.80806788282489e-05 1.08143809015176e-07 3.95760299744966e-07 4.56128958390794e-07 4.56516363030521e-07 4.57059793071343e-07 4.57600210214348e-07 4.58020975083182e-07 4.58239807917504e-07 4.58201176240885e-07 4.57870130496292e-07 0.000120149912259846 0.000154870439427054 0.000149886260903151 0.000149965833929052 0.000150077714409609 0.000150189190849025 0.000150276261048877 0.0001503219935621 0.000150314966550464 0.000150248004591374 6.32838569594526 -0.777895797641916 -0.13999287140045 -0.140230039891527 -0.140566413222216 -0.140904285152593 -0.141171069056003 -0.141314994010152 -0.141301065694943 -0.141107798588142 +AB1_EBV chr6:1412516-4412516 6:2916310:C:T chr6_2916310_C_T chr6 2916310 C T 0.017997 0.104869 0.112272 0.350269 -2.06608058363164e-06 0.00127991421863132 0.00027246801160119 -1 NA NA NA -2.06608058363164e-06 0.00127991421863132 0.00027246801160119 -1 NA NA NA 3.49143165505881e-10 1.18679125238671e-05 3.2632254549013e-05 3.26169189667467e-05 3.25952710097641e-05 3.2573613882791e-05 3.25566114476792e-05 3.25475803654816e-05 3.25487625120573e-05 3.25615472502304e-05 3.45132787067508e-11 -1.58827418440601e-07 -2.38338489475163e-07 -2.38361809245648e-07 -2.38395479473152e-07 -2.38427362863984e-07 -2.38449401383151e-07 -2.38456508572611e-07 -2.38445317959044e-07 -2.3841330949699e-07 2.77649313724686e-06 0.000367990900120619 0.000432980305550763 0.000433105021681782 0.000433280448304889 0.000433455130915465 0.000433591631112812 0.00043366377644883 0.000433653963752813 0.00043355098836745 -1.48023510627835 -1.10095065776515 -0.295697603057446 -0.296127968007364 -0.296735640306601 -0.297343782289945 -0.297821363172618 -0.298075088353595 -0.298041879874098 -0.297682774748979 +AB1_EBV chr6:1412516-4412516 6:2916347:C:T chr6_2916347_C_T chr6 2916347 C T 0.00234823 -0.472653 0.319524 0.139076 -7.30572554286086e-05 0.00577508239019442 0.000388321169953576 -1 NA NA NA -7.30572554286086e-05 0.00577508239019442 0.000388321169953576 -1 NA NA NA 6.85520808868472e-10 2.2868798622248e-05 4.57069624728122e-05 4.57020544071268e-05 4.56950926405767e-05 4.56880889393967e-05 4.56825623082732e-05 4.56796131516313e-05 4.56799871004238e-05 4.56841289950174e-05 -3.16876086277397e-10 -7.94803449252908e-06 -8.11205163551567e-06 -8.11973214656119e-06 -8.130556928672e-06 -8.14136422670553e-06 -8.14983138284861e-06 -8.15431809887712e-06 -8.15371694660398e-06 -8.14733269420916e-06 1.46564883619148e-05 0.00220059709444493 0.00188328457825256 0.001884574271071 0.00188639223184881 0.00188820763332014 0.00188963024641197 0.00189038432858177 0.00189028374688367 0.00188921187334649 -0.805538306419943 -0.445015513483716 0.0412518323613069 0.041184142630815 0.0410880529833104 0.040991275198154 0.0409148284635545 0.0408739783371201 0.0408790532144785 0.0409361160965389 +AB1_EBV chr6:1412516-4412516 6:2916373:AG:A chr6_2916373_AG_A chr6 2916373 AG A 0.000633458 0.378783 0.6089 0.533891 6.80076325399599e-05 0.00837578208513209 0.000310595076911557 -1 NA NA NA 6.80076325399599e-05 0.00837578208513209 0.000310595076911557 -1 NA NA NA 2.82344029787875e-10 1.52314386571413e-05 3.69681347368441e-05 3.6955920892769e-05 3.69386700840338e-05 3.69214017424662e-05 3.69078399003114e-05 3.69006400664021e-05 3.69015986878916e-05 3.6911824259152e-05 1.03225036954902e-10 6.28247035175782e-06 7.6961275257194e-06 7.70176953384914e-06 7.7097180876155e-06 7.71764860272493e-06 7.72385925292066e-06 7.72715284259484e-06 7.7267227077645e-06 7.72206040997617e-06 1.1830194013809e-05 0.00276098092003172 0.00279124475241787 0.00279255308801732 0.00279439618701084 0.00279623524135786 0.00279767548721564 0.00279843899835864 0.00279833846850423 0.00279725601392684 -1.69259086954052 -0.851427364906821 -0.170942487387372 -0.171233233235637 -0.171643885040182 -0.17205497689485 -0.172377835971572 -0.172549221446217 -0.172526354760116 -0.172282894380725 +AB1_EBV chr6:1412516-4412516 6:2917032:A:AGT chr6_2917032_A_AGT chr6 2917032 A AGT 0.0680982 -0.0965194 0.0586032 0.0995589 -5.67228412404672e-06 0.00077565669488866 0.00030211835616889 -1 NA NA NA -5.67228412404672e-06 0.00077565669488866 0.00030211835616889 -1 NA NA NA 9.52600995304864e-10 1.42308031348723e-05 3.6038247010799e-05 3.60245211065824e-05 3.60051298055076e-05 3.59857562531494e-05 3.59706146822702e-05 3.59627073189676e-05 3.59640618618359e-05 3.59759265813746e-05 -9.23290858444292e-11 -4.84690774651301e-07 -6.47133510036717e-07 -6.47503854785806e-07 -6.48024417118163e-07 -6.48546824271423e-07 -6.48963039774495e-07 -6.49197352402227e-07 -6.49198512506053e-07 -6.48933509414694e-07 3.48472222779747e-06 0.000245061586619285 0.000259819386500546 0.000259924962621006 0.000260073545200983 0.00026022203960888 0.000260338956286304 0.00026040217319824 0.000260396762721103 0.000260313248205561 -0.476521027518269 -0.919380139346068 -0.196418014179931 -0.196759260029226 -0.197241434204558 -0.197723152303706 -0.198099481564319 -0.198295624588887 -0.198261071517732 -0.197964826024948 +AB1_EBV chr6:1412516-4412516 6:2917176:C:T chr6_2917176_C_T chr6 2917176 C T 0.00910822 -0.09442 0.158339 0.550964 -5.41421170898064e-06 0.00183684381811164 0.0002756075401944 -1 NA NA NA -5.41421170898064e-06 0.00183684381811164 0.0002756075401944 -1 NA NA NA 2.84232871122056e-10 1.21041071443067e-05 3.29944702128207e-05 3.29793530034869e-05 3.29580109574804e-05 3.29366660533178e-05 3.29199227122373e-05 3.29110558340144e-05 3.29122790564568e-05 3.29249636459084e-05 -2.75059829382995e-11 -4.25657770042768e-07 -6.22568345957953e-07 -6.22850021454831e-07 -6.23246251132018e-07 -6.23644423514365e-07 -6.23962855072759e-07 -6.24144638057899e-07 -6.24151420349237e-07 -6.23958477415872e-07 3.10160324945875e-06 0.000534191677338166 0.000620696835564093 0.000620886366756455 0.000621152978432888 0.000621418734081884 0.000621626868351387 0.000621737656185905 0.000621724366873825 0.000621570005169982 -1.68592328980415 -1.08124416098852 -0.284658827520475 -0.285077409368548 -0.285668501050224 -0.28625984591446 -0.286723799812775 -0.286969473406826 -0.286935418001979 -0.286583691244332 +AB1_EBV chr6:1412516-4412516 6:2917233:T:C chr6_2917233_T_C chr6 2917233 T C 0.24434 0.0999066 0.0339502 0.00325327 1.17275027333658e-06 0.000394264827547286 0.000275700504050569 -1 NA NA NA 1.17275027333658e-06 0.000394264827547286 0.000275700504050569 -1 NA NA NA 1.75632579654595e-08 1.21147943333276e-05 3.30022108794099e-05 3.29872041986018e-05 3.29660016367499e-05 3.29447963476298e-05 3.29281712886146e-05 3.29193868298062e-05 3.29206481604014e-05 3.293332313767e-05 1.73093484856806e-09 9.27937305938899e-08 1.34512791773872e-07 1.34587916993572e-07 1.34691492371402e-07 1.34795501405842e-07 1.34879543304851e-07 1.34929456975357e-07 1.34935875093499e-07 1.34893029975727e-07 1.37970324369143e-05 0.000114686143418646 0.00013313386124762 0.000133175189798825 0.000133233233124206 0.000133291095415736 0.00013333646639927 0.000133360733104092 0.000133358107471219 0.000133324921510813 2.43784722260616 -1.08036161148688 -0.284424250069105 -0.284839373749135 -0.28542608014791 -0.286013030071064 -0.286473266322151 -0.286716368748884 -0.286681165173086 -0.286329828223755 +AB1_EBV chr6:1412516-4412516 6:2917240:G:T chr6_2917240_G_T chr6 2917240 G T 0.019097 -0.159466 0.109105 0.143855 -1.06007158704344e-05 0.0014462718648323 0.000302294232483735 -1 NA NA NA -1.06007158704344e-05 0.0014462718648323 0.000302294232483735 -1 NA NA NA 6.26153740838257e-10 1.44071633015345e-05 3.60294952601571e-05 3.60183204861313e-05 3.60025374024845e-05 3.59867629945237e-05 3.5974414300767e-05 3.59679229569778e-05 3.59689346483901e-05 3.5978469812833e-05 -9.45614227094562e-11 -9.42774140466601e-07 -1.20310496862918e-06 -1.2042899547144e-06 -1.20596013986471e-06 -1.20763224967048e-06 -1.20895012347198e-06 -1.20966170492439e-06 -1.20959718085394e-06 -1.20865084641601e-06 4.64312917459456e-06 0.000463145208134987 0.000483564555405223 0.000483806510448037 0.000484147448334549 0.000484488181541861 0.000484755810549468 0.000484898864214593 0.000484882652700948 0.00048468546985797 -0.896121227373675 -0.907063455021076 -0.196660889852437 -0.196931397061284 -0.19731343773209 -0.197695176587837 -0.19799385596227 -0.198150606034225 -0.198125590256057 -0.1978941359327 +AB1_EBV chr6:1412516-4412516 6:2917276:C:T chr6_2917276_C_T chr6 2917276 C T 0.322012 0.110478 0.0313368 0.000422698 1.16203311784586e-05 0.00072476971171035 0.000487556916038523 -1 NA NA NA 1.16203311784586e-05 0.00072476971171035 0.000487556916038523 -1 NA NA NA 9.07661742481001e-08 3.54577585259985e-05 5.64822031250835e-05 5.64917294193233e-05 5.65048911449434e-05 5.65178814771113e-05 5.65279262925007e-05 5.65330884422946e-05 5.65320761040156e-05 5.65240852900257e-05 9.70184583297669e-09 1.55745503383001e-06 1.25118072636648e-06 1.25276882573555e-06 1.25499911161245e-06 1.25722326398891e-06 1.25896298292562e-06 1.25987939423479e-06 1.25974414810072e-06 1.25841584583106e-06 3.35268268988337e-05 0.00031533030047395 0.000229694983463847 0.000229904152209295 0.000230198240225988 0.000230491662996154 0.00023072132284593 0.000230842536310908 0.000230825180163132 0.000230650554226152 4.08032480416118 -0.00644690209912024 0.2529267939592 0.253135137015608 0.253424346235863 0.253710721570567 0.253932958830646 0.254047984566061 0.254026965973055 0.253852000911881 +AB1_EBV chr6:1412516-4412516 6:2917284:G:A chr6_2917284_G_A chr6 2917284 G A 0.000185896 2.17343 1.33618 0.103821 0.000613554969808555 0.0347133916275768 0.000548510584581052 -1 NA NA NA 0.000613554969808555 0.0347133916275768 0.000548510584581052 -1 NA NA NA 8.4773204979451e-10 4.37818021334355e-05 6.30578137241499e-05 6.30722778698699e-05 6.30926174150932e-05 6.31128835806283e-05 6.3128733630544e-05 6.31371227967198e-05 6.31360029299488e-05 6.31240802836088e-05 1.79370456202886e-09 8.949699191577e-05 6.52179650543132e-05 6.53014400084777e-05 6.54191687976645e-05 6.55368291330057e-05 6.56291037498186e-05 6.56780492507771e-05 6.567155176552e-05 6.56020764286465e-05 7.26163392126802e-05 0.0158929736566894 0.0108758088609039 0.0108860145849345 0.010900406902664 0.0109147885991464 0.0109260658449788 0.0109320473330933 0.0109312538622067 0.01092276412053 -0.593152553870173 0.20442926523208 0.363053178106279 0.36332222809547 0.363700907419618 0.364078573063729 0.364374204594942 0.364530795146633 0.364509946503933 0.364287483000271 +AB1_EBV chr6:1412516-4412516 6:2917286:G:A chr6_2917286_G_A chr6 2917286 G A 0.00245976 0.211607 0.306676 0.490192 3.95662131838167e-05 0.00440843832881892 0.000321126231617619 -1 NA NA NA 3.95662131838167e-05 0.00440843832881892 0.000321126231617619 -1 NA NA NA 2.95218797816824e-10 1.62372798357836e-05 3.81578001835832e-05 3.8145998770834e-05 3.81293338499226e-05 3.81126398975393e-05 3.80995090421955e-05 3.80925049378021e-05 3.80933601060031e-05 3.81031383111853e-05 6.0571039331081e-11 3.76880877656163e-06 4.46368651768963e-06 4.4668710239593e-06 4.47136000792566e-06 4.4758343419471e-06 4.47932955082859e-06 4.48116730343495e-06 4.48088951852954e-06 4.47820557190098e-06 6.28796818169363e-06 0.0014951406154105 0.00146376129947197 0.00146447844632928 0.00146548908090669 0.00146649716193881 0.00146728583268409 0.00146770237436583 0.00146764374925418 0.00146704496098117 -1.64800039177406 -0.787479166502865 -0.139268607899495 -0.139538237731458 -0.139918953887551 -0.140300369876369 -0.140600431855955 -0.140760576327229 -0.140741238231277 -0.14051818561178 +AB1_EBV chr6:1412516-4412516 6:2917318:G:A chr6_2917318_G_A chr6 2917318 G A 0.058009 -0.131377 0.0635492 0.0387035 -7.99509123567877e-06 0.00090682772847784 0.000319083731836756 -1 NA NA NA -7.99509123567877e-06 0.00090682772847784 0.000319083731836756 -1 NA NA NA 1.72502156829369e-09 1.62653333570556e-05 3.78964433213557e-05 3.78853134403692e-05 3.78695978162394e-05 3.7853849576543e-05 3.78414495824049e-05 3.7834809455084e-05 3.78355596771822e-05 3.78447033793833e-05 -2.16350082937035e-10 -7.84421219436232e-07 -8.9882425130246e-07 -8.99544960274532e-07 -9.00561224799436e-07 -9.01574155145299e-07 -9.02364627045751e-07 -9.02778153844284e-07 -9.02710464096011e-07 -9.02095829651832e-07 5.82552481850122e-06 0.000310416825672205 0.000300705351122607 0.000300858991487216 0.000301075549948497 0.000301291560771109 0.000301460471977938 0.000301549460046424 0.000301536383244006 0.000301407317389571 0.117277672031676 -0.785752934333665 -0.146141541716107 -0.146395579645013 -0.146754235364545 -0.147113672002027 -0.147396776220942 -0.147548554389052 -0.147531837128308 -0.147323801769661 +AB1_EBV chr6:1412516-4412516 6:2917351:C:T chr6_2917351_C_T chr6 2917351 C T 0.0551008 -0.0252723 0.0655198 0.699705 8.76563114378706e-06 0.000953081915894028 0.000324133599466037 -1 NA NA NA 8.76563114378706e-06 0.000953081915894028 0.000324133599466037 -1 NA NA NA 2.55308349576141e-10 1.64770820887932e-05 3.8498544760935e-05 3.84882018246528e-05 3.84736412993685e-05 3.84590928995726e-05 3.8447696457833e-05 3.84416897867099e-05 3.84425830315233e-05 3.84513011942451e-05 -6.77317053600951e-12 8.35503496407967e-07 9.88349177806006e-07 9.89186716492214e-07 9.90372368094158e-07 9.91559209796093e-07 9.92492417400822e-07 9.92991882622889e-07 9.92935723200553e-07 9.92246925136894e-07 1.11796892423137e-06 0.000324638038118916 0.000316223270509299 0.000316393706294589 0.000316634430626803 0.000316875070328934 0.000317063943593495 0.000317164552651642 0.00031715224106143 0.000317011488610749 -1.79324513204221 -0.772818538324604 -0.130378363475097 -0.130607360246403 -0.130929491861886 -0.131251198503196 -0.131503043786358 -0.131635576107759 -0.131615451449086 -0.131422298142715 +AB1_EBV chr6:1412516-4412516 6:2917734:C:G chr6_2917734_C_G chr6 2917734 C G 0.00245994 0.211399 0.306657 0.490594 3.9524191170592e-05 0.00440673010071969 0.000321045681277887 -1 NA NA NA 3.9524191170592e-05 0.00440673010071969 0.000321045681277887 -1 NA NA NA 2.95091129039371e-10 1.62296994164451e-05 3.81486982592076e-05 3.81368904147737e-05 3.81202164335897e-05 3.81035134521812e-05 3.80903755433228e-05 3.80833677277856e-05 3.80842234498353e-05 3.80940070589232e-05 6.04839396679464e-11 3.76407889292354e-06 4.45904038663407e-06 4.46222044321167e-06 4.46670315578475e-06 4.47117123112336e-06 4.47466154078533e-06 4.47649670406267e-06 4.47621928120657e-06 4.47353905092034e-06 6.28435419419683e-06 0.00149427406313861 0.00146323196856338 0.00146394847452663 0.00146495820496947 0.00146596538275929 0.00146675334579134 0.00146716951316541 0.00146711094031488 0.00146651268904095 -1.64843294008008 -0.787946128299184 -0.13950717013481 -0.139777042428051 -0.140158100645596 -0.140539858357503 -0.140840188064173 -0.141000474072818 -0.140981116047954 -0.140757860005393 +AB1_EBV chr6:1412516-4412516 6:2917881:C:A chr6_2917881_C_A chr6 2917881 C A 0.00116755 0.370974 0.425921 0.383759 3.53736518553954e-05 0.00545300435877033 0.000294806223373634 -1 NA NA NA 3.53736518553954e-05 0.00545300435877033 0.000294806223373634 -1 NA NA NA 3.40527758013535e-10 1.37669358643734e-05 3.51818012726602e-05 3.51682166763565e-05 3.51490289628559e-05 3.51298263665128e-05 3.51147499283518e-05 3.51067488721605e-05 3.51078174978935e-05 3.51191886372793e-05 1.23616403503735e-10 3.09563226436544e-06 4.02551039150873e-06 4.02818215912796e-06 4.03194076257432e-06 4.03568836199183e-06 4.03862275252425e-06 4.04018062501683e-06 4.03998251792172e-06 4.03778840396079e-06 1.02563779922254e-05 0.00170919184224034 0.00182823169391561 0.00182896711066571 0.00183000229100878 0.00183103458991319 0.0018318426997936 0.00183227111349744 0.00183221507839199 0.00183160844974472 -1.50522051711543 -0.952519223989972 -0.220469866027951 -0.22081636908141 -0.221305864754931 -0.221795829164183 -0.222180559793347 -0.222384730765843 -0.222357403332269 -0.222067168807617 +AB1_EBV chr6:1412516-4412516 6:2917970:G:A chr6_2917970_G_A chr6 2917970 G A 0.062377 -0.00141246 0.0610677 0.981547 1.27354036804579e-05 0.00105882371419752 0.00037421893669809 -1 NA NA NA 1.27354036804579e-05 0.00105882371419752 0.00037421893669809 -1 NA NA NA 2.35118899459539e-10 2.16104077010826e-05 4.41025022891234e-05 4.40971333598514e-05 4.40895829848684e-05 4.40820023943699e-05 4.40760067470158e-05 4.40727569685085e-05 4.40730346409258e-05 4.40773046136013e-05 -7.95686349561399e-13 1.37289483938082e-06 1.41555781180205e-06 1.41693236704312e-06 1.41887466937707e-06 1.42081459579131e-06 1.42233290866819e-06 1.42313298367922e-06 1.42301415005418e-06 1.42185015034832e-06 9.26739669098075e-07 0.000398779291250974 0.000345973236210372 0.000346207904069368 0.000346539213308086 0.000346870131954123 0.00034712928751056 0.000347266191582495 0.000347246721450257 0.000347049466693444 -1.87562581937529 -0.50161395275396 0.00551771645585486 0.00543566869900669 0.00532068394824137 0.00520523735131473 0.00511374182841173 0.00506371743170675 0.0050669063026163 0.00513018064624138 +AB1_EBV chr6:1412516-4412516 6:2917981:C:T chr6_2917981_C_T chr6 2917981 C T 0.0106991 -0.179925 0.144395 0.212743 -1.46565807176174e-05 0.00193638244665908 0.000304691406547875 -1 NA NA NA -1.46565807176174e-05 0.00193638244665908 0.000304691406547875 -1 NA NA NA 4.83699583433394e-10 1.47995421524578e-05 3.62857206053768e-05 3.62729810870845e-05 3.62550074572633e-05 3.62370233763348e-05 3.6222902803972e-05 3.62154049104344e-05 3.62163926891588e-05 3.62270121787056e-05 -8.29883274842750e-11 -1.36433698015565e-06 -1.65744443378711e-06 -1.6586210465356e-06 -1.66028304758396e-06 -1.66194249736079e-06 -1.66324242346387e-06 -1.66393134904925e-06 -1.66383901756174e-06 -1.66285693379194e-06 4.90772202982209e-06 0.000633019966572649 0.000646002662206916 0.000646290010074167 0.000646695172156275 0.00064709951297063 0.000647416170251992 0.000647583981357366 0.000647561655030434 0.000647323077262763 -1.15425314209433 -0.880192744763693 -0.189574513510048 -0.189885967007717 -0.190325348593937 -0.190765011444355 -0.191110234953281 -0.191293539992217 -0.191269376694 -0.191009801374269 +AB1_EBV chr6:1412516-4412516 6:2918284:C:A chr6_2918284_C_A chr6 2918284 C A 0.000833908 -0.556691 0.523047 0.287183 -7.44030003889521e-05 0.00777112881458192 0.00032953541860814 -1 NA NA NA -7.44030003889521e-05 0.00777112881458192 0.00032953541860814 -1 NA NA NA 4.06846382975239e-10 1.69954040133585e-05 3.91104286633995e-05 3.90998019339285e-05 3.90847734770854e-05 3.90697107981359e-05 3.90578611687294e-05 3.90515458445335e-05 3.90523375456124e-05 3.90612055195211e-05 -2.20524022350319e-10 -7.18967998108677e-06 -8.37893111831845e-06 -8.38551510128346e-06 -8.39478151687654e-06 -8.40401980457779e-06 -8.41124403165043e-06 -8.41505667879456e-06 -8.41451703711257e-06 -8.40903459522916e-06 1.51066998856523e-05 0.00268035395968752 0.0025741739876467 0.00257554281723802 0.00257747058093055 0.00257939380192304 0.00258089918016679 0.00258169547515111 0.00258158646111776 0.00258044903598945 -1.32728148392639 -0.741846034061399 -0.114609656474713 -0.114841707112959 -0.115169891099532 -0.115498845938077 -0.1157576615097 -0.115895656525368 -0.115878494926097 -0.115685046477238 diff --git a/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.bgz b/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.bgz new file mode 100644 index 000000000..2f298d48b Binary files /dev/null and b/tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.bgz differ diff --git a/tests/gentropy/data_samples/finngen_credset_summary_sample.tsv.bgz b/tests/gentropy/data_samples/finngen_credset_summary_sample.tsv.bgz new file mode 100644 index 000000000..148f0f22f Binary files /dev/null and b/tests/gentropy/data_samples/finngen_credset_summary_sample.tsv.bgz differ diff --git a/tests/gentropy/data_samples/finucane_PIPs.npy b/tests/gentropy/data_samples/finucane_PIPs.npy deleted file mode 100644 index 2a93a5c71..000000000 Binary files a/tests/gentropy/data_samples/finucane_PIPs.npy and /dev/null differ diff --git a/tests/gentropy/data_samples/gwas_catalog_ancestries.tsv b/tests/gentropy/data_samples/gwas_catalog_ancestries.tsv new file mode 100644 index 000000000..48423eeee --- /dev/null +++ b/tests/gentropy/data_samples/gwas_catalog_ancestries.tsv @@ -0,0 +1,20 @@ +STUDY ACCESSION PUBMED ID FIRST AUTHOR DATE INITIAL SAMPLE DESCRIPTION REPLICATION SAMPLE DESCRIPTION STAGE NUMBER OF INDIVIDUALS BROAD ANCESTRAL CATEGORY COUNTRY OF ORIGIN COUNTRY OF RECRUITMENT ADDITIONAL ANCESTRY DESCRIPTION ANCESTRY DESCRIPTOR FOUNDER/GENETICALLY ISOLATED POPULATION NUMBER OF CASES NUMBER OF CONTROLS SAMPLE DESCRIPTION +GCST004795 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 205 Asian unspecified, African American or Afro-Caribbean, Native American, Other admixed ancestry NR U.S. +GCST004795 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 356 European NR U.S. +GCST004796 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 356 European NR U.S. +GCST004796 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 205 Asian unspecified, African American or Afro-Caribbean, Native American, Other admixed ancestry NR U.S. +GCST004797 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 205 Asian unspecified, African American or Afro-Caribbean, Native American, Other admixed ancestry NR U.S. +GCST004797 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 356 European NR U.S. +GCST004794 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 356 European NR U.S. +GCST004794 28763065 Xia K 2017-08-01 295 European, African American, Asian, Native American and other admixed ancestry infants, 17 European, African American, Asian, Native American and other admixed ancestry sibling pairs, 116 European, African American, Asian, Native American and other admixed ancestry twin pairs. NA initial 205 Asian unspecified, African American or Afro-Caribbean, Native American, Other admixed ancestry NR U.S. +GCST005522 23459209 Faraco J 2013-01-01 1,886 European ancestry cases, 10,421 European ancestry controls NA initial 12307 European NR Canada, U.S., Australia, Austria, France, Germany, Netherlands, Switzerland, Argentina, Israel, Turkey, Czech Republic, Poland, Slovakia, Denmark, Finland, Norway, U.K., Italy, Portugal, Spain +GCST004692 27455348 van Rheenen W 2016-07-25 12,577 European ancestry cases, 23,475 European ancestry controls 2,579 European ancestry cases, 2,767 European ancestry controls initial 36052 European NR U.S., Belgium, France, Germany, Netherlands, Switzerland, Finland, Republic of Ireland, Sweden, U.K., Italy, Portugal, Spain +GCST004692 27455348 van Rheenen W 2016-07-25 12,577 European ancestry cases, 23,475 European ancestry controls 2,579 European ancestry cases, 2,767 European ancestry controls replication 5346 European NR Australia, Belgium, France, Germany, Netherlands, Turkey, Republic of Ireland, Italy +GCST005134 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals replication 64 Greater Middle Eastern (Middle Eastern, North African or Persian) NR France +GCST005134 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals replication 431 European NR France +GCST005134 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals initial 448 European NR France +GCST005134 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals initial 47 Greater Middle Eastern (Middle Eastern, North African or Persian) NR France +GCST005135 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals initial 448 European NR France +GCST005135 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals initial 47 Greater Middle Eastern (Middle Eastern, North African or Persian) NR France +GCST005135 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals replication 431 European NR France +GCST005135 28800628 Salem JE 2017-08-11 448 European ancestry individuals, 47 North African ancestry individuals 431 European ancestry individuals, 64 North African ancestry individuals replication 64 Greater Middle Eastern (Middle Eastern, North African or Persian) NR France diff --git a/tests/gentropy/data_samples/gwas_catalog_ancestries_sample_v1.0.3-r2022-11-29.tsv b/tests/gentropy/data_samples/gwas_catalog_ancestries_sample_v1.0.3-r2022-11-29.tsv deleted file mode 100644 index 92d87d92b..000000000 --- a/tests/gentropy/data_samples/gwas_catalog_ancestries_sample_v1.0.3-r2022-11-29.tsv +++ /dev/null @@ -1,20 +0,0 @@ -STUDY ACCESSION PUBMED ID FIRST AUTHOR DATE INITIAL SAMPLE DESCRIPTION REPLICATION SAMPLE DESCRIPTION STAGE NUMBER OF INDIVIDUALS BROAD ANCESTRAL CATEGORY COUNTRY OF ORIGIN COUNTRY OF RECRUITMENT ADDITIONAL ANCESTRY DESCRIPTION ANCESTRY DESCRIPTOR FOUNDER/GENETICALLY ISOLATED POPULATION NUMBER OF CASES NUMBER OF CONTROLS SAMPLE DESCRIPTION COHORT(S) COHORT-SPECIFIC REFERENCE -GCST008644 26546613 Gutierrez-Achury J 2016-01-01 371 South Asian ancestry celiac disease cases, 3,138 European ancestry celiac disease cases, 4,418 European ancestry rheumatoid arthritis cases, 509 South Asian ancestry celiac disease controls, 2,473 European ancestry celiac disease controls, 3,300 European ancestry rheumatoid arthritis controls, 8,872 celiac disease cases, 9,401 rheumatoid arthritis cases, 4,845 celiac disease controls, 9,627 rheumatoid arthritis controls NA initial 32475 NR NR U.S., Netherlands, U.K. -GCST008644 26546613 Gutierrez-Achury J 2016-01-01 371 South Asian ancestry celiac disease cases, 3,138 European ancestry celiac disease cases, 4,418 European ancestry rheumatoid arthritis cases, 509 South Asian ancestry celiac disease controls, 2,473 European ancestry celiac disease controls, 3,300 European ancestry rheumatoid arthritis controls, 8,872 celiac disease cases, 9,401 rheumatoid arthritis cases, 4,845 celiac disease controls, 9,627 rheumatoid arthritis controls NA initial 13329 European NR Sweden, Poland, Italy, Spain -GCST008644 26546613 Gutierrez-Achury J 2016-01-01 371 South Asian ancestry celiac disease cases, 3,138 European ancestry celiac disease cases, 4,418 European ancestry rheumatoid arthritis cases, 509 South Asian ancestry celiac disease controls, 2,473 European ancestry celiac disease controls, 3,300 European ancestry rheumatoid arthritis controls, 8,872 celiac disease cases, 9,401 rheumatoid arthritis cases, 4,845 celiac disease controls, 9,627 rheumatoid arthritis controls NA initial 880 South Asian NR India -GCST004026 27911795 Schumann G 2016-11-28 up to 70,460 European ancestry drinker individuals up to 35,438 European ancestry drinker individuals replication 35438 European NR Finland, Sweden, Italy, Netherlands, U.K., Austria, France, Republic of Ireland -GCST004026 27911795 Schumann G 2016-11-28 up to 70,460 European ancestry drinker individuals up to 35,438 European ancestry drinker individuals initial 70460 European NR Finland, U.S., Australia, Iceland, Netherlands, Germany, U.K., Switzerland, Estonia, NR -GCST004027 27911795 Schumann G 2016-11-28 up to 74,711 European ancestry heavy and light/non-drinker individuals up to 31,021 European ancestry heavy and light/non-drinker individuals initial 74711 European NR Finland, U.S., Australia, Iceland, Netherlands, Germany, U.K., Switzerland, Estonia, NR, France -GCST004027 27911795 Schumann G 2016-11-28 up to 74,711 European ancestry heavy and light/non-drinker individuals up to 31,021 European ancestry heavy and light/non-drinker individuals replication 31021 European NR Finland, U.S., Italy, Netherlands, U.K., Austria, Republic of Ireland -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 23 South Asian NR U.S. -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 329 Hispanic or Latin American NR U.S. -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 21 African American or Afro-Caribbean NR U.S. -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 273 European NR U.S. -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 22 Other NR U.S. -GCST004281 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 122 Asian unspecified NR U.S. -GCST004284 28235828 Traglia M 2017-04-03 764 fetuses NA initial 764 European, South Asian, Asian unspecified, African American or Afro-Caribbean, Hispanic or Latin American, Other NR U.S. -GCST004285 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 329 Hispanic or Latin American NR U.S. -GCST004285 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 273 European NR U.S. -GCST004285 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 23 South Asian NR U.S. -GCST004285 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 21 African American or Afro-Caribbean NR U.S. -GCST004285 28235828 Traglia M 2017-04-03 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA initial 22 Other NR U.S. diff --git a/tests/gentropy/data_samples/gwas_catalog_associations_sample_e107_r2022-11-29.tsv b/tests/gentropy/data_samples/gwas_catalog_associations.tsv similarity index 100% rename from tests/gentropy/data_samples/gwas_catalog_associations_sample_e107_r2022-11-29.tsv rename to tests/gentropy/data_samples/gwas_catalog_associations.tsv diff --git a/tests/gentropy/data_samples/gwas_catalog_studies.tsv b/tests/gentropy/data_samples/gwas_catalog_studies.tsv new file mode 100644 index 000000000..aca9ed666 --- /dev/null +++ b/tests/gentropy/data_samples/gwas_catalog_studies.tsv @@ -0,0 +1,20 @@ +DATE ADDED TO CATALOG PUBMED ID FIRST AUTHOR DATE JOURNAL LINK STUDY DISEASE/TRAIT INITIAL SAMPLE SIZE REPLICATION SAMPLE SIZE PLATFORM [SNPS PASSING QC] ASSOCIATION COUNT MAPPED_TRAIT MAPPED_TRAIT_URI STUDY ACCESSION GENOTYPING TECHNOLOGY SUBMISSION DATE STATISTICAL MODEL BACKGROUND TRAIT MAPPED BACKGROUND TRAIT MAPPED BACKGROUND TRAIT URI COHORT FULL SUMMARY STATISTICS SUMMARY STATS LOCATION +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints 12,863 European ancestry male cases, 19,521 European ancestry female cases, 40,776 European ancestry male controls, 39,846 European ancestry female controls 1,983 Icelandic ancestry male cases, 1,791 Icelandic ancestry female cases, 2,064 Icelandic ancestry male controls, 1,727 Icelandic ancestry female controls Affymetrix [at least 12428592] (imputed) 2 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST004695 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST004001-GCST005000/GCST004695 +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Sleep duration 112,411 European ancestry male individuals NA Affymetrix [at least 12428592] (imputed) 3 sleep duration http://www.ebi.ac.uk/efo/EFO_0005271 GCST004694 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints (sex interaction) 12,863 European ancestry male cases, 19,521 European ancestry female cases, 40,776 European ancestry male controls, 39,846 European ancestry female controls NA Affymetrix [at least 12428592] (imputed) 0 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST004700 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints (continuous) 12,863 European ancestry male cases, 19,521 European ancestry female cases, 40,776 European ancestry male controls, 39,846 European ancestry female controls NA Affymetrix [at least 12428592] (imputed) 1 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST004701 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints (dichotomous) 32,384 European ancestry cases, 27,128 European ancestry controls NA Affymetrix [at least 12428592] (imputed) 1 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST004702 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Chronotype 101,185 European ancestry individuals NA Affymetrix [at least 12428592] (imputed) 9 circadian rhythm http://www.ebi.ac.uk/efo/EFO_0004354 GCST004696 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Ease of getting up in the morning 112,866 European ancestry individuals NA Affymetrix [at least 12428592] (imputed) 5 chronotype measurement http://www.ebi.ac.uk/efo/EFO_0008328 GCST004697 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Daytime nap 113,054 European ancestry cases and controls NA Affymetrix [at least 12428592] (imputed) 4 daytime rest measurement http://www.ebi.ac.uk/efo/EFO_0007828 GCST004693 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Snoring 105,377 European ancestry cases and controls NA Affymetrix [at least 12428592] (imputed) 1 snoring measurement http://www.ebi.ac.uk/efo/EFO_0008341 GCST004698 Genome-wide genotyping array no NA +2017-09-11 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Daytime sleepiness 112,717 European ancestry cases and controls NA Affymetrix [at least 12428592] (imputed) 6 excessive daytime sleepiness measurement http://www.ebi.ac.uk/efo/EFO_0007875 GCST004699 Genome-wide genotyping array no NA +2018-11-02 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints 19,521 European ancestry female cases, 39,846 European ancestry female controls 1,983 Icelandic ancestry male cases, 1,791 Icelandic ancestry female cases, 2,064 Icelandic ancestry male controls, 1,727 Icelandic ancestry female controls Affymetrix [at least 12428592] (imputed) 1 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST006487 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST006001-GCST007000/GCST006487 +2018-11-02 28604731 Hammerschlag AR 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604731 Genome-wide association analysis of insomnia complaints identifies risk genes and genetic overlap with psychiatric and metabolic traits. Insomnia complaints 12,863 European ancestry male cases, 40,776 European ancestry male controls 1,983 Icelandic ancestry male cases, 1,791 Icelandic ancestry female cases, 2,064 Icelandic ancestry male controls, 1,727 Icelandic ancestry female controls Affymetrix [at least 12428592] (imputed) 2 insomnia http://www.ebi.ac.uk/efo/EFO_0004698 GCST006488 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST006001-GCST007000/GCST006488 +2017-09-14 28610988 Kerr KF 2017-06-10 Heart Rhythm www.ncbi.nlm.nih.gov/pubmed/28610988 Genome-wide association study of heart rate and its variability in Hispanic/Latino cohorts. Heart rate 13,184 Hispanic/Latino individuals 7,073 European ancestry individuals, 4,771 African American individuals Affymetrix, Illumina [16967914] (imputed) 2 heart rate http://www.ebi.ac.uk/efo/EFO_0004326 GCST004715 Genome-wide genotyping array no NA +2017-09-14 28610988 Kerr KF 2017-06-10 Heart Rhythm www.ncbi.nlm.nih.gov/pubmed/28610988 Genome-wide association study of heart rate and its variability in Hispanic/Latino cohorts. Heart rate variability traits (RMSSD) 13,767 Hispanic/Latino individuals 4,730 European ancestry individuals, 2,908 African American individuals Affymetrix, Illumina [17209892] (imputed) 2 heart rate variability measurement http://www.ebi.ac.uk/efo/EFO_0008003 GCST004716 Genome-wide genotyping array no NA +2017-09-14 28610988 Kerr KF 2017-06-10 Heart Rhythm www.ncbi.nlm.nih.gov/pubmed/28610988 Genome-wide association study of heart rate and its variability in Hispanic/Latino cohorts. Heart rate variability traits (SDNN) 13,184 Hispanic/Latino individuals 7,073 European ancestry individuals, 2,908 African American individuals Affymetrix, Illumina [17209740] (imputed) 3 heart rate variability measurement http://www.ebi.ac.uk/efo/EFO_0008003 GCST004714 Genome-wide genotyping array no NA +2017-09-18 28604730 McKay JD 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604730 Large-scale association analysis identifies new lung cancer susceptibility loci and heterogeneity in genetic susceptibility across histological subtypes. Lung cancer 29,266 European ancestry cases, 56,450 European ancestry controls NA Illumina [10439017] (imputed) 135 lung carcinoma http://www.ebi.ac.uk/efo/EFO_0001071 GCST004748 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST004001-GCST005000/GCST004748 +2017-09-18 28604730 McKay JD 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604730 Large-scale association analysis identifies new lung cancer susceptibility loci and heterogeneity in genetic susceptibility across histological subtypes. Lung adenocarcinoma 11,273 European ancestry cases, 55,483 European ancestry controls NA Illumina [10439017] (imputed) 79 lung adenocarcinoma http://www.ebi.ac.uk/efo/EFO_0000571 GCST004744 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST004001-GCST005000/GCST004744 +2017-09-18 28604730 McKay JD 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604730 Large-scale association analysis identifies new lung cancer susceptibility loci and heterogeneity in genetic susceptibility across histological subtypes. Squamous cell lung carcinoma 7,426 European ancestry cases, 55,627 European ancestry controls NA Illumina [10439017] (imputed) 101 squamous cell lung carcinoma http://www.ebi.ac.uk/efo/EFO_0000708 GCST004750 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST004001-GCST005000/GCST004750 +2017-09-18 28604730 McKay JD 2017-06-12 Nat Genet www.ncbi.nlm.nih.gov/pubmed/28604730 Large-scale association analysis identifies new lung cancer susceptibility loci and heterogeneity in genetic susceptibility across histological subtypes. Small cell lung carcinoma 2,664 European ancestry cases, 21,444 European ancestry controls NA Illumina [10439017] (imputed) 50 small cell lung carcinoma http://www.ebi.ac.uk/efo/EFO_0000702 GCST004746 Genome-wide genotyping array yes http://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/GCST004001-GCST005000/GCST004746 diff --git a/tests/gentropy/data_samples/gwas_catalog_studies_sample-r2022-11-29.tsv b/tests/gentropy/data_samples/gwas_catalog_studies_sample-r2022-11-29.tsv deleted file mode 100644 index 7db8f5302..000000000 --- a/tests/gentropy/data_samples/gwas_catalog_studies_sample-r2022-11-29.tsv +++ /dev/null @@ -1,20 +0,0 @@ -DATE ADDED TO CATALOG PUBMED ID FIRST AUTHOR DATE JOURNAL LINK STUDY DISEASE/TRAIT INITIAL SAMPLE SIZE REPLICATION SAMPLE SIZE PLATFORM [SNPS PASSING QC] ASSOCIATION COUNT MAPPED_TRAIT MAPPED_TRAIT_URI STUDY ACCESSION GENOTYPING TECHNOLOGY SUMMARY STATS LOCATION SUBMISSION DATE STATISTICAL MODEL BACKGROUND TRAIT MAPPED BACKGROUND TRAIT MAPPED BACKGROUND TRAIT URI -2019-09-11 26546613 Gutierrez-Achury J 2016-01-01 Hum Mol Genet www.ncbi.nlm.nih.gov/pubmed/26546613 Functional implications of disease-specific variants in loci jointly associated with coeliac disease and rheumatoid arthritis. Celiac disease and Rheumatoid arthritis 371 South Asian ancestry celiac disease cases, 3,138 European ancestry celiac disease cases, 4,418 European ancestry rheumatoid arthritis cases, 509 South Asian ancestry celiac disease controls, 2,473 European ancestry celiac disease controls, 3,300 European ancestry rheumatoid arthritis controls, 8,872 celiac disease cases, 9,401 rheumatoid arthritis cases, 4,845 celiac disease controls, 9,627 rheumatoid arthritis controls NA Illumina [109572] 24 rheumatoid arthritis, celiac disease http://www.ebi.ac.uk/efo/EFO_0000685, http://www.ebi.ac.uk/efo/EFO_0001060 GCST008644 Targeted genotyping array [Immunochip] -2017-05-12 27911795 Schumann G 2016-11-28 Proc Natl Acad Sci U S A www.ncbi.nlm.nih.gov/pubmed/27911795 KLB is associated with alcohol drinking, and its gene product Ξ²-Klotho is necessary for FGF21 regulation of alcohol preference. Alcohol consumption up to 70,460 European ancestry drinker individuals up to 35,438 European ancestry drinker individuals Affymetrix, Illumina, Perlegen [at least 316407] (imputed) 3 alcohol consumption measurement http://www.ebi.ac.uk/efo/EFO_0007878 GCST004026 Genome-wide genotyping array -2017-05-12 27911795 Schumann G 2016-11-28 Proc Natl Acad Sci U S A www.ncbi.nlm.nih.gov/pubmed/27911795 KLB is associated with alcohol drinking, and its gene product Ξ²-Klotho is necessary for FGF21 regulation of alcohol preference. Alcohol consumption (heavy vs. light/non-drinkers) up to 74,711 European ancestry heavy and light/non-drinker individuals up to 31,021 European ancestry heavy and light/non-drinker individuals Affymetrix, Illumina, Perlegen [at least 316407] (imputed) 2 alcohol consumption measurement http://www.ebi.ac.uk/efo/EFO_0007878 GCST004027 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of organochlorine pesticides 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA Affymetrix [629686] 2 gestational serum measurement, organochlorine pesticide measurement http://www.ebi.ac.uk/efo/EFO_0007964, http://www.ebi.ac.uk/efo/EFO_0007960 GCST004281 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of PCBs (fetal genetic effect) 764 fetuses NA Affymetrix [622716] 11 polychlorinated biphenyls measurement, gestational serum measurement, fetal genotype effect measurement http://www.ebi.ac.uk/efo/EFO_0007042, http://www.ebi.ac.uk/efo/EFO_0007964, http://www.ebi.ac.uk/efo/EFO_0007959 GCST004284 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of PBDEs 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA Affymetrix [629686] 9 polybrominated biphenyl measurement, gestational serum measurement, polybrominated diphenyl ether measurement http://www.ebi.ac.uk/efo/EFO_0007961, http://www.ebi.ac.uk/efo/EFO_0007964, http://www.ebi.ac.uk/efo/EFO_0007962 GCST004285 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of PBDEs (fetal genetic effect) 764 fetuses NA Affymetrix [629686] 11 polybrominated biphenyl measurement, gestational serum measurement, fetal genotype effect measurement, polybrominated diphenyl ether measurement http://www.ebi.ac.uk/efo/EFO_0007961, http://www.ebi.ac.uk/efo/EFO_0007964, http://www.ebi.ac.uk/efo/EFO_0007959, http://www.ebi.ac.uk/efo/EFO_0007962 GCST004286 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of organochlorine pesticides (fetal genetic effect) 764 fetuses NA Affymetrix [629686] 0 gestational serum measurement, fetal genotype effect measurement, organochlorine pesticide measurement http://www.ebi.ac.uk/efo/EFO_0007964, http://www.ebi.ac.uk/efo/EFO_0007959, http://www.ebi.ac.uk/efo/EFO_0007960 GCST004282 Genome-wide genotyping array -2017-07-03 28235828 Traglia M 2017-04-03 G3 (Bethesda) www.ncbi.nlm.nih.gov/pubmed/28235828 Independent Maternal and Fetal Genetic Effects on Midgestational Circulating Levels of Environmental Pollutants. Midgestational circulating levels of PCBs 329 Hispanic mothers, 273 European ancestry mothers, 122 Asian ancestry mothers, 23 South Asian ancestry mothers, 21 African American mothers, 22 other ancestry mothers NA Affymetrix [629686] 25 polychlorinated biphenyls measurement, gestational serum measurement http://www.ebi.ac.uk/efo/EFO_0007042, http://www.ebi.ac.uk/efo/EFO_0007964 GCST004283 Genome-wide genotyping array -2016-09-12 26325155 Brehm JM 2015-09-01 Am J Respir Crit Care Med www.ncbi.nlm.nih.gov/pubmed/26325155 A Genome-Wide Association Study of Post-bronchodilator Lung Function in Children with Asthma. Post-bronchodilator lung function in asthma (FEV1) 447 Puerto Rican ancestry cases 568 European, black or Hispanic cases, 2,414 Hispanic cases Illumina [NR] 0 pulmonary function measurement, forced expiratory volume, response to bronchodilator http://www.ebi.ac.uk/efo/EFO_0003892, http://www.ebi.ac.uk/efo/EFO_0004314, http://purl.obolibrary.org/obo/GO_0097366 GCST003110 Genome-wide genotyping array asthma http://purl.obolibrary.org/obo/MONDO_0004979 -2016-09-12 26325155 Brehm JM 2015-09-01 Am J Respir Crit Care Med www.ncbi.nlm.nih.gov/pubmed/26325155 A Genome-Wide Association Study of Post-bronchodilator Lung Function in Children with Asthma. Post-bronchodilator lung function in asthma (FEV1/FVC) 447 Puerto Rican ancestry cases 568 European, black or Hispanic cases, 2,414 Hispanic cases Illumina [NR] 0 pulmonary function measurement, response to bronchodilator, FEV/FEC ratio http://www.ebi.ac.uk/efo/EFO_0003892, http://purl.obolibrary.org/obo/GO_0097366, http://www.ebi.ac.uk/efo/EFO_0004713 GCST003107 Genome-wide genotyping array asthma http://purl.obolibrary.org/obo/MONDO_0004979 -2016-07-27 26237429 Aminkeng F 2015-08-03 Nat Genet www.ncbi.nlm.nih.gov/pubmed/26237429 A coding variant in RARG confers susceptibility to anthracycline-induced cardiotoxicity in childhood cancer. Anthracycline-induced cardiotoxicity in childhood cancer 32 European ancestry cases with cardiotoxicity, 248 European ancestry cases without cardiotoxicity 22 European ancestry cases with cardiotoxicity, 74 European ancestry cases without cardiotoxicity, 2 African cases with cardiotoxicity, 9 African cases without cardiotoxicity, 5 Hispanic cases with cardiotoxicity, 18 Hispanic cases without cardiotoxicity, 8 East Asian cases with cardiotoxicity, 23 East Asian cases without cardiotoxicity, 4 Aboriginal Canadian cases with cardiotoxicity, 11 Aboriginal Canadian cases without cardiotoxicity Illumina [657694] 2 cardiotoxicity, response to anthracycline-based chemotherapy http://www.ebi.ac.uk/efo/EFO_1001482, http://www.ebi.ac.uk/efo/EFO_0005257 GCST003062 Genome-wide genotyping array childhood cancer http://www.ebi.ac.uk/efo/EFO_1000654 -2017-02-25 27387956 Murk W 2016-07-07 BMC Genet www.ncbi.nlm.nih.gov/pubmed/27387956 Genome-wide search identifies a gene-gene interaction between 20p13 and 2q14 in asthma. Asthma (SNP x SNP interaction) 802 European ancestry cases, 823 European ancestry controls 754 European ancestry cases, 57 European and unknown ancestry cases, 2,573 cases, 880 European ancestry controls, 68 European and unknown ancestry controls, 2,145 controls Illumina [301547] 0 asthma http://purl.obolibrary.org/obo/MONDO_0004979 GCST003682 Genome-wide genotyping array -2016-12-09 27008869 Chen MM 2016-03-23 Hum Mol Genet www.ncbi.nlm.nih.gov/pubmed/27008869 GWAS meta-analysis of 16 852 women identifies new susceptibility locus for endometrial cancer. Endometrial cancer 4,907 European ancestry cases, 11,945 European ancestry controls NA Illumina [9486271] (imputed) 4 endometrial carcinoma http://www.ebi.ac.uk/efo/EFO_1001512 GCST003436 Genome-wide genotyping array -2016-12-01 27016271 Kornilov SA 2016-03-25 Pediatrics www.ncbi.nlm.nih.gov/pubmed/27016271 Genome-Wide Association and Exome Sequencing Study of Language Disorder in an Isolated Population. Developmental language disorder 149 isolated population cases, 210 isolated population controls NA Illumina [223580] 4 specific language impairment http://www.ebi.ac.uk/efo/EFO_1001510 GCST003396 Genome-wide genotyping array -2016-12-01 27016271 Kornilov SA 2016-03-25 Pediatrics www.ncbi.nlm.nih.gov/pubmed/27016271 Genome-Wide Association and Exome Sequencing Study of Language Disorder in an Isolated Population. Developmental language disorder (linguistic errors) 149 isolated population cases, 210 isolated population controls NA Illumina [223580] 9 linguistic error measurement, specific language impairment http://www.ebi.ac.uk/efo/EFO_0007798, http://www.ebi.ac.uk/efo/EFO_1001510 GCST003397 Genome-wide genotyping array -2016-12-01 27016271 Kornilov SA 2016-03-25 Pediatrics www.ncbi.nlm.nih.gov/pubmed/27016271 Genome-Wide Association and Exome Sequencing Study of Language Disorder in an Isolated Population. Developmental language disorder (syntactic complexity) 149 isolated population cases, 210 isolated population controls NA Illumina [223580] 3 syntactic complexity measurement, specific language impairment http://www.ebi.ac.uk/efo/EFO_0007799, http://www.ebi.ac.uk/efo/EFO_1001510 GCST003398 Genome-wide genotyping array -2016-12-13 27005419 Borne Y 2016-03-22 Hum Mol Genet www.ncbi.nlm.nih.gov/pubmed/27005419 Genome wide association study identifies two loci associated with cadmium in erythrocytes among never-smokers. Erythrocyte cadmium concentration 2,704 ever-smoker individuals, 1,728 never-smoker individuals NA Illumina [658884] 5 erythrocyte cadmium measurement http://www.ebi.ac.uk/efo/EFO_0007807 GCST003449 Genome-wide genotyping array -2016-12-13 27005419 Borne Y 2016-03-22 Hum Mol Genet www.ncbi.nlm.nih.gov/pubmed/27005419 Genome wide association study identifies two loci associated with cadmium in erythrocytes among never-smokers. Erythrocyte cadmium concentration in never smokers 1,728 individuals NA Illumina [658884] 7 erythrocyte cadmium measurement http://www.ebi.ac.uk/efo/EFO_0007807 GCST003448 Genome-wide genotyping array diff --git a/tests/gentropy/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz b/tests/gentropy/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz deleted file mode 100644 index 74c0844a4..000000000 Binary files a/tests/gentropy/data_samples/imported/GTEx_V8/ge/Adipose_Subcutaneous.tsv.gz and /dev/null differ diff --git a/tests/gentropy/data_samples/sample_eqtl_catalogue_studies.tsv b/tests/gentropy/data_samples/sample_eqtl_catalogue_studies.tsv new file mode 100644 index 000000000..08a06803b --- /dev/null +++ b/tests/gentropy/data_samples/sample_eqtl_catalogue_studies.tsv @@ -0,0 +1,2 @@ +study_id dataset_id study_label sample_group tissue_id tissue_label condition_label sample_size quant_method +QTS000035 QTD000584 Sun_2018 plasma UBERON_0001969 plasma naive 3301 aptamer diff --git a/tests/gentropy/data_samples/uberon_sample.json b/tests/gentropy/data_samples/uberon_sample.json new file mode 100644 index 000000000..7dedfa23c --- /dev/null +++ b/tests/gentropy/data_samples/uberon_sample.json @@ -0,0 +1,889 @@ +{ + "graphs": [ + { + "id": "http://purl.obolibrary.org/obo/uberon.json", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/IAO_0000700", + "val": "http://purl.obolibrary.org/obo/UBERON_0000104" + }, + { + "pred": "http://purl.obolibrary.org/obo/IAO_0000700", + "val": "http://purl.obolibrary.org/obo/UBERON_0001062" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0001-5839-6798" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0001-7972-3866" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0001-9114-8737" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0002-1810-9886" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0002-6601-2165" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0002-7356-1779" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0002-9611-1279" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0003-3162-7490" + }, + { + "pred": "http://purl.org/dc/elements/1.1/creator", + "val": "https://orcid.org/0000-0003-3308-6245" + }, + { + "pred": "http://purl.org/dc/elements/1.1/description", + "val": "Uberon is an integrated cross-species anatomy ontology representing a variety of entities classified according to traditional anatomical criteria such as structure, function and developmental lineage. The ontology includes comprehensive relationships to taxon-specific anatomical ontologies, allowing integration of functional, phenotype and expression data." + }, + { + "pred": "http://purl.org/dc/elements/1.1/publisher", + "val": "http://uberon.org" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://dbpedia.org" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://palaeos.com" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://www.brain-map.org" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://braininfo.rprc.washington.edu/" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://en.wikipedia.org/wiki/" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://pons.incf.org/wiki/Common_Upper_Mammalian_Brain_Ontology_%28Cumbo%29" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/aao.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/aba.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/aeo.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/bila.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/bto.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/caro.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/cl.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/ehdaa2.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/emapa.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/fbbt.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/fma.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/go.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/hp.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/ma.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/mp.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/tao.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/vhog.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/vsao.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/wbbt.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/xao.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://purl.obolibrary.org/obo/zfa.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://uri.neuinfo.org/nif/nifstd" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://www.e-lico.eu/public/kupo/kupo.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://www.ebi.ac.uk/efo/efo.owl" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0030229073 Invertebrate Zoology, Barnes" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0073040584 Vertebrates, Kardong" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0123813611 Comparative Anatomy and Histology: A Mouse and Human Atlas, Treuting and Dintzis" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0226313379 Fins into Limbs: Evolution, Development, and Transformation, Hall" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0443065837 Human embryology, Larsen" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0471888893 Comparative Vertebrate Neuroanatomy: Evolution and Adaptation by Butler and Hodos" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:0683400088 Stedman's Medical Dictionary" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:1588900649 Color Atlas and Textbook of Human Anatomy: Nervous system and sensory organs By Werner Kahle, Michael Frotscher" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:1588903958 Principles and practice of pediatric neurosurgery By A. Leland Albright, P. David Adelson, Ian F. Pollack" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:1607950324 Craniofacial Embryogenetics & Development, 2nd edition, Sperber" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:978-0-12-369548-2 Principles of Developmental Genetics, Sally A Moody" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:9780120749034 The laboratory rat" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:9780397517251 Surgical anatomy of the hand and upper extremity. By James R. Doyle and Michael J. Botte" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:9780674021839 The Tree of Life - Guillaume Lecointre, Herve Le Guyader" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "ISBN:9780878932504 Developmental Biology" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "MESH" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "PMID:11433360 Placental development: lessons from mouse mutants" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "PMID:16417468 Forgotten and novel aspects in pancreas development, Pieler and Chen" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "aggregates AAO from 13:04:2012" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "aggregates TAO from 09:08:2012" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "aggregates VSAO from 16:07:2012" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://wiki.phenotypercn.org/wg/phenotypercn/index.php?title=Neural_Crest_Workshop" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "http://wiki.phenotypercn.org/wiki/August_2012_Notes" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "https://docs.google.com/document/d/16JZOuH9sh_a8uIXA4cqg0Q1H6MV5yCj3-rhuKsZoV_U/edit" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "https://docs.google.com/document/d/1MnUgispgGfNQoezYzWzzGTnkAnI0gzRnJIwdip6MMtw/edit" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "https://docs.google.com/document/d/1cPWBqrl_Qy7XHEWFqtR_PgQX61yRkgGuLaiDpnEXxkE/edit" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "https://docs.google.com/document/d/1r9kNPpFYGdu0SpJDLyFAVQczBlG0wAZCBMd18gG3Ot8/edit#" + }, + { + "pred": "http://purl.org/dc/elements/1.1/source", + "val": "https://docs.google.com/spreadsheet/ccc?key=0Aj8NJdyb-leqdDM0R3hTVTRHRExDVjRCSkZEbDc5N1E#gid=0" + }, + { + "pred": "http://purl.org/dc/elements/1.1/title", + "val": "Uber-anatomy ontology" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://github.com/orgs/pato-ontology/teams/pato-community" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-5889-4463" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-7433-0086" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-7476-6306" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-7920-5321" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-7958-3701" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-8682-8754" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-9107-0714" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0001-9990-8331" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-0819-0473" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-0956-8634" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-1112-5832" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-1572-1316" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-1604-3078" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-1615-2899" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-2061-091X" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-2244-7917" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-3437-3329" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-3467-2636" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-3734-1859" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-5111-7263" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-6490-7723" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-7073-9172" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-8406-3871" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-8455-3213" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-8688-6599" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-9415-5104" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-9818-3030" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0002-9900-7880" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-1980-3228" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-2105-2283" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-2338-2550" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-3691-0324" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://orcid.org/0000-0003-4423-4370" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q11695472" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q23809253" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q4964264" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q54985720" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q6983890" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q7650732" + }, + { + "pred": "http://purl.org/dc/terms/contributor", + "val": "https://www.wikidata.org/wiki/Q85793053" + }, + { + "pred": "http://purl.org/dc/terms/isReferencedBy", + "val": "http://genomebiology.com/2012/13/1/R5" + }, + { + "pred": "http://purl.org/dc/terms/isReferencedBy", + "val": "http://www.ncbi.nlm.nih.gov/pubmed/22293552" + }, + { + "pred": "http://purl.org/dc/terms/license", + "val": "http://creativecommons.org/licenses/by/3.0/" + }, + { + "pred": "http://usefulinc.com/ns/doap#GitRepository", + "val": "https://github.com/cmungall/uberon/" + }, + { + "pred": "http://usefulinc.com/ns/doap#SVNRepository", + "val": "https://obo.svn.sourceforge.net/svnroot/obo/uberon/" + }, + { + "pred": "http://usefulinc.com/ns/doap#bug-database", + "val": "https://github.com/obophenotype/uberon/issues/" + }, + { + "pred": "http://usefulinc.com/ns/doap#mailing-list", + "val": "https://lists.sourceforge.net/lists/listinfo/obo-anatomy" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#default-namespace", + "val": "uberon" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion", + "val": "1.2" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "AEO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "BILA" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "BSPO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "CARO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "GO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "OG" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-equivalent", + "val": "VSAO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-has-subclass", + "val": "EHDAA" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-has-subclass", + "val": "EV" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-has-subclass", + "val": "NCIT" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-has-subclass", + "val": "OGES" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-has-subclass", + "val": "SCTID" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-is_a", + "val": "BFO" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-is_a", + "val": "VHOG" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "AAO part_of NCBITaxon:8292" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "DHBA part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "EHDAA2 part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "EMAPA part_of NCBITaxon:10090" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "FBdv part_of NCBITaxon:7227" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "FMA part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "HAO part_of NCBITaxon:7399" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "HBA part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "HsapDv part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "KUPO part_of NCBITaxon:9606" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "MA part_of NCBITaxon:10090" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "MFO part_of NCBITaxon:8089" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "MmusDv part_of NCBITaxon:10090" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "OlatDv part_of NCBITaxon:8089" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "PBA part_of NCBITaxon:9443" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "SPD part_of NCBITaxon:6893" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "TADS part_of NCBITaxon:6939" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "TAO part_of NCBITaxon:32443" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "TGMA part_of NCBITaxon:44484" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "WBbt part_of NCBITaxon:6237" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "WBls part_of NCBITaxon:6237" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "XAO part_of NCBITaxon:8353" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "ZFA part_of NCBITaxon:7954" + }, + { + "pred": "http://www.geneontology.org/formats/oboInOwl#treat-xrefs-as-reverse-genus-differentia", + "val": "ZFS part_of NCBITaxon:7954" + }, + { + "pred": "http://www.w3.org/2000/01/rdf-schema#comment", + "val": "Aurelie Comte, Bill Bug, Catherine Leroy, Duncan Davidson and Trish Whetzel are also contributors. However their ORCIDs were not found." + }, + { + "pred": "http://www.w3.org/2002/07/owl#versionInfo", + "val": "2024-09-03" + }, + { + "pred": "http://xmlns.com/foaf/0.1/homepage", + "val": "http://uberon.org" + } + ], + "version": "http://purl.obolibrary.org/obo/uberon/releases/2024-09-03/uberon.json" + }, + "nodes": [ + { + "id": "http://purl.obolibrary.org/obo/CL_1001593", + "lbl": "parathyroid glandular cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "Glandular cell of parathyroid epithelium. Example: Parathyroid chief cell and parathyroid oxyphil cells.", + "xrefs": ["HPA:HPA", "NPX:PDR"] + }, + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "parathyroid gland glandular cell", + "xrefs": ["CALOHA:TS-1279"] + }, + { + "pred": "hasRelatedSynonym", + "val": "parathyroid gland glandular cells", + "xrefs": ["CALOHA:TS-1279"] + } + ], + "xrefs": [ + { + "val": "CALOHA:TS-1279" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_1001595", + "lbl": "rectum glandular cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "Glandular cell of rectal epithelium. Example: Goblet cell; enterocytes or absorptive cells; enteroendocrine and M cells.", + "xrefs": ["NPX:PDR"] + }, + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "rectal glandular cell", + "xrefs": ["CALOHA:TS-1281"] + }, + { + "pred": "hasRelatedSynonym", + "val": "rectum glandular cells", + "xrefs": ["CALOHA:TS-1281"] + } + ], + "xrefs": [ + { + "val": "CALOHA:TS-1281" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_1001596", + "lbl": "salivary gland glandular cell", + "type": "CLASS", + "meta": { + "definition": { + "val": "Glandular cell of salivary gland. Example: Serous cells, mucous cells, cuboidal epithelial cells of the intercalated ducts, simple cuboidal epithelium of the striated ducts, epithelial cells of excretory ducts.", + "xrefs": ["HPA:HPA", "NPX:PDR"] + }, + "synonyms": [ + { + "pred": "hasRelatedSynonym", + "val": "salivary gland glandular cells", + "xrefs": ["CALOHA:TS-1282"] + } + ], + "xrefs": [ + { + "val": "CALOHA:TS-1282" + } + ] + } + }, + { + "id": "http://purl.obolibrary.org/obo/CL_0000653", + "lbl": "podocyte", + "type": "CLASS", + "meta": { + "definition": { + "val": "A specialized kidney epithelial cell, contained within a glomerulus, that contains \"feet\" that interdigitate with the \"feet\" of other podocytes.", + "xrefs": ["GOC:tfm", "https://doi.org/10.1101/2021.10.10.463829"] + }, + "subsets": [ + "http://purl.obolibrary.org/obo/cl#cellxgene_subset", + "http://purl.obolibrary.org/obo/uberon/core#human_reference_atlas" + ], + "synonyms": [ + { + "pred": "hasBroadSynonym", + "val": "epithelial cell of visceral layer of glomerular capsule", + "xrefs": ["FMA:70967"] + }, + { + "pred": "hasExactSynonym", + "val": "glomerular podocyte", + "xrefs": ["FMA:70967"] + }, + { + "pred": "hasExactSynonym", + "val": "glomerular visceral epithelial cell" + }, + { + "pred": "hasExactSynonym", + "val": "kidney podocyte" + }, + { + "pred": "hasExactSynonym", + "val": "renal podocyte" + } + ], + "xrefs": [ + { + "val": "BTO:0002295" + }, + { + "val": "FMA:70967" + } + ], + "basicPropertyValues": [ + { + "pred": "http://purl.obolibrary.org/obo/RO_0002175", + "val": "http://purl.obolibrary.org/obo/NCBITaxon_9606" + }, + { + "pred": "http://www.w3.org/2000/01/rdf-schema#seeAlso", + "val": "https://github.com/obophenotype/cell-ontology/issues/1460" + } + ] + } + } + ], + "edges": [ + { + "sub": "http://purl.obolibrary.org/obo/CL_1001596", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000150" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_1001596", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000152" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_1001596", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0002251" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_1001596", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0001044" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_1001596", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0004809" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000622", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://www.geneontology.org/formats/oboInOwl#is_inferred", + "val": "true" + } + ] + } + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_1001596" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0001044" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_0000622", + "meta": { + "basicPropertyValues": [ + { + "pred": "http://www.geneontology.org/formats/oboInOwl#is_inferred", + "val": "true" + } + ] + } + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_1001596" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0002623", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0001044" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000653", + "pred": "is_a", + "obj": "http://purl.obolibrary.org/obo/CL_1000450" + }, + { + "sub": "http://purl.obolibrary.org/obo/CL_0000653", + "pred": "http://purl.obolibrary.org/obo/BFO_0000050", + "obj": "http://purl.obolibrary.org/obo/UBERON_0005751" + } + ] + } + ] +} diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets-extended/._SUCCESS.crc b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/._SUCCESS.crc new file mode 100644 index 000000000..3b7b04493 Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/._SUCCESS.crc differ diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets-extended/.part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet.crc b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/.part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet.crc new file mode 100644 index 000000000..751da3705 Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/.part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet.crc differ diff --git a/src/airflow/config/.gitkeep b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/_SUCCESS similarity index 100% rename from src/airflow/config/.gitkeep rename to tests/gentropy/data_samples/variant_sources/credible-sets-extended/_SUCCESS diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets-extended/part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet new file mode 100644 index 000000000..634dbbaac Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets-extended/part-00000-aed9d229-0baa-4437-b24d-7ed798f8860f-c000.snappy.parquet differ diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets/._SUCCESS.crc b/tests/gentropy/data_samples/variant_sources/credible-sets/._SUCCESS.crc new file mode 100644 index 000000000..3b7b04493 Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets/._SUCCESS.crc differ diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets/.part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet.crc b/tests/gentropy/data_samples/variant_sources/credible-sets/.part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet.crc new file mode 100644 index 000000000..881413c15 Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets/.part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet.crc differ diff --git a/src/airflow/dags/.gitkeep b/tests/gentropy/data_samples/variant_sources/credible-sets/_SUCCESS similarity index 100% rename from src/airflow/dags/.gitkeep rename to tests/gentropy/data_samples/variant_sources/credible-sets/_SUCCESS diff --git a/tests/gentropy/data_samples/variant_sources/credible-sets/part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet b/tests/gentropy/data_samples/variant_sources/credible-sets/part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet new file mode 100644 index 000000000..968c7b686 Binary files /dev/null and b/tests/gentropy/data_samples/variant_sources/credible-sets/part-00000-a9a641da-3820-4bf4-911e-4d61475173d0-c000.snappy.parquet differ diff --git a/tests/gentropy/data_samples/variant_sources/eva-test.jsonl b/tests/gentropy/data_samples/variant_sources/eva-test.jsonl new file mode 100644 index 000000000..e83f7dcd7 --- /dev/null +++ b/tests/gentropy/data_samples/variant_sources/eva-test.jsonl @@ -0,0 +1,50 @@ +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV001281540","releaseDate":"2021-01-17","targetFromSourceId":"ENSG00000061455","variantFunctionalConsequenceId":"SO_0001583","variantId":"5_123159516_C_T","variantRsId":"rs1333586171","cohortPhenotypes":["Heart, malformation of"],"diseaseFromSource":"Heart, malformation of","diseaseFromSourceId":"CN130023","diseaseFromSourceMappedId":"HP_0001627","variantHgvsId":"NC_000005.10:g.123159516C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002030146","releaseDate":"2022-03-28","targetFromSourceId":"ENSG00000160200","variantFunctionalConsequenceId":"SO_0001583","variantId":"21_43063980_T_C","variantRsId":"rs777884368","cohortPhenotypes":["HYPERHOMOCYSTEINEMIA, THROMBOTIC, CBS-RELATED"],"diseaseFromSource":"HYPERHOMOCYSTEINEMIA, THROMBOTIC, CBS-RELATED","diseaseFromSourceId":"C3150344","diseaseFromSourceMappedId":"Orphanet_394","variantHgvsId":"NC_000021.9:g.43063980T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["pathogenic"],"confidence":"no assertion criteria provided","studyId":"RCV000412534","releaseDate":"2017-01-09","targetFromSourceId":"ENSG00000139324","variantFunctionalConsequenceId":"SO_0001587","variantId":"12_88195521_C_T","variantRsId":"rs1057517697","cohortPhenotypes":["Lissencephaly 8"],"diseaseFromSource":"Lissencephaly 8","diseaseFromSourceId":"C4310646","diseaseFromSourceMappedId":"MONDO_0018838","variantHgvsId":"NC_000012.12:g.88195521C>T"} +{"alleleOrigins":null,"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV000987058","releaseDate":"2020-01-11","targetFromSourceId":"ENSG00000130561","variantFunctionalConsequenceId":"SO_0001587","variantId":"2_233328536_C_T","variantRsId":"rs1574942567","cohortPhenotypes":["Oguchi disease","Oguchi's disease","Stationary night blindness, Oguchi type"],"diseaseFromSource":"Oguchi disease","diseaseFromSourceId":"C1306122","diseaseFromSourceMappedId":"MONDO_0019152","variantHgvsId":"NC_000002.12:g.233328536C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV000850771","releaseDate":"2019-09-22","targetFromSourceId":"ENSG00000198804","variantFunctionalConsequenceId":"SO_0001631","variantId":"MT_4456_C_T","variantRsId":"rs1603219465","cohortPhenotypes":["Juvenile myopathy, encephalopathy, lactic acidosis AND stroke","MELAS syndrome","Mitochondrial encephalomyopathy lactic acidosis and stroke-like episodes"],"diseaseFromSource":"Juvenile myopathy, encephalopathy, lactic acidosis AND stroke","diseaseFromSourceId":"C0162671","diseaseFromSourceMappedId":"Orphanet_550","variantHgvsId":"NC_012920.1:m.4456C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, multiple submitters, no conflicts","studyId":"RCV001223098","releaseDate":"2020-07-16","targetFromSourceId":"ENSG00000104133","variantFunctionalConsequenceId":"SO_0001583","variantId":"15_44598352_G_C","variantRsId":"rs746116309","cohortPhenotypes":["Autosomal recessive hereditary spastic paraplegia, mental impairment, and thin corpus callosum","Hereditary spastic paraplegia 11","Hereditary spastic paraplegia mental impairment and thin corpus callosum","Nakamura Osame syndrome","SPASTIC PARAPLEGIA, AUTOSOMAL RECESSIVE, COMPLICATED, WITH THIN CORPUS CALLOSUM","SPASTIC PARAPLEGIA, AUTOSOMAL RECESSIVE, WITH MENTAL IMPAIRMENT AND THIN CORPUS CALLOSUM","Spastic paraplegia 11","Spastic paraplegia 11, autosomal recessive","Spastic paraplegia, mental retardation and thin corpus callosum"],"diseaseFromSource":"Hereditary spastic paraplegia 11","diseaseFromSourceId":"C1858479","diseaseFromSourceMappedId":"MONDO_0011445","variantHgvsId":"NC_000015.10:g.44598352G>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV000279062","releaseDate":"2016-12-06","targetFromSourceId":"ENSG00000175294","variantFunctionalConsequenceId":"SO_0001819","variantId":"11_66025978_C_T","variantRsId":"rs370953416","cohortPhenotypes":["CATSPER-Related Male Infertility","MALE INFERTILITY, NONSYNDROMIC, AUTOSOMAL RECESSIVE","Spermatogenic failure 7"],"diseaseFromSource":"Spermatogenic failure 7","diseaseFromSourceId":"C2751811","diseaseFromSourceMappedId":"MONDO_0013070","variantHgvsId":"NC_000011.10:g.66025978C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV003236645","releaseDate":"2023-06-24","targetFromSourceId":"ENSG00000184895","variantFunctionalConsequenceId":"SO_0001583","variantId":"Y_2787299_G_A","variantRsId":null,"cohortPhenotypes":["46,XX SEX REVERSAL, SRY-POSITIVE","46,XX sex reversal 1","SRY-positive 46,XX testicular disorder of sex development"],"diseaseFromSource":"46,XX sex reversal 1","diseaseFromSourceId":"C2748895","diseaseFromSourceMappedId":"MONDO_0100250","variantHgvsId":"NC_000024.10:g.2787299G>A"} +{"alleleOrigins":null,"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV000671195","releaseDate":"2018-08-05","targetFromSourceId":"ENSG00000170927","variantFunctionalConsequenceId":"SO_0001822","variantId":"6_51748030_CTTT_C","variantRsId":"rs1554218479","cohortPhenotypes":["AR polycystic kidney disease","Autosomal recessive polycystic kidney disease","POLYCYSTIC KIDNEY AND HEPATIC DISEASE 1","POLYCYSTIC KIDNEY DISEASE, INFANTILE, TYPE I","Polycystic kidney disease, infantile type"],"diseaseFromSource":"Autosomal recessive polycystic kidney disease","diseaseFromSourceId":"C0085548","diseaseFromSourceMappedId":"MONDO_0009889","variantHgvsId":"NC_000006.12:g.51748034_51748036del"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"no assertion criteria provided","studyId":"RCV003389101","releaseDate":"2023-11-11","targetFromSourceId":"ENSG00000114374","variantFunctionalConsequenceId":"SO_0001583","variantId":"Y_12842370_G_T","variantRsId":null,"cohortPhenotypes":["AZOOSPERMIA, NONOBSTRUCTIVE, Y-LINKED","OLIGOSPERMIA, NONOBSTRUCTIVE, Y-LINKED","OLIGOZOOSPERMIA, NONOBSTRUCTIVE, Y-LINKED","SPERMATOGENIC ARREST, Y-LINKED","SPERMATOGENIC FAILURE, NONOBSTRUCTIVE, Y-LINKED","Spermatogenic failure, Y-linked, 2"],"diseaseFromSource":"Spermatogenic failure, Y-linked, 2","diseaseFromSourceId":"C1839071","diseaseFromSourceMappedId":"MONDO_0015607","variantHgvsId":"NC_000024.10:g.12842370G>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002083386","releaseDate":"2022-04-08","targetFromSourceId":"ENSG00000072778","variantFunctionalConsequenceId":"SO_0002169","variantId":"17_7224135_T_C","variantRsId":"rs745620433","cohortPhenotypes":["VLCAD deficiency","Very long chain acyl-CoA dehydrogenase deficiency"],"diseaseFromSource":"Very long chain acyl-CoA dehydrogenase deficiency","diseaseFromSourceId":"C3887523","diseaseFromSourceMappedId":"MONDO_0008723","variantHgvsId":"NC_000017.11:g.7224135T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002203969","releaseDate":"2022-04-12","targetFromSourceId":"ENSG00000125741","variantFunctionalConsequenceId":"SO_0001819","variantId":"19_45584735_C_T","variantRsId":"rs1131692018","cohortPhenotypes":["3-Methylglutaconic aciduria type 3","3-alpha methylglutaconic aciduria type III","3-methylglutaconic aciduria type III","Costeff optic atrophy syndrome","Iraqi Jewish optic atrophy plus","MGA type III","OPA3, AUTOSOMAL RECESSIVE","OPA3-Related 3-Methylglutaconic Aciduria","OPTIC ATROPHY 3, AUTOSOMAL DOMINANT","OPTIC ATROPHY 3, AUTOSOMAL RECESSIVE","Optic atrophy 3","Optic atrophy and cataract, autosomal dominant","Optic atrophy infantile with chorea and spastic paraplegia","Optic atrophy, cataract, and neurologic disorder"],"diseaseFromSource":"Optic atrophy 3","diseaseFromSourceId":"C1833809","diseaseFromSourceMappedId":"Orphanet_67036","variantHgvsId":"NC_000019.10:g.45584735C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002676812","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000125826","variantFunctionalConsequenceId":"SO_0001583","variantId":"20_419394_C_A","variantRsId":null,"cohortPhenotypes":["POLYGLUCOSAN BODY MYOPATHY WITHOUT IMMUNODEFICIENCY","Polyglucosan body myopathy 1 with or without immunodeficiency","Polyglucosan body myopathy type 1"],"diseaseFromSource":"Polyglucosan body myopathy type 1","diseaseFromSourceId":"C4014605","diseaseFromSourceMappedId":"Orphanet_397937","variantHgvsId":"NC_000020.11:g.419394C>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002680839","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000160789","variantFunctionalConsequenceId":"SO_0001583","variantId":"1_156137732_C_T","variantRsId":null,"cohortPhenotypes":["Charcot-Marie-Tooth disease type 2","Charcot-Marie-Tooth, Type 2"],"diseaseFromSource":"Charcot-Marie-Tooth disease type 2","diseaseFromSourceId":"C0270914","diseaseFromSourceMappedId":"MONDO_0018993","variantHgvsId":"NC_000001.11:g.156137732C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV002847567","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000075891","variantFunctionalConsequenceId":"SO_0001589","variantId":"10_100750706_C_CG","variantRsId":null,"cohortPhenotypes":["CAKUT WITH OR WITHOUT OCULAR ABNORMALITIES","CONGENITAL ANOMALIES OF THE KIDNEY AND URINARY TRACT WITH OR WITHOUT OCULAR ABNORMALITIES","Coloboma of optic nerve with renal disease","Focal segmental glomerulosclerosis 7","Optic coloboma, vesicoureteral reflux, and renal anomalies","Optic nerve coloboma with renal disease","PAPILLORENAL SYNDROME WITH MILD OCULAR ABNORMALITIES","Papillorenal syndrome","RENAL-COLOBOMA SYNDROME WITH MACULAR ABNORMALITIES","Renal coloboma syndrome"],"diseaseFromSource":"Focal segmental glomerulosclerosis 7","diseaseFromSourceId":"C4014925","diseaseFromSourceMappedId":"MONDO_0014451","variantHgvsId":"NC_000010.11:g.100750708dup"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003621924","releaseDate":"2024-02-20","targetFromSourceId":"ENSG00000008056","variantFunctionalConsequenceId":"SO_0001819","variantId":"X_47619585_G_C","variantRsId":null,"cohortPhenotypes":["Epilepsy, X-linked 1, with variable learning disabilities and behavior disorders","Epilepsy, X-linked, with variable learning disabilities and behavior disorders","X-linked epilepsy-learning disabilities-behavior disorders syndrome"],"diseaseFromSource":"Epilepsy, X-linked 1, with variable learning disabilities and behavior disorders","diseaseFromSourceId":"C5774177","diseaseFromSourceMappedId":"Orphanet_85294","variantHgvsId":"NC_000023.11:g.47619585G>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003636240","releaseDate":"2024-02-20","targetFromSourceId":"ENSG00000143669","variantFunctionalConsequenceId":"SO_0001819","variantId":"1_235744114_A_G","variantRsId":null,"cohortPhenotypes":["Chediak-Higashi Syndrome","ChΓ©diak-Higashi syndrome"],"diseaseFromSource":"ChΓ©diak-Higashi syndrome","diseaseFromSourceId":"C0007965","diseaseFromSourceMappedId":"Orphanet_167","variantHgvsId":"NC_000001.11:g.235744114A>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV003735165","releaseDate":"2024-02-20","targetFromSourceId":"ENSG00000196569","variantFunctionalConsequenceId":"SO_0001575","variantId":"6_129453132_G_C","variantRsId":null,"cohortPhenotypes":["LAMA2-related muscular dystrophy","Laminin alpha 2-related dystrophy"],"diseaseFromSource":"LAMA2-related muscular dystrophy","diseaseFromSourceId":"C5679788","diseaseFromSourceMappedId":"MONDO_0100228","variantHgvsId":"NC_000006.12:g.129453132G>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV000797080","releaseDate":"2019-08-14","targetFromSourceId":"ENSG00000179348","variantFunctionalConsequenceId":"SO_0001583","variantId":"3_128485795_C_A","variantRsId":"rs1576748419","cohortPhenotypes":["COMBINED IMMUNODEFICIENCY WITH SUSCEPTIBILITY TO MYCOBACTERIAL, VIRAL, AND FUNGAL INFECTIONS","Deafness-lymphedema-leukemia syndrome","Dendritic cell, monocyte, B lymphocyte, and natural killer lymphocyte deficiency","Emberger syndrome","GATA2 DEFICIENCY","IMMUNODEFICIENCY 21","Lymphedema, primary, with myelodysplasia","MONOCYTOPENIA AND MYCOBACTERIAL INFECTION SYNDROME","MONOCYTOPENIA WITH SUSCEPTIBILITY TO MYCOBACTERIAL, FUNGAL, AND PAPILLOMAVIRUS INFECTIONS AND MYELODYSPLASIA","Monocytopenia with susceptibility to infections"],"diseaseFromSource":"Monocytopenia with susceptibility to infections","diseaseFromSourceId":"C3280030","diseaseFromSourceMappedId":"MONDO_0013607","variantHgvsId":"NC_000003.12:g.128485795C>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV001500249","releaseDate":"2021-06-08","targetFromSourceId":"ENSG00000159082","variantFunctionalConsequenceId":"SO_0001819","variantId":"21_32694306_C_T","variantRsId":"rs780954414","cohortPhenotypes":["Developmental and epileptic encephalopathy, 53","Early-onset Parkinson disease 20","Epileptic encephalopathy, early infantile, 53"],"diseaseFromSource":"Developmental and epileptic encephalopathy, 53","diseaseFromSourceId":"C4479313","diseaseFromSourceMappedId":"Orphanet_1934","variantHgvsId":"NC_000021.9:g.32694306C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002392200","releaseDate":"2022-11-29","targetFromSourceId":"ENSG00000184058","variantFunctionalConsequenceId":"SO_0001819","variantId":"22_19766420_C_T","variantRsId":null,"cohortPhenotypes":["Cardiovascular phenotype"],"diseaseFromSource":"Cardiovascular phenotype","diseaseFromSourceId":"CN230736","diseaseFromSourceMappedId":"HP_0001626","variantHgvsId":"NC_000022.11:g.19766420C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV003774575","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000128591","variantFunctionalConsequenceId":"SO_0001583","variantId":"7_128841305_G_A","variantRsId":null,"cohortPhenotypes":["Cardiomyopathy, familial hypertrophic, 26","Dilated Cardiomyopathy, Dominant","Distal myopathy with posterior leg and anterior hand involvement","FILAMINOPATHY, AUTOSOMAL DOMINANT","Filaminopathy (type)","Hypertrophic cardiomyopathy 26","Myofibrillar myopathy 5","Myofibrillar myopathy, filamin C-related","Myopathy, distal, 4","WILLIAMS DISTAL MYOPATHY"],"diseaseFromSource":"Hypertrophic cardiomyopathy 26","diseaseFromSourceId":"C4310749","diseaseFromSourceMappedId":"EFO_0000538","variantHgvsId":"NC_000007.14:g.128841305G>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV003779225","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000151929","variantFunctionalConsequenceId":"SO_0001821","variantId":"10_119670132_G_GGCA","variantRsId":null,"cohortPhenotypes":["Dilated cardiomyopathy 1HH","Myofibrillar myopathy 6","Myofibrillar myopathy, BAG3-related"],"diseaseFromSource":"Dilated cardiomyopathy 1HH","diseaseFromSourceId":"C3151293","diseaseFromSourceMappedId":"MONDO_0013479","variantHgvsId":"NC_000010.11:g.119670135_119670137dup"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV001490387","releaseDate":"2021-06-08","targetFromSourceId":"ENSG00000134853","variantFunctionalConsequenceId":"SO_0001627","variantId":"4_54287551_T_C","variantRsId":"rs2110341918","cohortPhenotypes":["Gastrointestinal Stromal Sarcoma","Gastrointestinal stroma tumor","Gastrointestinal stromal tumor","Gastrointestinal stromal tumor, somatic"],"diseaseFromSource":"Gastrointestinal stromal tumor","diseaseFromSourceId":"C0238198","diseaseFromSourceMappedId":"MONDO_0011719","variantHgvsId":"NC_000004.12:g.54287551T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV003041098","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000007314","variantFunctionalConsequenceId":"SO_0001583","variantId":"17_63948745_A_T","variantRsId":null,"cohortPhenotypes":["Adynamia episodica hereditaria with or without myotonia","Familial hyperkalemic periodic paralysis","Gamstorp disease","Gamstorp episodic adynamy","Hyperkalemic periodic paralysis"],"diseaseFromSource":"Hyperkalemic periodic paralysis","diseaseFromSourceId":"C0238357","diseaseFromSourceMappedId":"MONDO_0008224","variantHgvsId":"NC_000017.11:g.63948745A>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003966094","releaseDate":"2024-03-16","targetFromSourceId":"ENSG00000164818","variantFunctionalConsequenceId":"SO_0001819","variantId":"7_756970_C_G","variantRsId":"rs571248637","cohortPhenotypes":["DNAAF5-related condition","DNAAF5-related disorder"],"diseaseFromSource":"DNAAF5-related disorder","diseaseFromSourceId":null,"diseaseFromSourceMappedId":null,"variantHgvsId":"NC_000007.14:g.756970C>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003921540","releaseDate":"2024-03-16","targetFromSourceId":"ENSG00000134982","variantFunctionalConsequenceId":"SO_0001623","variantId":"5_112738418_A_G","variantRsId":null,"cohortPhenotypes":["APC-related condition","APC-related disorder"],"diseaseFromSource":"APC-related disorder","diseaseFromSourceId":null,"diseaseFromSourceMappedId":null,"variantHgvsId":"NC_000005.10:g.112738418A>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV001340631","releaseDate":"2021-03-22","targetFromSourceId":"ENSG00000139618","variantFunctionalConsequenceId":"SO_0001583","variantId":"13_32340936_T_C","variantRsId":"rs876660049","cohortPhenotypes":["Breast and ovarian cancer","Hereditary breast and ovarian cancer","Hereditary breast and ovarian cancer syndrome","Hereditary breast and ovarian cancer syndrome (HBOC)","Hereditary breast ovarian cancer syndrome"],"diseaseFromSource":"Hereditary breast ovarian cancer syndrome","diseaseFromSourceId":"C0677776","diseaseFromSourceMappedId":"MONDO_0003582","variantHgvsId":"NC_000013.11:g.32340936T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["conflicting interpretations of pathogenicity"],"confidence":"no assertion criteria provided","studyId":"RCV000056173","releaseDate":"2013-10-01","targetFromSourceId":"ENSG00000196218","variantFunctionalConsequenceId":"SO_0001583","variantId":"19_38585013_C_T","variantRsId":"rs118192153","cohortPhenotypes":["Central core disease","Central core disease of muscle","Central core myopathy","Muscle core disease","Muscular central core disease","Myopathy, central fibrillar","Shy-Magee syndrome"],"diseaseFromSource":"Central core myopathy","diseaseFromSourceId":"C0751951","diseaseFromSourceMappedId":"EFO_1000855","variantHgvsId":"NC_000019.10:g.38585013C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002249476","releaseDate":"2022-05-28","targetFromSourceId":"ENSG00000228253","variantFunctionalConsequenceId":"SO_0001631","variantId":"MT_7462_C_T","variantRsId":"rs1569484151","cohortPhenotypes":["COX deficiency","Complex 4 mitochondrial respiratory chain deficiency","Complex IV deficiency","Deficiency of mitochondrial respiratory chain complex4","Mitochondrial complex IV deficiency","Mitochondrial complex IV deficiency, nuclear type 1"],"diseaseFromSource":"Mitochondrial complex IV deficiency, nuclear type 1","diseaseFromSourceId":"C5435656","diseaseFromSourceMappedId":"MONDO_0859160","variantHgvsId":"NC_012920.1:m.7462C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003093847","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000130294","variantFunctionalConsequenceId":"SO_0001630","variantId":"2_240767028_G_C","variantRsId":"rs748724769","cohortPhenotypes":["Hereditary sensory and autonomic neuropathy type IIC","Hereditary spastic paraplegia 30","Intellectual disability, autosomal dominant 9","Mental retardation, autosomal dominant 9","NESCAV SYNDROME","Neuropathy, hereditary sensory, type 2C","SPASTIC PARAPLEGIA 30, AUTOSOMAL DOMINANT","Spastic paraplegia 30, autosomal recessive"],"diseaseFromSource":"Neuropathy, hereditary sensory, type 2C","diseaseFromSourceId":"C3280168","diseaseFromSourceMappedId":"Orphanet_970","variantHgvsId":"NC_000002.12:g.240767028G>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002016427","releaseDate":"2022-03-28","targetFromSourceId":"ENSG00000159884","variantFunctionalConsequenceId":"SO_0001631","variantId":"9_35657840_C_G","variantRsId":"rs1287720442","cohortPhenotypes":["Anauxetic dysplasia","SPONDYLOMETAEPIPHYSEAL DYSPLASIA, ANAUXETIC TYPE"],"diseaseFromSource":"Anauxetic dysplasia","diseaseFromSourceId":"C1846796","diseaseFromSourceMappedId":"MONDO_0011773","variantHgvsId":"NC_000009.12:g.35657840C>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002625025","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000054983","variantFunctionalConsequenceId":"SO_0001583","variantId":"14_87976417_C_A","variantRsId":null,"cohortPhenotypes":["Galactocerebrosidase deficiency","Galactosylceramide beta-galactosidase deficiency","Globoid cell leukoencephalopathy","Krabbe leukodystrophy","Leukodystrophy, Globoid Cell"],"diseaseFromSource":"Galactosylceramide beta-galactosidase deficiency","diseaseFromSourceId":"C0023521","diseaseFromSourceMappedId":"MONDO_0009499","variantHgvsId":"NC_000014.9:g.87976417C>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV003516889","releaseDate":"2024-02-14","targetFromSourceId":"ENSG00000046604","variantFunctionalConsequenceId":"SO_0001583","variantId":"18_31520935_C_A","variantRsId":null,"cohortPhenotypes":["ARRHYTHMOGENIC RIGHT VENTRICULAR DYSPLASIA, FAMILIAL, 10","Arrhythmogenic Right Ventricular Dysplasia/Cardiomyopathy10","Arrhythmogenic right ventricular cardiomyopathy, type 10","Arrhythmogenic right ventricular dysplasia 10","Arrhythmogenic right ventricular dysplasia/cardiomyopathy, type 10"],"diseaseFromSource":"Arrhythmogenic right ventricular dysplasia 10","diseaseFromSourceId":"C1857777","diseaseFromSourceMappedId":"Orphanet_247","variantHgvsId":"NC_000018.10:g.31520935C>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV003583433","releaseDate":"2024-02-14","targetFromSourceId":"ENSG00000163932","variantFunctionalConsequenceId":"SO_0001583","variantId":"3_53186260_A_G","variantRsId":null,"cohortPhenotypes":["Autoimmune lymphoproliferative syndrome, type III","Autoimmune lymphoproliferative syndrome, type III caused by mutation in PRKCD"],"diseaseFromSource":"Autoimmune lymphoproliferative syndrome, type III caused by mutation in PRKCD","diseaseFromSourceId":"C3809928","diseaseFromSourceMappedId":"Orphanet_3261","variantHgvsId":"NC_000003.12:g.53186260A>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV001419044","releaseDate":"2021-05-16","targetFromSourceId":"ENSG00000171759","variantFunctionalConsequenceId":"SO_0001819","variantId":"12_102912824_A_C","variantRsId":"rs773425620","cohortPhenotypes":["Folling disease","Oligophrenia phenylpyruvica","Phenylketonuria","Phenylketonurias"],"diseaseFromSource":"Phenylketonuria","diseaseFromSourceId":"C0031485","diseaseFromSourceMappedId":"MONDO_0009861","variantHgvsId":"NC_000012.12:g.102912824A>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV001861075","releaseDate":"2022-03-28","targetFromSourceId":"ENSG00000138622","variantFunctionalConsequenceId":"SO_0001583","variantId":"15_73324179_T_G","variantRsId":"rs1161776375","cohortPhenotypes":["Brugada syndrome 8"],"diseaseFromSource":"Brugada syndrome 8","diseaseFromSourceId":"C2751083","diseaseFromSourceMappedId":"MONDO_0013148","variantHgvsId":"NC_000015.10:g.73324179T>G"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002138447","releaseDate":"2022-04-08","targetFromSourceId":"ENSG00000162065","variantFunctionalConsequenceId":"SO_0001627","variantId":"16_2499947_G_A","variantRsId":"rs1173044946","cohortPhenotypes":["Autosomal dominant nonsyndromic hearing loss 65","Caused by mutation in the TBC1 domain family, member 24","Deafness, autosomal dominant 65","Developmental and epileptic encephalopathy, 1","Epileptic encephalopathy, early infantile, 1","INFANTILE SPASM SYNDROME, X-LINKED 1","OHTAHARA SYNDROME, X-LINKED","Tonic spasms with clustering, arrest of psychomotor development and hypsarrhythmia on EEG","West's syndrome","X-Linked Infantile Spasm Syndrome","X-linked infantile spasms"],"diseaseFromSource":"Developmental and epileptic encephalopathy, 1","diseaseFromSourceId":"C3463992","diseaseFromSourceMappedId":"Orphanet_364063","variantHgvsId":"NC_000016.10:g.2499947G>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002933690","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000165280","variantFunctionalConsequenceId":"SO_0001819","variantId":"9_35063060_A_C","variantRsId":null,"cohortPhenotypes":["Amyotrophic lateral sclerosis 14, with or without frontotemporal dementia","Frontotemporal dementia and/or amyotrophic lateral sclerosis 6","Inclusion body myopathy with Paget disease of bone and frontotemporal dementia","Inclusion body myopathy with early-onset Paget disease and frontotemporal dementia","VCP-Related Amyotrophic Lateral Sclerosis","VCP-Related Amyotrophic Lateral Sclerosis/Frontotemporal Dementia"],"diseaseFromSource":"Inclusion body myopathy with Paget disease of bone and frontotemporal dementia","diseaseFromSourceId":"C1833662","diseaseFromSourceMappedId":"Orphanet_52430","variantHgvsId":"NC_000009.12:g.35063060A>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003804888","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000178209","variantFunctionalConsequenceId":"SO_0001819","variantId":"8_143920449_G_A","variantRsId":null,"cohortPhenotypes":["Autosomal recessive limb-girdle muscular dystrophy type 2Q","EPIDERMOLYSIS BULLOSA SIMPLEX 5A, OGNA TYPE","EPIDERMOLYSIS BULLOSA SIMPLEX AND LIMB-GIRDLE MUSCULAR DYSTROPHY","Epidermolysa bullosa simplex and limb girdle muscular dystrophy","Epidermolysis bullosa simplex 5B, with muscular dystrophy","Epidermolysis bullosa simplex 5C, with pyloric atresia","Epidermolysis bullosa simplex with muscular dystrophy","Epidermolysis bullosa simplex with nail dystrophy","Epidermolysis bullosa simplex with pyloric atresia","Epidermolysis bullosa simplex, Ogna type","Limb-girdle muscular dystrophy, type 2Q","MUSCULAR DYSTROPHY, LIMB-GIRDLE, AUTOSOMAL RECESSIVE 17","PLEC1-Related Epidermolysis Bullosa with Pyloric Atresia","Pidermolysis bullosa simplex 5A, Ogna type"],"diseaseFromSource":"Epidermolysis bullosa simplex 5B, with muscular dystrophy","diseaseFromSourceId":"C2931072","diseaseFromSourceMappedId":"Orphanet_257","variantHgvsId":"NC_000008.11:g.143920449G>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003805362","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000101310","variantFunctionalConsequenceId":"SO_0002169","variantId":"20_18515639_C_T","variantRsId":null,"cohortPhenotypes":["CDA 2","Congenital dyserythropoietic anemia, type II","Cowden syndrome 7","Dyserythropoietic anemia, congenital type 2","HEMPAS anemia","Hereditary Erythroblastic Multinuclearity with Positive Acidified-Serum test'"],"diseaseFromSource":"Cowden syndrome 7","diseaseFromSourceId":"C4225179","diseaseFromSourceMappedId":"MONDO_0014802","variantHgvsId":"NC_000020.11:g.18515639C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV003806863","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000134569","variantFunctionalConsequenceId":"SO_0001574","variantId":"11_46883977_C_T","variantRsId":null,"cohortPhenotypes":["Cenani syndactylism","Cenani-Lenz syndactyly syndrome","Congenital myasthenic syndrome 17","SYNDACTYLY, TYPE VII","Sclerosteosis 2","Syndactyly Cenani Lenz type","Syndactyly type 7"],"diseaseFromSource":"Sclerosteosis 2","diseaseFromSourceId":"C3280402","diseaseFromSourceMappedId":"MONDO_0013679","variantHgvsId":"NC_000011.10:g.46883977C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV003850101","releaseDate":"2024-02-28","targetFromSourceId":"ENSG00000054983","variantFunctionalConsequenceId":"SO_0002169","variantId":"14_87988221_T_C","variantRsId":null,"cohortPhenotypes":["Galactocerebrosidase deficiency","Galactosylceramide beta-galactosidase deficiency","Globoid cell leukoencephalopathy","Krabbe leukodystrophy","Leukodystrophy, Globoid Cell"],"diseaseFromSource":"Galactosylceramide beta-galactosidase deficiency","diseaseFromSourceId":"C0023521","diseaseFromSourceMappedId":"MONDO_0009499","variantHgvsId":"NC_000014.9:g.87988221T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV001944434","releaseDate":"2022-03-28","targetFromSourceId":"ENSG00000178209","variantFunctionalConsequenceId":"SO_0001583","variantId":"8_143917391_C_T","variantRsId":"rs541897170","cohortPhenotypes":["Autosomal recessive limb-girdle muscular dystrophy type 2Q","EPIDERMOLYSIS BULLOSA SIMPLEX 5A, OGNA TYPE","EPIDERMOLYSIS BULLOSA SIMPLEX AND LIMB-GIRDLE MUSCULAR DYSTROPHY","Epidermolysa bullosa simplex and limb girdle muscular dystrophy","Epidermolysis bullosa simplex 5B, with muscular dystrophy","Epidermolysis bullosa simplex 5C, with pyloric atresia","Epidermolysis bullosa simplex with muscular dystrophy","Epidermolysis bullosa simplex with nail dystrophy","Epidermolysis bullosa simplex with pyloric atresia","Epidermolysis bullosa simplex, Ogna type","Limb-girdle muscular dystrophy, type 2Q","MUSCULAR DYSTROPHY, LIMB-GIRDLE, AUTOSOMAL RECESSIVE 17","PLEC1-Related Epidermolysis Bullosa with Pyloric Atresia","Pidermolysis bullosa simplex 5A, Ogna type"],"diseaseFromSource":"Autosomal recessive limb-girdle muscular dystrophy type 2Q","diseaseFromSourceId":"C3150989","diseaseFromSourceMappedId":"Orphanet_254361","variantHgvsId":"NC_000008.11:g.143917391C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV000547369","releaseDate":"2017-12-26","targetFromSourceId":"ENSG00000008056","variantFunctionalConsequenceId":"SO_0001819","variantId":"X_47574166_C_T","variantRsId":"rs967215240","cohortPhenotypes":["Epilepsy, X-linked 1, with variable learning disabilities and behavior disorders","Epilepsy, X-linked, with variable learning disabilities and behavior disorders","X-linked epilepsy-learning disabilities-behavior disorders syndrome"],"diseaseFromSource":"Epilepsy, X-linked 1, with variable learning disabilities and behavior disorders","diseaseFromSourceId":"C5774177","diseaseFromSourceMappedId":"MONDO_0010339","variantHgvsId":"NC_000023.11:g.47574166C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["uncertain significance"],"confidence":"criteria provided, single submitter","studyId":"RCV002912729","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000173040","variantFunctionalConsequenceId":"SO_0001583","variantId":"4_5640686_T_C","variantRsId":null,"cohortPhenotypes":["Acrofacial dysostosis of Weyers","Chondroectodermal dysplasia","Curry-Hall syndrome","Ellis-van Creveld syndrome","Mesoectodermal dysplasia","WEYERS ACRODENTAL DYSOSTOSIS"],"diseaseFromSource":"Ellis-van Creveld syndrome","diseaseFromSourceId":"C0013903","diseaseFromSourceMappedId":"Orphanet_289","variantHgvsId":"NC_000004.12:g.5640686T>C"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely benign"],"confidence":"criteria provided, single submitter","studyId":"RCV002933106","releaseDate":"2023-02-07","targetFromSourceId":"ENSG00000187535","variantFunctionalConsequenceId":"SO_0001819","variantId":"16_1523551_C_T","variantRsId":null,"cohortPhenotypes":["Conorenal syndrome","Renal dysplasia, retinal pigmentary dystrophy, cerebellar ataxia and skeletal dysplasia","SHORT-RIB THORACIC DYSPLASIA 9 WITH OR WITHOUT POLYDACTYLY","SHORT-RIB THORACIC DYSPLASIA 9 WITHOUT POLYDACTYLY","Saldino-Mainzer syndrome"],"diseaseFromSource":"Saldino-Mainzer syndrome","diseaseFromSourceId":"C1849437","diseaseFromSourceMappedId":"Orphanet_140969","variantHgvsId":"NC_000016.10:g.1523551C>T"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV003398441","releaseDate":"2023-11-20","targetFromSourceId":"ENSG00000123191","variantFunctionalConsequenceId":"SO_0001583","variantId":"13_51958333_C_A","variantRsId":"rs28942074","cohortPhenotypes":["ATP7B-related condition","ATP7B-related disorder"],"diseaseFromSource":"ATP7B-related disorder","diseaseFromSourceId":null,"diseaseFromSourceMappedId":null,"variantHgvsId":"NC_000013.11:g.51958333C>A"} +{"alleleOrigins":["germline"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["likely pathogenic","pathogenic"],"confidence":"criteria provided, multiple submitters, no conflicts","studyId":"RCV000116005","releaseDate":"2014-05-17","targetFromSourceId":"ENSG00000183765","variantFunctionalConsequenceId":"SO_0001587","variantId":"22_28687974_G_A","variantRsId":"rs200432447","cohortPhenotypes":["Cancer predisposition","Hereditary Cancer Syndrome","Hereditary cancer-predisposing syndrome","Hereditary neoplastic syndrome","Neoplastic Syndromes, Hereditary","Tumor predisposition"],"diseaseFromSource":"Hereditary cancer-predisposing syndrome","diseaseFromSourceId":"C0027672","diseaseFromSourceMappedId":"MONDO_0015356","variantHgvsId":"NC_000022.11:g.28687974G>A"} +{"alleleOrigins":["de novo"],"datasourceId":"eva","datatypeId":"genetic_association","clinicalSignificances":["pathogenic"],"confidence":"criteria provided, single submitter","studyId":"RCV000855501","releaseDate":"2019-11-08","targetFromSourceId":"ENSG00000152217","variantFunctionalConsequenceId":"SO_0001583","variantId":"18_44951952_T_C","variantRsId":"rs267607038","cohortPhenotypes":["Arthrogryposis multiplex congenita","Congenital arthromyodysplasia","Congenital multiple arthrogryposis","Fetal akinesia deformation sequence 1","Fetal akinesia sequence","Fibrous ankylosis of multiple joints","Guerin-Stern syndrome","GuΓ©rin-Stern syndrome","Lethal Pena-Shokeir 1 syndrome","Myodystrophia fetalis deformans","Otto syndrome","Pena Shokeir syndrome, type 1","Pena-Shokeir syndrome type I","Rocher-Sheldon syndrome","Rossi syndrome"],"diseaseFromSource":"Fetal akinesia deformation sequence 1","diseaseFromSourceId":"C1276035","diseaseFromSourceMappedId":"Orphanet_994","variantHgvsId":"NC_000018.10:g.44951952T>C"} diff --git a/tests/gentropy/data_samples/variant_sources/pharmacogenomics-test.jsonl b/tests/gentropy/data_samples/variant_sources/pharmacogenomics-test.jsonl new file mode 100644 index 000000000..b5cbb5dca --- /dev/null +++ b/tests/gentropy/data_samples/variant_sources/pharmacogenomics-test.jsonl @@ -0,0 +1,46 @@ +{"genotypeId":"7_87531302_A_A,C","variantId":"7_87531302_A_C","genotypeAnnotationText":"Patients with the AC genotype may have an increased risk of biopsy-proven acute rejection at 12 month post-transplant when treated with cyclosporine and mycophenolate mofetil as compared to patients with the CC genotype. Other genetic and clinical factors may also influence a patient's response to mycophenolate mofetil.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"cyclosporine"}],"evidenceLevel":"3","genotype":"AC","literature":["18444945"],"pgxCategory":"efficacy","studyId":"982040619","targetFromSourceId":"ENSG00000085563","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs2032582","phenotypeText":"increased risk of biopsy-proven acute rejection at 12 month post-transplant"} +{"genotypeId":"3_41237949_A_G,G","variantId":"3_41237949_A_G","genotypeAnnotationText":"Patients with the GG genotype and multiple myeloma may have a decreased response to cyclophosphamide, dexamethasone, and thalidomide as compared to patients with the AA genotypes. However, they may also be at decreased risk for neutropenia when treated with lenalidomide. Other genetic and clinical factors may also influence a patient's response to cyclophosphamide, dexamethasone, and thalidomide, and risk of neutropenia when treated with lenalidomide.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"cyclophosphamide"}],"evidenceLevel":"3","genotype":"GG","literature":["26521987","26521987"],"pgxCategory":"toxicity","studyId":"1447953328","targetFromSourceId":"ENSG00000168036","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs4135385","phenotypeText":null} +{"genotypeId":"18_63312127_C_T,T","variantId":"18_63312127_C_T","genotypeAnnotationText":"Patients with the TT genotype and ovarian cancer may have an increased risk of neurotoxicity when treated with carboplatin in combination with either docetaxel or paclitaxel, as compared to patients with the CC or CT genotype. Other genetic and clinical factors may also influence risk of neurotoxicity.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"docetaxel"}],"evidenceLevel":"3","genotype":"TT","literature":["23963862"],"pgxCategory":"toxicity","studyId":"1183631554","targetFromSourceId":"ENSG00000171791","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs2849380","phenotypeText":"increased risk of neurotoxicity"} +{"genotypeId":"20_34927985_A_T,T","variantId":"20_34927985_A_T","genotypeAnnotationText":"No patients with the TT genotype were available for analysis, but patients with the AT genotype and non-small-cell lung cancer may have shorter overall survival times when treated with platinum agents in combination with gemcitabine or taxanes, as compared to patients with the AA genotype. Other genetic and clinical factors may also influence overall survival times in non-small-cell lung cancer patients.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"carboplatin"}],"evidenceLevel":"3","genotype":"TT","literature":["21636554"],"pgxCategory":"efficacy","studyId":"1447960379","targetFromSourceId":"ENSG00000100983","variantFunctionalConsequenceId":"SO_0001632","variantRsId":"rs17309872","phenotypeText":"shorter overall survival times"} +{"genotypeId":"9_84948455_T_C,T","variantId":"9_84948455_T_C","genotypeAnnotationText":"Patients with the CT genotype and heroin addiction may require a higher dose of methadone when undergoing methadone maintenance treatment as compared to patients with the TT genotype. Other genetic and clinical factors may also influence methadone dose required for effective treatment.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"methadone"}],"evidenceLevel":"3","genotype":"CT","literature":["23651024"],"pgxCategory":"dosage","studyId":"982032396","targetFromSourceId":"ENSG00000148053","variantFunctionalConsequenceId":"SO_0001630","variantRsId":"rs2289658","phenotypeText":"require a higher dose of methadone"} +{"genotypeId":"21_36135203_G_A,A","variantId":"21_36135203_G_A","genotypeAnnotationText":"Patients with the AA genotype and breast cancer who are treated with doxorubicin: 1) may have decreased metabolism of doxorubicin 2) may have greater tumor reduction 3) may have increased severity of neutropenia as compared to patients with the GG genotype. Other genetic and clinical factors may also influence a patient's response to doxorubicin treatment and risk of toxicity.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"doxorubicin"}],"evidenceLevel":"3","genotype":"AA","literature":["18551042","18551042","18551042","18551042"],"pgxCategory":"toxicity","studyId":"652882846","targetFromSourceId":"ENSG00000159231","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs8133052","phenotypeText":"greater tumor reduction"} +{"genotypeId":"14_47546779_A_A,C","variantId":"14_47546779_A_C","genotypeAnnotationText":"Patients with the AC genotype and major depression who are treated with fluvoxamine, milnacipran or paroxetine may have an increased risk of sexual dysfunction as compared to patients with the CC genotype or may have a decreased, but not absent, risk of sexual dysfunction as compared to patients with the AA genotype. Other genetic and clinical factors may also affect patients' response to fluvoxamine, milnacipran or paroxetine.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"paroxetine"}],"evidenceLevel":"3","genotype":"AC","literature":["22445761"],"pgxCategory":"toxicity","studyId":"1444700688","targetFromSourceId":"ENSG00000139915","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs1160351","phenotypeText":"increased risk of sexual dysfunction"} +{"genotypeId":"15_78590583_G_A,A","variantId":"15_78590583_G_A","genotypeAnnotationText":"Patients with the AA genotype who are in chronic pain and receive opioid medications for treatment may be at increased risk for addiction as compared to patients with the GG genotype. Other genetic and clinical factors may also influence risk of opiate addiction.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"Opium alkaloids and derivatives"}],"evidenceLevel":"3","genotype":"AA","literature":["20725741"],"pgxCategory":"toxicity","studyId":"1448101149","targetFromSourceId":"ENSG00000169684","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs16969968","phenotypeText":"increased risk for addiction"} +{"genotypeId":"11_113475530_G_G,GG","variantId":"11_113475530_G_GG","genotypeAnnotationText":"Patients with the G/del genotype and Schizophrenia who are treated with antipsychotics 1) may have decreased response 2) may have increased time until response, compared to patients with the GG genotype. Please note that there is contradictory evidence from studies that report no association with these alleles and response to antipsychotics. Other genetic and clinical factors may also influence a patient's response to antipsychotics.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"antipsychotics"}],"evidenceLevel":"3","genotype":"G/del","literature":["18926547","16513877","15830237","9858029","9858029","9918131","17105675","15694263","11505224","20194480","28673279"],"pgxCategory":"efficacy","studyId":"655388510","targetFromSourceId":"ENSG00000149295","variantFunctionalConsequenceId":"SO_0001631","variantRsId":"rs1799732","phenotypeText":"increased time until response"} +{"genotypeId":"15_78601997_G_A,A","variantId":"15_78601997_G_A","genotypeAnnotationText":"Patients with the AA genotype may be less likely to remain abstinent from smoking when treated with placebo as compared to patients with the GG genotype. Other genetic and clinical factors may also affect a patient's success at smoking cessation.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"Drugs used in nicotine dependence"}],"evidenceLevel":"3","genotype":"AA","literature":["23249876"],"pgxCategory":"other","studyId":"1450929137","targetFromSourceId":"ENSG00000080644","variantFunctionalConsequenceId":"SO_0001819","variantRsId":"rs1051730","phenotypeText":"less likely to remain abstinent from smoking"} +{"genotypeId":"1_46405089_C_A,C","variantId":"1_46405089_C_A","genotypeAnnotationText":"Patients with the AC genotype and Psychotic Disorders who are treated with aripiprazole, clozapine, haloperidol, olanzapine, quetiapine or risperidone may have an increased likelihood of weight gain of more than 7% of baseline body weight as compared to patients with the CC genotype. However, this is contradicted in one study with risperidone. Other genetic and clinical factors may also influence a patient's risk for treatment-induced weight gain.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"haloperidol"}],"evidenceLevel":"3","genotype":"AC","literature":["20631561","23799528"],"pgxCategory":"toxicity","studyId":"1043880750","targetFromSourceId":"ENSG00000117480","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs324420","phenotypeText":"increased likelihood of weight gain of more than 7% of baseline body weight"} +{"genotypeId":"4_88174909_G_A,G","variantId":"4_88174909_G_A","genotypeAnnotationText":"Patients with the AG genotype may have increased tumor response rate and increased risk of grade 3-4 nonhematological toxicity when treated with fluorouracil, irinotecan and leucovorin as compared to patients with the GG genotype or may have decreased tumor response rate and decreased risk of grade 3-4 nonhematological toxicity when treated with fluorouracil, irinotecan and leucovorin as compared to patients with the AA genotype. Other genetic and clinical factors may also influence a patient's response to fluorouracil, irinotecan and leucovorin.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"leucovorin"}],"evidenceLevel":"3","genotype":"AG","literature":["24018773","24018773"],"pgxCategory":"efficacy","studyId":"1444700860","targetFromSourceId":"ENSG00000118777","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs7699188","phenotypeText":"increased tumor response rate"} +{"genotypeId":"X_154536002_C_T,T","variantId":"X_154536002_C_T","genotypeAnnotationText":"Patients with the TT genotype with Malaria who are treated with artesunate, chlorproguanil and dapsone may have an increased risk of hemolysis and severe/unsafe hemoglobin decreases as compared to patients with the CC genotype. Other genetic and clinical factors may also influence a patient's response to artesunate, chlorproguanil and dapsone.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"artesunate"}],"evidenceLevel":"4","genotype":"TT","literature":["19112496","19690618","19690618"],"pgxCategory":"toxicity","studyId":"981352141","targetFromSourceId":"ENSG00000160211","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1050828","phenotypeText":"increased risk of hemolysis and severe/unsafe hemoglobin decreases"} +{"genotypeId":"17_18328782_G_A,A","variantId":"17_18328782_G_A","genotypeAnnotationText":"Pediatric patients with the AA genotype and with Precursor Cell Lymphoblastic Leukemia-Lymphoma who are treated with methotrexate may have increased catalytic activity of TYMS as compared to pediatric patients with the AG and GG genotype. Patients with the AA genotype and with Precursor Cell Lymphoblastic Leukemia-Lymphoma who are treated with methotrexate may have increased likelihood of Toxic liver disease as compared to patients with the AG genotype. However, this association is contradicted in other studies. Other genetic and clinical factors may also influence a patient's response to methotrexate.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"methotrexate"}],"evidenceLevel":"3","genotype":"AA","literature":["22838948","18368069","15797993"],"pgxCategory":"toxicity","studyId":"981238370","targetFromSourceId":"ENSG00000176974","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1979277","phenotypeText":"increased catalytic activity of TYMS"} +{"genotypeId":"4_88131171_G_T,T","variantId":"4_88131171_G_T","genotypeAnnotationText":"Patients with the TT genotype and HIV infection who are treated with efavirenz may have an increased risk of abnormal dreams as compared to patients with the GG genotype. Other genetic and clinical factors may also influence a patient's risk of efavirenz-induced side effects.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"efavirenz"}],"evidenceLevel":"3","genotype":"TT","literature":["23859571"],"pgxCategory":"toxicity","studyId":"1183614716","targetFromSourceId":"ENSG00000118777","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs2231142","phenotypeText":"increased risk of abnormal dreams"} +{"genotypeId":"19_45351661_T_G,G","variantId":"19_45351661_T_G","genotypeAnnotationText":"Patients with the GG genotype and Colorectal Neoplasms who are treated with fluorouracil and leucovorin or fluorouracil, leucovorin and oxaliplatin may have 1) an increased risk of Drug Toxicity 2) an increased risk of early relapse and 3) decreased progression free survival as compared to patients with the TT genotype. Other genetic and clinical factors may also influence a patient's response to fluorouracil, leucovorin and oxaliplatin.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"fluorouracil"}],"evidenceLevel":"3","genotype":"GG","literature":["20385995","18267032","20078613"],"pgxCategory":"efficacy","studyId":"981237959","targetFromSourceId":"ENSG00000104884","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs13181","phenotypeText":"increased risk of Drug Toxicity"} +{"genotypeId":"6_35639794_T_C,C","variantId":"6_35639794_T_C","genotypeAnnotationText":"Patients with the CC genotype may 1) have decreased response to antidepressants 2) have decreased, but not absent, risk for suicide ideation with paroxetine, venlafaxine, clomipramine, lithium, liothyronine or nefazodone as compared to patients with the CT or TT genotype. However, contradictory findings regarding an association of the opposite allele or no association with response have been reported. Other genetic and clinical factors may also influence a patient's response to antidepressants.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"antidepressants"}],"evidenceLevel":"3","genotype":"CC","literature":["20709156","17467808","23733030","23733030","18597649","21449676","21449676","19676097","15565110"],"pgxCategory":"efficacy","studyId":"655384568","targetFromSourceId":"ENSG00000096060","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs1360780","phenotypeText":"decreased response to antidepressants"} +{"genotypeId":"5_112865397_A_A,G","variantId":"5_112865397_A_G","genotypeAnnotationText":"Patients with the AG genotype and major depressive disorder may be less likely to respond when treated with citalopram, fluoxetine, paroxetine or sertraline as compared to patients with the GG genotype, or more likely to respond when treated with citalopram, fluoxetine, paroxetine or sertraline as compared to patients with the AA genotype. Other genetic and clinical factors may also influence response to citalopram, fluoxetine, paroxetine or sertraline.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"citalopram"}],"evidenceLevel":"3","genotype":"AG","literature":["22795047"],"pgxCategory":"efficacy","studyId":"1183590959","targetFromSourceId":"ENSG00000153037","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs495794","phenotypeText":"less likely to respond"} +{"genotypeId":"22_19963748_G_A,G","variantId":"22_19963748_G_A","genotypeAnnotationText":"Patients with the AG genotype and major Depressive Disorder may have an increased response to fluvoxamine treatment as compared to patients with the GG genotype. Other genetic and clinical factors may also influence a patient's response to fluvoxamine.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"fluvoxamine"}],"evidenceLevel":"3","genotype":"AG","literature":["20619611"],"pgxCategory":"efficacy","studyId":"1043880039","targetFromSourceId":"ENSG00000093010","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs4680","phenotypeText":"increased response"} +{"genotypeId":"10_94761900_C_T,T","variantId":"10_94761900_C_T","genotypeAnnotationText":"Patients with the TT genotype and breast cancer may have a decreased risk for leukopenia when treated with cyclophosphamide, doxorubicin and fluorouracil (FAC) as compared to patients with CC genotype. Other genetic and clinical factors may also influence risk for leukopenia in patients taking FAC chemotherapy.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"cyclophosphamide"}],"evidenceLevel":"3","genotype":"TT","literature":["29507678"],"pgxCategory":"toxicity","studyId":"1449718265","targetFromSourceId":"ENSG00000165841","variantFunctionalConsequenceId":"SO_0001631","variantRsId":"rs12248560","phenotypeText":"decreased risk for leukopenia"} +{"genotypeId":"3_114171968_C_T,T","variantId":"3_114171968_C_T","genotypeAnnotationText":"Patients with the TT genotype and Schizophrenia who are treated with clozapine may have a better response to treatment as compared to patients with the CC or CT genotype. Please note; this association was not found in a meta-analysis. Other genetic and clinical factors may also influence a patient's response to clozapine treatment.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"clozapine"}],"evidenceLevel":"3","genotype":"TT","literature":["21332319","20029384"],"pgxCategory":"efficacy","studyId":"981203578","targetFromSourceId":"ENSG00000151577","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs6280","phenotypeText":"better response to treatment"} +{"genotypeId":"19_45409478_C_A,G","variantId":"19_45409478_C_A","genotypeAnnotationText":"Patients with Mesothelioma and the AC genotype may have worse overall and progression-free survival when treated with cisplatin and gemcitabine as compared to patients with the CC genotype. Other clinical and genetic factors may also influence response to cisplatin and gemcitabine in patients with mesothelioma.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"cisplatin"}],"evidenceLevel":"3","genotype":"AG","literature":["28422153"],"pgxCategory":"efficacy","studyId":"1449004745","targetFromSourceId":"ENSG00000012061","variantFunctionalConsequenceId":"SO_0001624","variantRsId":"rs3212986","phenotypeText":"worse overall and progression-free survival"} +{"genotypeId":"2_233671807_A_A,AT","variantId":"2_233671807_A_AT","genotypeAnnotationText":"Patients with the rs3832043 T/del genotype and non-small cell lung cancer may have decreased glucuronidation of SN-38 as compared to patients with the TT genotype, or increased glucuronidation of SN-38 as compared to patients with the del/del genotype. SN-38 is the active metabolite of irinotecan, and is glucuronidated by UGT1A9 into an inactive form (SN-38G). This annotation only covers the pharmacokinetic relationship between rs3832043 and SN-38 and does not include evidence about clinical outcomes. Other genetic and clinical factors may also influence SN-38 metabolism.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"SN-38"}],"evidenceLevel":"3","genotype":"T/del","literature":["24897286","18221820","16636344"],"pgxCategory":"metabolism/pk","studyId":"1183615199","targetFromSourceId":"ENSG00000242515","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs3832043","phenotypeText":"decreased glucuronidation"} +{"genotypeId":"18_673016_C_T,T","variantId":"18_673016_C_T","genotypeAnnotationText":"Patients with the TT genotype and cancer who are treated with Capecitabine may have an increased risk of of nausea and vomiting as compared to patients with the CC or CT genotypes and a decreased likelihood of asthenia as compared to the CC genotype. Other clinical and genetic factors may also influence nausea and vomiting in patients with cancer who are treated with Capecitabine.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"capecitabine"}],"evidenceLevel":"3","genotype":"TT","literature":["28347776","28347776"],"pgxCategory":"toxicity","studyId":"1448616922","targetFromSourceId":"ENSG00000132199","variantFunctionalConsequenceId":"SO_0001624","variantRsId":"rs699517","phenotypeText":"decreased likelihood of asthenia"} +{"genotypeId":"17_5379957_A_G,G","variantId":"17_5379957_A_G","genotypeAnnotationText":"Patients with bipolar, depressive, psychotic, or schizoaffective disorders and the GG genotype who are administered amisulpride, aripiprazole, clozapine, olanzapine, quetiapine, paliperidone, risperidone, lithium, valproate or/and mirtazapine may have smaller elevations of fasting glucose concentrations as compared to patients with the AA genotype. Other clinical and genetic factors may also influence fasting glucose concentrations in patients administered these medications.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"valproic acid"}],"evidenceLevel":"3","genotype":"GG","literature":["28694205"],"pgxCategory":"other","studyId":"1449005382","targetFromSourceId":"ENSG00000108559","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs1000940","phenotypeText":"smaller elevations of fasting glucose concentrations"} +{"genotypeId":"20_54684529_G_A,G","variantId":"20_54684529_G_A","genotypeAnnotationText":"Pediatric patients with acute lymphoblastic leukemia (ALL) and the AG genotype may have an increased risk of developing osteonecrosis when treated with cyclophosphamide, cytarabine, daunorubicin, dexamethasone, doxorubicin, methotrexate, pegaspargase, prednisone, thioguanine and vincristine as compared to pediatric ALL patients with the GG genotypes and a decreased risk of osteonecrosis as compared to pediatric patients with the AA genotype. Other clinical and genetic factors may also influence the risk of developing osteonecrosis in pediatric ALL patients.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"pegaspargase"}],"evidenceLevel":"3","genotype":"AG","literature":["26590194"],"pgxCategory":"toxicity","studyId":"1448099093","targetFromSourceId":null,"variantFunctionalConsequenceId":null,"variantRsId":"rs117532069","phenotypeText":"increased risk of developing osteonecrosis"} +{"genotypeId":"8_18390208_T_A,A","variantId":"8_18390208_T_A","genotypeAnnotationText":"Patients with the AA genotype and tuberculosis (TB) may have an increased risk for anti-TB drug-induced hepatitis as compared to patients with the TT genotype. Cells with the A allele have been shown to result in decreased transcription of the NAT2 gene as compared to those with the T allele. Other genetic and clinical factors may also influence risk of hepatitis in patients taking anti-TB drugs.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"rifampin"}],"evidenceLevel":"3","genotype":"AA","literature":["19891553","19891553","19891553"],"pgxCategory":"metabolism/pk","studyId":"1447964123","targetFromSourceId":"ENSG00000156006","variantFunctionalConsequenceId":"SO_0001631","variantRsId":"rs4646244","phenotypeText":"increased risk for anti-TB drug-induced hepatitis"} +{"genotypeId":"21_45537880_T_C,T","variantId":"21_45537880_T_C","genotypeAnnotationText":"Patients with the rs1051266 CT genotype and rheumatoid arthritis may have decreased response when treated with methotrexate as compared to patients with the TT genotype. However, conflicting evidence has been reported. Other genetic and clinical factors may also influence methotrexate response.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"methotrexate"}],"evidenceLevel":"2A","genotype":"CT","literature":["19827168","15677700","22450926","15457444","18322994","17325736","17325736","31099054","26616421","27992285"],"pgxCategory":"efficacy","studyId":"1451245360","targetFromSourceId":"ENSG00000173638","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1051266","phenotypeText":"decreased response"} +{"genotypeId":"9_9687487_C_T,T","variantId":"9_9687487_C_T","genotypeAnnotationText":"Patients with the TT genotype may have higher risk for resistant hypertension in whites and Hispanics patients treated with verapamil and trandolapril as compared to patients with genotype CC. Other genetic and clinical factors may also influence the response to verapamil.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"trandolapril"}],"evidenceLevel":"3","genotype":"TT","literature":["26425837"],"pgxCategory":"efficacy","studyId":"1446902927","targetFromSourceId":"ENSG00000153707","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs4742610","phenotypeText":"higher risk for resistant hypertension"} +{"genotypeId":"12_21178615_T_C,C","variantId":"12_21178615_T_C","genotypeAnnotationText":"Patients with precursor cell lymphoblastic leukemia-lymphoma and the rs4149056 CC genotype may have a decreased response to methotrexate as compared to patients with the CT and TT genotypes. However, conflicting evidence has been reported. Other clinical and genetic factors may also influence response to methotrexate.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"methotrexate"}],"evidenceLevel":"3","genotype":"CC","literature":["24386571","28525903"],"pgxCategory":"efficacy","studyId":"1449004841","targetFromSourceId":"ENSG00000134538","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs4149056","phenotypeText":"decreased response to methotrexate"} +{"genotypeId":"X_114584047_C_T","variantId":"X_114584047_C_T","genotypeAnnotationText":"Patients with one X-chromosome, the T genotype and psychiatric disorders who are treated with olanzapine may have a decreased risk of weight gain as compared to patients with the C genotype. This gene is on the X chromosome and males have only one allele. However, some studies find no association with weight gain. Other genetic and clinical factors may also influence a patient's risk for weight gain with antipsychotic treatment.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"olanzapine"}],"evidenceLevel":"3","genotype":"T","literature":["17702092","22967772","21121776","19636338","15666332","19434072","25152019","18718676","17016522","20504252","19193342"],"pgxCategory":"toxicity","studyId":"1451256440","targetFromSourceId":"ENSG00000147246","variantFunctionalConsequenceId":"SO_0001631","variantRsId":"rs3813929","phenotypeText":"decreased risk of weight gain"} +{"genotypeId":"5_148826877_G_A,G","variantId":"5_148826877_G_A","genotypeAnnotationText":"Patients with the AG genotype and hypertension may have a greater decrease in diastolic blood pressure when treated with benazepril as compared to patients with the AA genotype. No significant results have been seen for systolic blood pressure. Additionally, the same study reported no significant differences in systolic or diastolic blood pressure between genotypes in a different cohort. Other genetic and clinical factors may also influence change in diastolic or systolic blood pressure.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"benazepril"}],"evidenceLevel":"4","genotype":"AG","literature":["15554460","15554460","15554460"],"pgxCategory":"efficacy","studyId":"1183614850","targetFromSourceId":"ENSG00000169252","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1042713","phenotypeText":"greater decrease in diastolic blood pressure"} +{"genotypeId":"16_28606193_C_C,T","variantId":"16_28606193_C_T","genotypeAnnotationText":"Patients with the CT genotype may have a decreased response to acetaminophen (paracetamol) as compared to patients with the CC genotype. Other genetic and clinical factors may also affect a patient's response to acetaminophen.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"acetaminophen"}],"evidenceLevel":"3","genotype":"CT","literature":["30908574"],"pgxCategory":"efficacy","studyId":"1450374089","targetFromSourceId":"ENSG00000196502","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1042028","phenotypeText":"decreased response to acetaminophen (paracetamol)"} +{"genotypeId":"13_46834899_G_A,A","variantId":"13_46834899_G_A","genotypeAnnotationText":"Patients with the AA genotype and major depressive disorder who are treated with antidepressants and other treatments may have a reduced response and reduced likelihood of remission as compared to patients with the AG or GG genotype. Other genetic and clinical factors may also influence a patient's response to treatment for major depressive disorder and likelihood of remission.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"antidepressants"}],"evidenceLevel":"3","genotype":"AA","literature":["11311507","18253134","18253134","20075642"],"pgxCategory":"efficacy","studyId":"1183618924","targetFromSourceId":"ENSG00000102468","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs6314","phenotypeText":"reduced response and reduced likelihood of remission"} +{"genotypeId":"16_55810697_G_G,T","variantId":"16_55810697_G_T","genotypeAnnotationText":"Patients with the GT genotype and Atrial Fibrillation who are treated with dabigatran may have 1) a decreased adjusted trough concentrations of dabigatran, 2) a decreased, but not absent, risk for bleeding when treated with dabigatran as compared to patients with the TT genotype. Other genetic and clinical factors may also influence a patient's risk for bleeding.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"dabigatran"}],"evidenceLevel":"3","genotype":"GT","literature":["23467860","23467860","27261537"],"pgxCategory":"toxicity","studyId":"1183490952","targetFromSourceId":"ENSG00000198848","variantFunctionalConsequenceId":"SO_0001627","variantRsId":"rs2244613","phenotypeText":"decreased, but not absent, risk for bleeding"} +{"genotypeId":"22_19963748_G_A,A","variantId":"22_19963748_G_A","genotypeAnnotationText":"Patients with the AA genotype with substance withdrawal syndrome may have a decreased likelihood of headache when discontinuing the use of analgesics (such as opioids, NSAIDs, triptans, ergot) as compared to patients with the AG and GG genotypes. Other clinical and genetic factors may also influence likelihood of headache in patients with withdrawal syndrome who discontinue the use of analgesics.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"sumatriptan"}],"evidenceLevel":"3","genotype":"AA","literature":["25096645"],"pgxCategory":"other","studyId":"1184987573","targetFromSourceId":"ENSG00000093010","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs4680","phenotypeText":"decreased likelihood of headache"} +{"genotypeId":"10_99804058_G_A,A","variantId":"10_99804058_G_A","genotypeAnnotationText":"Patients with the AA genotype and gastrointestinal stromal tumors may have increased progression-free survival times when treated with imatinib as compared to patients with the GG genotype. Other genetic and clinical factors may also influence progression-free survival tumes in patients receiving imatinib.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"imatinib"}],"evidenceLevel":"3","genotype":"AA","literature":["30237583"],"pgxCategory":"efficacy","studyId":"1450373604","targetFromSourceId":"ENSG00000023839","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs2273697","phenotypeText":"increased progression-free survival times"} +{"genotypeId":"6_154039662_A_G,G","variantId":"6_154039662_A_G","genotypeAnnotationText":"Patients with the rs1799971 GG genotype may have increased alfentanil dose requirements as compared to patients with the AA genotype. This drug-variant pair has been assigned a β€œno recommendation” by CPIC, as it was determined to be not clinically actionable. Other genetic or clinical factors may also affect a alfentanil dose requirements.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"alfentanil"}],"evidenceLevel":"3","genotype":"GG","literature":["19605407"],"pgxCategory":"dosage","studyId":"1450826899","targetFromSourceId":"ENSG00000112038","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1799971","phenotypeText":"increased alfentanil dose requirements"} +{"genotypeId":"14_103699416_G_A,A","variantId":"14_103699416_G_A","genotypeAnnotationText":"Patients with the AA genotype and non-small cell lung cancer may have an improved response when treated with platinum compounds as compared to patients with the GG genotype, although this is contradicted in one study. Other clinical or genetic factors may also influence a patient's response to platinum compounds in people with non-small cell lung cancer.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"Platinum compounds"}],"evidenceLevel":"3","genotype":"AA","literature":["23940523","23940523","27248474"],"pgxCategory":"efficacy","studyId":"1043872993","targetFromSourceId":"ENSG00000126215","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs861539","phenotypeText":"improved response"} +{"genotypeId":"11_67585218_A_A,G","variantId":"11_67585218_A_G","genotypeAnnotationText":"Patients with the AG genotype and Ovarian Neoplasms who are treated with cisplatin and cyclophosphamide may have a decreased likelihood of progression free survival as compared to patients with the AA genotype. However, this association was contradicted in other studies. Other genetic and clinical factors may also influence a patient's response to cisplatin and cyclophosphamide treatment.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"cyclophosphamide"}],"evidenceLevel":"3","genotype":"AG","literature":["22188361","19786980"],"pgxCategory":"efficacy","studyId":"981237950","targetFromSourceId":"ENSG00000084207","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1695","phenotypeText":"decreased likelihood of progression free survival"} +{"genotypeId":"7_87509329_A_A,G","variantId":"7_87509329_A_G","genotypeAnnotationText":"Patients with the AG genotype and schizophrenia who responded to treatment with antipsychotics may require a decreased dose of antipsychotics as compared to patients with the GG genotype, or an increased dose as compared to patients with the AA genotype. Other genetic and clinical factors may also influence dose of antipsychotics.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"antipsychotics"}],"evidenceLevel":"3","genotype":"AG","literature":["22909202"],"pgxCategory":"dosage","studyId":"1447983818","targetFromSourceId":"ENSG00000085563","variantFunctionalConsequenceId":"SO_0001819","variantRsId":"rs1045642","phenotypeText":"require a decreased dose of antipsychotics"} +{"genotypeId":"12_21178615_T_C,C","variantId":"12_21178615_T_C","genotypeAnnotationText":"Patients with the rs4149056 CC genotype may have increased concentrations of pitavastatin when treated with pitavastatin as compared to patients with TT genotype. Other genetic and clinical factors may also influence the metabolism of pitavastatin. This annotation only covers the pharmacokinetic relationship between rs4149056 and pitavastatin and does not include evidence about clinical outcomes.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"pitavastatin"}],"evidenceLevel":"1A","genotype":"CC","literature":["23556337","17460607"],"pgxCategory":"metabolism/pk","studyId":"1451678210","targetFromSourceId":"ENSG00000134538","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs4149056","phenotypeText":"increased concentrations of pitavastatin"} +{"genotypeId":"8_18400860_G_A,A","variantId":"8_18400860_G_A","genotypeAnnotationText":"Patients with the AA genotype may have decreased but not absent risk of toxicity with docetaxel and thalidomide as compared to patients with the AG or GG genotypes. Other genetic and clinical factors may also influence treatment response.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"thalidomide"}],"evidenceLevel":"3","genotype":"AA","literature":["20038957"],"pgxCategory":"toxicity","studyId":"655386176","targetFromSourceId":"ENSG00000156006","variantFunctionalConsequenceId":"SO_0001583","variantRsId":"rs1799931","phenotypeText":"decreased risk of toxicity"} +{"genotypeId":"13_46895805_G_A,A","variantId":"13_46895805_G_A","genotypeAnnotationText":"Patients with the rs6313 AA genotype and major depressive disorder may be more likely to develop sexual dysfunction and less likely to develop heart palpitations and when treated with citalopram as compared to patients with the AG or GG genotype. The current evidence base suggests that there is no association between the genotype and gastrointestinal toxicity. Other genetic and clinical factors may also influence likelihood of developing sexual dysfunction when treated with citalopram.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"citalopram"}],"evidenceLevel":"3","genotype":"AA","literature":["31792367","23158458","23158458","30221791"],"pgxCategory":"toxicity","studyId":"1451407329","targetFromSourceId":"ENSG00000102468","variantFunctionalConsequenceId":"SO_0001819","variantRsId":"rs6313","phenotypeText":"less likely to develop heart palpitations"} +{"genotypeId":"2_233772999_G_C,C","variantId":"2_233772999_G_C","genotypeAnnotationText":"Patients with the CC genotype and HIV may have a decreased risk of nephrolithiasis when treated with atazanavir and ritonavir as compared to patients with the CG and GG genotypes. Other genetic and clinical factors may also affect risk of nephrolithiasis in patients with HIV who are taking atazanavir and ritonavir.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"ritonavir"}],"evidenceLevel":"3","genotype":"CC","literature":["25151207"],"pgxCategory":"toxicity","studyId":"1185000369","targetFromSourceId":"ENSG00000244474","variantFunctionalConsequenceId":"SO_0001624","variantRsId":"rs8330","phenotypeText":"decreased risk of nephrolithiasis"} +{"genotypeId":"1_161215085_A_A,G","variantId":"1_161215085_A_G","genotypeAnnotationText":"Patients with the AG genotype and asthma may have a decreased risk for aspirin sensitivity but patients with chronic urticaria may have an increased risk for aspirin sensitivity as compared to patients with the AA genotype. Other genetic and clinical factors may also influence a patient's risk for aspirin sensitivity.","datasourceId":"pharmgkb","datasourceVersion":"2024-07-05","datatypeId":"clinical_annotation","drugs":[{"drugFromSource":"aspirin"}],"evidenceLevel":"3","genotype":"AG","literature":["18534082","18595682"],"pgxCategory":"toxicity","studyId":"1043858680","targetFromSourceId":"ENSG00000158869","variantFunctionalConsequenceId":"SO_0001631","variantRsId":"rs11587213","phenotypeText":"decreased risk for aspirin sensitivity"} diff --git a/tests/gentropy/data_samples/variant_sources/uniprot-test-sort.jsonl b/tests/gentropy/data_samples/variant_sources/uniprot-test-sort.jsonl new file mode 100644 index 000000000..c408b4fe4 --- /dev/null +++ b/tests/gentropy/data_samples/variant_sources/uniprot-test-sort.jsonl @@ -0,0 +1,9 @@ +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Pontocerebellar hypoplasia, hypotonia, and respiratory insufficiency syndrome, neonatal lethal","diseaseFromSourceId":"OMIM:618810","diseaseFromSourceMappedId":"MONDO_0032931","literature":"['31727539']","targetFromSourceId":"Q9NVI7","targetModulation":"up_or_down","variantRsId":"rs1570345942","variantFunctionalConsequenceId":"SO_0001583","variantId":"1_1525242_T_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Charcot-Marie-Tooth disease, demyelinating, 1B","diseaseFromSourceId":"OMIM:118200","diseaseFromSourceMappedId":"MONDO_0007307","literature":"['8797476', '7688964', '10737979', '11437164', '12221176', '14711881']","targetFromSourceId":"P25189","targetModulation":"up_or_down","variantRsId":"rs121913589","variantFunctionalConsequenceId":"SO_0001583","variantId":"1_161306863_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Achromatopsia 2","diseaseFromSourceId":"OMIM:216900","diseaseFromSourceMappedId":null,"literature":"['9662398', '11536077', '18521937']","targetFromSourceId":"Q16281","targetModulation":"up_or_down","variantRsId":"rs104893614","variantFunctionalConsequenceId":"SO_0001583","variantId":"2_98396018_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Brugada syndrome 1","diseaseFromSourceId":"OMIM:601144","diseaseFromSourceMappedId":"MONDO_0011001","literature":"['20129283']","targetFromSourceId":"Q14524","targetModulation":"up_or_down","variantRsId":"rs199473172","variantFunctionalConsequenceId":"SO_0001583","variantId":"3_38585800_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Ataxia telangiectasia","diseaseFromSourceId":"OMIM:208900","diseaseFromSourceMappedId":"Orphanet_100","literature":"['10817650', '10873394', '9288106', '9443866']","targetFromSourceId":"Q13315","targetModulation":"up_or_down","variantRsId":"rs587779872","variantFunctionalConsequenceId":"SO_0001583","variantId":"11_108345818_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Autoimmune polyendocrine syndrome 1, with or without reversible metaphyseal dysplasia","diseaseFromSourceId":"OMIM:240300","diseaseFromSourceMappedId":"Orphanet_3453","literature":"['11524733', '11836330', '15712268', '14974083', '11524731']","targetFromSourceId":"O43918","targetModulation":"up_or_down","variantRsId":"rs179363880","variantFunctionalConsequenceId":"SO_0001583","variantId":"21_44286656_T_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Lowe oculocerebrorenal syndrome","diseaseFromSourceId":"OMIM:309000","diseaseFromSourceMappedId":"MONDO_0010645","literature":"['10923037']","targetFromSourceId":"Q01968","targetModulation":"up_or_down","variantRsId":"rs137853854","variantFunctionalConsequenceId":"SO_0001583","variantId":"X_129562612_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"46,XY sex reversal 1","diseaseFromSourceId":"OMIM:400044","diseaseFromSourceMappedId":"MONDO_0020712","literature":"['2247149', '1570829']","targetFromSourceId":"Q05066","targetModulation":"up_or_down","variantRsId":"rs104894957","variantFunctionalConsequenceId":"SO_0001583","variantId":"Y_2787426_C_G"} +{"confidence":"medium","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Colorectal cancer","diseaseFromSourceId":"OMIM:114500","diseaseFromSourceMappedId":"MONDO_0005575","literature":"['16407113', '19218458']","targetFromSourceId":"P00395","targetModulation":"up_or_down","variantRsId":"rs281865417","variantFunctionalConsequenceId":"SO_0001583","variantId":"MT_6277_G_A"} diff --git a/tests/gentropy/data_samples/variant_sources/uniprot-test.jsonl b/tests/gentropy/data_samples/variant_sources/uniprot-test.jsonl new file mode 100644 index 000000000..f3a637b1b --- /dev/null +++ b/tests/gentropy/data_samples/variant_sources/uniprot-test.jsonl @@ -0,0 +1,50 @@ +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Brugada syndrome 1","diseaseFromSourceId":"OMIM:601144","diseaseFromSourceMappedId":"MONDO_0011001","literature":"['20129283']","targetFromSourceId":"Q14524","targetModulation":"up_or_down","variantRsId":"rs199473172","variantFunctionalConsequenceId":"SO_0001583","variantId":"3_38585800_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Lowe oculocerebrorenal syndrome","diseaseFromSourceId":"OMIM:309000","diseaseFromSourceMappedId":"MONDO_0010645","literature":"['10923037']","targetFromSourceId":"Q01968","targetModulation":"up_or_down","variantRsId":"rs137853854","variantFunctionalConsequenceId":"SO_0001583","variantId":"X_129562612_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Pontocerebellar hypoplasia, hypotonia, and respiratory insufficiency syndrome, neonatal lethal","diseaseFromSourceId":"OMIM:618810","diseaseFromSourceMappedId":"MONDO_0032931","literature":"['31727539']","targetFromSourceId":"Q9NVI7","targetModulation":"up_or_down","variantRsId":"rs1570345942","variantFunctionalConsequenceId":"SO_0001583","variantId":"1_1525242_T_G"} +{"confidence":"medium","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Colorectal cancer","diseaseFromSourceId":"OMIM:114500","diseaseFromSourceMappedId":"MONDO_0005575","literature":"['16407113', '19218458']","targetFromSourceId":"P00395","targetModulation":"up_or_down","variantRsId":"rs281865417","variantFunctionalConsequenceId":"SO_0001583","variantId":"MT_6277_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Ataxia telangiectasia","diseaseFromSourceId":"OMIM:208900","diseaseFromSourceMappedId":"Orphanet_100","literature":"['10817650', '10873394', '9288106', '9443866']","targetFromSourceId":"Q13315","targetModulation":"up_or_down","variantRsId":"rs587779872","variantFunctionalConsequenceId":"SO_0001583","variantId":"11_108345818_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Long QT syndrome 3","diseaseFromSourceId":"OMIM:603830","diseaseFromSourceMappedId":"MONDO_0011377","literature":"['10911008']","targetFromSourceId":"Q14524","targetModulation":"up_or_down","variantRsId":"rs137854605","variantFunctionalConsequenceId":"SO_0001583","variantId":"3_38581337_GA_AT"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Alzheimer disease 3","diseaseFromSourceId":"OMIM:607822","diseaseFromSourceMappedId":"MONDO_0011913","literature":"['11524469', '9384602', '12552037']","targetFromSourceId":"P49768","targetModulation":"up_or_down","variantRsId":"rs63750450","variantFunctionalConsequenceId":"SO_0001583","variantId":"14_73173571_A_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Telangiectasia, hereditary hemorrhagic, 2","diseaseFromSourceId":"OMIM:600376","diseaseFromSourceMappedId":null,"literature":"['8640225']","targetFromSourceId":"P37023","targetModulation":"up_or_down","variantRsId":"rs28936399","variantFunctionalConsequenceId":"SO_0001583","variantId":"12_51916114_T_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Cystathionine beta-synthase deficiency","diseaseFromSourceId":"OMIM:236200","diseaseFromSourceMappedId":"Orphanet_394","literature":"['16205833']","targetFromSourceId":"P35520","targetModulation":"up_or_down","variantRsId":"rs141502207","variantFunctionalConsequenceId":"SO_0001583","variantId":"21_43063045_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Autoimmune polyendocrine syndrome 1, with or without reversible metaphyseal dysplasia","diseaseFromSourceId":"OMIM:240300","diseaseFromSourceMappedId":"Orphanet_3453","literature":"['11524733', '11836330', '15712268', '14974083', '11524731']","targetFromSourceId":"O43918","targetModulation":"up_or_down","variantRsId":"rs179363880","variantFunctionalConsequenceId":"SO_0001583","variantId":"21_44286656_T_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Retinitis pigmentosa 1","diseaseFromSourceId":"OMIM:180100","diseaseFromSourceMappedId":null,"literature":"['15933747']","targetFromSourceId":"P56715","targetModulation":"up_or_down","variantRsId":"rs200135800","variantFunctionalConsequenceId":"SO_0001583","variantId":"8_54626833_A_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Meier-Gorlin syndrome 4","diseaseFromSourceId":"OMIM:613804","diseaseFromSourceMappedId":"Orphanet_2554","literature":"['21358632']","targetFromSourceId":"Q9H211","targetModulation":"up_or_down","variantRsId":"rs200672589","variantFunctionalConsequenceId":"SO_0001583","variantId":"16_88807362_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Breast cancer","diseaseFromSourceId":"OMIM:114480","diseaseFromSourceMappedId":"EFO_0003869","literature":"['15026808', '15635067']","targetFromSourceId":"P51587","targetModulation":"up_or_down","variantRsId":"rs28897754","variantFunctionalConsequenceId":"SO_0001583","variantId":"13_32379412_G_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Ceroid lipofuscinosis, neuronal, 6","diseaseFromSourceId":"OMIM:601780","diseaseFromSourceMappedId":"Orphanet_228363","literature":"['21990111']","targetFromSourceId":"Q9NWW5","targetModulation":"up_or_down","variantRsId":"rs150363441","variantFunctionalConsequenceId":"SO_0001583","variantId":"15_68208301_C_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"46,XY sex reversal 1","diseaseFromSourceId":"OMIM:400044","diseaseFromSourceMappedId":"MONDO_0020712","literature":"['2247149', '1570829']","targetFromSourceId":"Q05066","targetModulation":"up_or_down","variantRsId":"rs104894957","variantFunctionalConsequenceId":"SO_0001583","variantId":"Y_2787426_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Houge-Janssens syndrome 3","diseaseFromSourceId":"OMIM:618354","diseaseFromSourceMappedId":"MONDO_0032697","literature":"['30595372']","targetFromSourceId":"P67775","targetModulation":"up_or_down","variantRsId":"rs1580636665","variantFunctionalConsequenceId":"SO_0001583","variantId":"5_134200405_T_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Lymphatic malformation 9","diseaseFromSourceId":"OMIM:619319","diseaseFromSourceMappedId":null,"literature":"['31215153']","targetFromSourceId":"Q9NYQ6","targetModulation":"up_or_down","variantRsId":"rs369237672","variantFunctionalConsequenceId":"SO_0001583","variantId":"22_46397727_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Tyrosinemia 1","diseaseFromSourceId":"OMIM:276700","diseaseFromSourceMappedId":"Orphanet_882","literature":"['7757089']","targetFromSourceId":"P16930","targetModulation":"up_or_down","variantRsId":"rs121965077","variantFunctionalConsequenceId":"SO_0001583","variantId":"15_80181120_A_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Miyoshi muscular dystrophy 1","diseaseFromSourceId":"OMIM:254130","diseaseFromSourceMappedId":"MONDO_0024545","literature":"['16010686', '18853459']","targetFromSourceId":"O75923","targetModulation":"up_or_down","variantRsId":"rs1258728780","variantFunctionalConsequenceId":"SO_0001583","variantId":"2_71517029_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Adenine phosphoribosyltransferase deficiency","diseaseFromSourceId":"OMIM:614723","diseaseFromSourceMappedId":"MONDO_0013869","literature":"['1746557']","targetFromSourceId":"P07741","targetModulation":"up_or_down","variantRsId":"rs104894506","variantFunctionalConsequenceId":"SO_0001583","variantId":"16_88810550_T_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Developmental and epileptic encephalopathy 7","diseaseFromSourceId":"OMIM:613720","diseaseFromSourceMappedId":null,"literature":"['25818041']","targetFromSourceId":"O43526","targetModulation":"up_or_down","variantRsId":"rs796052665","variantFunctionalConsequenceId":"SO_0001059","variantId":"20_63413478_GC_TT"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Hirschsprung disease 1","diseaseFromSourceId":"OMIM:142623","diseaseFromSourceMappedId":null,"literature":"['8114939', '10618407']","targetFromSourceId":"P07949","targetModulation":"up_or_down","variantRsId":"rs76764689","variantFunctionalConsequenceId":"SO_0001583","variantId":"10_43100480_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Hirschsprung disease 1","diseaseFromSourceId":"OMIM:142623","diseaseFromSourceMappedId":null,"literature":"['22174939']","targetFromSourceId":"P07949","targetModulation":"up_or_down","variantRsId":"rs746970700","variantFunctionalConsequenceId":"SO_0001583","variantId":"10_43109201_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Macular dystrophy, vitelliform, 2","diseaseFromSourceId":"OMIM:153700","diseaseFromSourceMappedId":"MONDO_0007931","literature":"['12324875']","targetFromSourceId":"O76090","targetModulation":"up_or_down","variantRsId":"rs281865262","variantFunctionalConsequenceId":"SO_0001583","variantId":"11_61959534_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Hyperornithinemia-hyperammonemia-homocitrullinuria syndrome","diseaseFromSourceId":"OMIM:238970","diseaseFromSourceMappedId":"MONDO_0009393","literature":"['19242930']","targetFromSourceId":"Q9Y619","targetModulation":"up_or_down","variantRsId":"rs121908533","variantFunctionalConsequenceId":"SO_0001583","variantId":"13_40799111_T_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Bosma arhinia microphthalmia syndrome","diseaseFromSourceId":"OMIM:603457","diseaseFromSourceMappedId":"Orphanet_2250","literature":"['28067909']","targetFromSourceId":"A6NHR9","targetModulation":"up_or_down","variantRsId":"rs1135402741","variantFunctionalConsequenceId":"SO_0001583","variantId":"18_2688480_C_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Left ventricular non-compaction 1","diseaseFromSourceId":"OMIM:604169","diseaseFromSourceMappedId":null,"literature":"['11238270']","targetFromSourceId":"Q9Y4J8","targetModulation":"up_or_down","variantRsId":"rs104894654","variantFunctionalConsequenceId":"SO_0001583","variantId":"18_34794250_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Mismatch repair cancer syndrome 4","diseaseFromSourceId":"OMIM:619101","diseaseFromSourceMappedId":null,"literature":"['18602922', '24027009', '27435373']","targetFromSourceId":"P54278","targetModulation":"up_or_down","variantRsId":"rs587779342","variantFunctionalConsequenceId":"SO_0001583","variantId":"7_5999199_T_G"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Frontotemporal dementia and\/or amyotrophic lateral sclerosis 2","diseaseFromSourceId":"OMIM:615911","diseaseFromSourceMappedId":null,"literature":"['24934289']","targetFromSourceId":"Q8WYQ3","targetModulation":"up_or_down","variantRsId":"rs587777574","variantFunctionalConsequenceId":"SO_0001583","variantId":"22_23767459_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Congenital bilateral absence of the vas deferens","diseaseFromSourceId":"OMIM:277180","diseaseFromSourceMappedId":"MONDO_0010178","literature":"['17329263']","targetFromSourceId":"P13569","targetModulation":"up_or_down","variantRsId":"rs115545701","variantFunctionalConsequenceId":"SO_0001583","variantId":"7_117509089_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Deafness, autosomal dominant, 6","diseaseFromSourceId":"OMIM:600965","diseaseFromSourceMappedId":null,"literature":"['11709537']","targetFromSourceId":"O76024","targetModulation":"up_or_down","variantRsId":"rs104893883","variantFunctionalConsequenceId":"SO_0001583","variantId":"4_6302281_T_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Osteoporosis","diseaseFromSourceId":"OMIM:166710","diseaseFromSourceMappedId":"EFO_0003882","literature":"['23499309']","targetFromSourceId":"P04628","targetModulation":"up_or_down","variantRsId":"rs387907359","variantFunctionalConsequenceId":"SO_0001583","variantId":"12_48981230_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"MASA syndrome","diseaseFromSourceId":"OMIM:303350","diseaseFromSourceMappedId":"MONDO_0010559","literature":"['7920660', '8556302', '7920659', '22973895', '24155914']","targetFromSourceId":"P32004","targetModulation":"up_or_down","variantRsId":"rs28933683","variantFunctionalConsequenceId":"SO_0001583","variantId":"X_153870854_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Hypercholesterolemia, familial, 1","diseaseFromSourceId":"OMIM:143890","diseaseFromSourceMappedId":"MONDO_0007750","literature":"['24529145']","targetFromSourceId":"P01130","targetModulation":"up_or_down","variantRsId":"rs121908043","variantFunctionalConsequenceId":"SO_0001583","variantId":"19_11113307_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Developmental and epileptic encephalopathy 14","diseaseFromSourceId":"OMIM:614959","diseaseFromSourceMappedId":"MONDO_0013989","literature":"['26993267', '24029078']","targetFromSourceId":"Q5JUK3","targetModulation":"up_or_down","variantRsId":"rs587777264","variantFunctionalConsequenceId":"SO_0001583","variantId":"9_135759686_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Adrenal hyperplasia 3","diseaseFromSourceId":"OMIM:201910","diseaseFromSourceMappedId":"MONDO_0008728","literature":"['10364682']","targetFromSourceId":"P08686","targetModulation":"up_or_down","variantRsId":"rs72552751","variantFunctionalConsequenceId":"SO_0001583","variantId":"6_32039444_G_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"46,XY sex reversal 1","diseaseFromSourceId":"OMIM:400044","diseaseFromSourceMappedId":"MONDO_0020712","literature":"['12107262']","targetFromSourceId":"Q05066","targetModulation":"up_or_down","variantRsId":"rs104894973","variantFunctionalConsequenceId":"SO_0001583","variantId":"Y_2787224_T_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Galactosemia 1","diseaseFromSourceId":"OMIM:230400","diseaseFromSourceMappedId":"MONDO_0009258","literature":"['10408771']","targetFromSourceId":"P07902","targetModulation":"up_or_down","variantRsId":"rs111033741","variantFunctionalConsequenceId":"SO_0001583","variantId":"9_34648419_T_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Hypercholesterolemia, familial, 1","diseaseFromSourceId":"OMIM:143890","diseaseFromSourceMappedId":"EFO_0004911","literature":"['9104431']","targetFromSourceId":"P01130","targetModulation":"up_or_down","variantRsId":"rs121908033","variantFunctionalConsequenceId":"SO_0001583","variantId":"19_11105429_G_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Spastic paraplegia 79B, autosomal recessive","diseaseFromSourceId":"OMIM:615491","diseaseFromSourceMappedId":"Orphanet_352654","literature":"['28007905']","targetFromSourceId":"P09936","targetModulation":"up_or_down","variantRsId":"rs1057519600","variantFunctionalConsequenceId":"SO_0001583","variantId":"4_41268048_C_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Breast cancer","diseaseFromSourceId":"OMIM:114480","diseaseFromSourceMappedId":"EFO_0003869","literature":"['17924331', '21473589', '23867111', '14746861', '25472942']","targetFromSourceId":"P38398","targetModulation":"up_or_down","variantRsId":"rs55770810","variantFunctionalConsequenceId":"SO_0001583","variantId":"17_43063931_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Achromatopsia 2","diseaseFromSourceId":"OMIM:216900","diseaseFromSourceMappedId":null,"literature":"['9662398', '11536077', '18521937']","targetFromSourceId":"Q16281","targetModulation":"up_or_down","variantRsId":"rs104893614","variantFunctionalConsequenceId":"SO_0001583","variantId":"2_98396018_G_A"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Aicardi-Goutieres syndrome 5","diseaseFromSourceId":"OMIM:612952","diseaseFromSourceMappedId":"Orphanet_51","literature":"['24183309', '28229507', '19525956']","targetFromSourceId":"Q9Y3Z3","targetModulation":"up_or_down","variantRsId":"rs515726140","variantFunctionalConsequenceId":"SO_0001583","variantId":"20_36912462_T_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Rhizomelic chondrodysplasia punctata 1","diseaseFromSourceId":"OMIM:215100","diseaseFromSourceMappedId":"MONDO_0008972","literature":"['9090381']","targetFromSourceId":"O00628","targetModulation":"up_or_down","variantRsId":"rs121909151","variantFunctionalConsequenceId":"SO_0001583","variantId":"6_136869909_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Lysinuric protein intolerance","diseaseFromSourceId":"OMIM:222700","diseaseFromSourceMappedId":"MONDO_0009109","literature":"['17764084', '10631139', '15776427']","targetFromSourceId":"Q9UM01","targetModulation":"up_or_down","variantRsId":"rs386833799","variantFunctionalConsequenceId":"SO_0001583","variantId":"14_22774441_G_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Neurofibromatosis 1","diseaseFromSourceId":"OMIM:162200","diseaseFromSourceMappedId":"MONDO_0018975","literature":"['9003501', '15060124']","targetFromSourceId":"P21359","targetModulation":"up_or_down","variantRsId":"rs199474743","variantFunctionalConsequenceId":"SO_0001583","variantId":"17_31260403_A_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Charcot-Marie-Tooth disease, demyelinating, 1B","diseaseFromSourceId":"OMIM:118200","diseaseFromSourceMappedId":"MONDO_0007307","literature":"['8797476', '7688964', '10737979', '11437164', '12221176', '14711881']","targetFromSourceId":"P25189","targetModulation":"up_or_down","variantRsId":"rs121913589","variantFunctionalConsequenceId":"SO_0001583","variantId":"1_161306863_C_T"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Atrial septal defect 7, with or without atrioventricular conduction defects","diseaseFromSourceId":"OMIM:108900","diseaseFromSourceMappedId":"MONDO_0007173","literature":"['15810002', '14607454']","targetFromSourceId":"P52952","targetModulation":"up_or_down","variantRsId":"rs387906774","variantFunctionalConsequenceId":"SO_0001583","variantId":"5_173233164_G_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Mitochondrial infantile bilateral striatal necrosis","diseaseFromSourceId":"OMIM:500003","diseaseFromSourceMappedId":null,"literature":"['7668837', '9270604', '9501263']","targetFromSourceId":"P00846","targetModulation":"up_or_down","variantRsId":"rs199476135","variantFunctionalConsequenceId":"SO_0001583","variantId":"MT_9176_T_C"} +{"confidence":"high","datasourceId":"uniprot_variants","datatypeId":"genetic_association","diseaseFromSource":"Charcot-Marie-Tooth disease, axonal, 2K","diseaseFromSourceId":"OMIM:607831","diseaseFromSourceMappedId":"MONDO_0011916","literature":"['22206013']","targetFromSourceId":"Q8TB36","targetModulation":"up_or_down","variantRsId":"rs375431837","variantFunctionalConsequenceId":"SO_0001583","variantId":"8_74364135_G_A"} diff --git a/tests/gentropy/data_samples/vep_consequences_sample.tsv b/tests/gentropy/data_samples/vep_consequences_sample.tsv deleted file mode 100644 index 7b5de68b2..000000000 --- a/tests/gentropy/data_samples/vep_consequences_sample.tsv +++ /dev/null @@ -1,45 +0,0 @@ -Accession Term Description Display term IMPACT v2g_score eco_score -http://purl.obolibrary.org/obo/SO_0001893 transcript_ablation A feature ablation whereby the deleted region includes a transcript feature Transcript ablation HIGH 1 1 -http://identifiers.org/eco/cttv_mapping_pipeline cttv_mapping_pipeline 1 -http://purl.obolibrary.org/obo/ECO_0000205 curator_inference 1 -http://purl.obolibrary.org/obo/SO_0002165 trinucleotide_repeat_expansion 1 -http://purl.obolibrary.org/obo/SO_0001574 splice_acceptor_variant A splice variant that changes the 2 base region at the 3' end of an intron Splice acceptor variant HIGH 1 0.95 -http://purl.obolibrary.org/obo/SO_0001575 splice_donor_variant A splice variant that changes the 2 base region at the 5' end of an intron Splice donor variant HIGH 1 0.95 -http://purl.obolibrary.org/obo/SO_0001587 stop_gained A sequence variant whereby at least one base of a codon is changed, resulting in a premature stop codon, leading to a shortened transcript Stop gained HIGH 1 0.95 -http://purl.obolibrary.org/obo/SO_0001589 frameshift_variant A sequence variant which causes a disruption of the translational reading frame, because the number of nucleotides inserted or deleted is not a multiple of three Frameshift variant HIGH 1 0.95 -http://purl.obolibrary.org/obo/SO_0002012 start_lost A codon variant that changes at least one base of the canonical start codon Start lost HIGH 1 0.95 -http://purl.obolibrary.org/obo/SO_0001578 stop_lost A sequence variant where at least one base of the terminator codon (stop) is changed, resulting in an elongated transcript Stop lost HIGH 1 0.9 -http://purl.obolibrary.org/obo/SO_0001889 transcript_amplification A feature amplification of a region containing a transcript Transcript amplification HIGH 1 0.9 -http://purl.obolibrary.org/obo/SO_0001894 regulatory_region_ablation A feature ablation whereby the deleted region includes a regulatory region Regulatory region ablation MODERATE 0.66 0.9 -http://purl.obolibrary.org/obo/SO_0001583 missense_variant A sequence variant, that changes one or more bases, resulting in a different amino acid sequence but where the length is preserved Missense variant MODERATE 0.66 0.7 -http://purl.obolibrary.org/obo/SO_0001818 protein_altering_variant A sequence_variant which is predicted to change the protein encoded in the coding sequence Protein altering variant MODERATE 0.66 0.7 -http://purl.obolibrary.org/obo/SO_0001821 inframe_insertion An inframe non synonymous variant that inserts bases into in the coding sequence Inframe insertion MODERATE 0.66 0.7 -http://purl.obolibrary.org/obo/SO_0001822 inframe_deletion An inframe non synonymous variant that deletes bases from the coding sequence Inframe deletion MODERATE 0.66 0.7 -http://purl.obolibrary.org/obo/SO_0001582 initiator_codon_variant 0.7 -http://purl.obolibrary.org/obo/SO_0001630 splice_region_variant A sequence variant in which a change has occurred within the region of the splice site, either within 1-3 bases of the exon or 3-8 bases of the intron Splice region variant LOW 0.33 0.65 -http://purl.obolibrary.org/obo/SO_0001626 incomplete_terminal_codon_variant A sequence variant where at least one base of the final codon of an incompletely annotated transcript is changed Incomplete terminal codon variant LOW 0.33 0.65 -http://purl.obolibrary.org/obo/SO_0001567 stop_retained_variant A sequence variant where at least one base in the terminator codon is changed, but the terminator remains Stop retained variant LOW 0.33 0.65 -http://purl.obolibrary.org/obo/SO_0001819 synonymous_variant A sequence variant where there is no resulting change to the encoded amino acid Synonymous variant LOW 0.33 0.65 -http://purl.obolibrary.org/obo/SO_0002019 start_retained_variant A sequence variant where at least one base in the start codon is changed, but the start remains Start retained variant LOW 0.33 0.65 -http://purl.obolibrary.org/obo/SO_0001619 non_coding_transcript_variant A transcript variant of a non coding RNA gene Non coding transcript variant MODIFIER 0 0.65 -http://purl.obolibrary.org/obo/SO_0001620 mature_miRNA_variant A transcript variant located with the sequence of the mature miRNA Mature miRNA variant MODIFIER 0 0.65 -http://purl.obolibrary.org/obo/SO_0001621 NMD_transcript_variant A variant in a transcript that is the target of NMD NMD transcript variant MODIFIER 0.1 0.65 -http://purl.obolibrary.org/obo/SO_0001623 5_prime_UTR_variant A UTR variant of the 5' UTR 5 prime UTR variant MODIFIER 0.1 0.65 -http://purl.obolibrary.org/obo/SO_0001624 3_prime_UTR_variant A UTR variant of the 3' UTR 3 prime UTR variant MODIFIER 0.1 0.65 -http://purl.obolibrary.org/obo/SO_0001627 intron_variant A transcript variant occurring within an intron Intron variant MODIFIER 0.1 0.65 -http://purl.obolibrary.org/obo/SO_0001792 non_coding_transcript_exon_variant A sequence variant that changes non-coding exon sequence in a non-coding transcript Non coding transcript exon variant MODIFIER 0 0.65 -http://purl.obolibrary.org/obo/SO_0001580 coding_sequence_variant A sequence variant that changes the coding sequence Coding sequence variant MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001566 regulatory_region_variant A sequence variant located within a regulatory region Regulatory region variant MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001631 upstream_gene_variant A sequence variant located 5' of a gene Upstream gene variant MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001632 downstream_gene_variant A sequence variant located 3' of a gene Downstream gene variant MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001782 TF_binding_site_variant A sequence variant located within a transcription factor binding site TF binding site variant MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001891 regulatory_region_amplification A feature amplification of a region containing a regulatory region Regulatory region amplification MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001892 TFBS_amplification A feature amplification of a region containing a transcription factor binding site TFBS amplification MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001895 TFBS_ablation A feature ablation whereby the deleted region includes a transcription factor binding site TFBS ablation MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001906 feature_truncation A sequence variant that causes the reduction of a genomic feature, with regard to the reference sequence Feature truncation MODIFIER 0 0.6 -http://purl.obolibrary.org/obo/SO_0001907 feature_elongation A sequence variant that causes the extension of a genomic feature, with regard to the reference sequence Feature elongation MODIFIER 0 0.6 -http://targetvalidation.org/sequence/regulatory_nearest_gene_five_prime_end Regulatory nearest gene 5' end 0.6 -http://purl.obolibrary.org/obo/SO_0001628 intergenic_variant A sequence variant located in the intergenic region, between genes Intergenic variant MODIFIER 0 0.5 -http://purl.obolibrary.org/obo/SO_0001060 sequence_variant 0.5 -http://purl.obolibrary.org/obo/SO_0001825 conservative_inframe_deletion 0.5 -http://targetvalidation.org/sequence/nearest_gene_five_prime_end Nearest gene counting from 5' end 0.5 diff --git a/tests/gentropy/data_samples/vep_sample.jsonl b/tests/gentropy/data_samples/vep_sample.jsonl new file mode 100644 index 000000000..ec8ab7dbe --- /dev/null +++ b/tests/gentropy/data_samples/vep_sample.jsonl @@ -0,0 +1,4 @@ +{"most_severe_consequence":"missense_variant","input":"17\t29510931\trs2153029597\tT\tC","assembly_name":"GRCh38","transcript_consequences":[{"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000238007","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":1,"canonical":1,"impact":"MODIFIER","tssdistance":498066,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000436028","distance":494419},{"hgvsg":"17:g.29510931T>C","consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000222363","strand":1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9,"variant_allele":"C","tssdistance":122371,"transcript_id":"ENST00000410431","distance":122248,"cadd_raw":5.156509},{"cadd_raw":5.156509,"transcript_id":"ENST00000581240","distance":128696,"tssdistance":128696,"variant_allele":"C","cadd_phred":28.9,"strand":1,"impact":"MODIFIER","canonical":1,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000263370","hgvsg":"17:g.29510931T>C"},{"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000264007","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":-1,"impact":"MODIFIER","canonical":1,"tssdistance":111323,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000582367","distance":110686},{"cadd_raw":5.156509,"distance":49616,"transcript_id":"ENST00000307201","appris":"P1","tssdistance":56106,"uniparc":["UPI00001C1FC9"],"swissprot":["Q6UXT9.120"],"variant_allele":"C","cadd_phred":28.9,"mane_select":"NM_198147.3","impact":"MODIFIER","canonical":1,"strand":-1,"gene_id":"ENSG00000168792","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C"},{"strand":1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000264290","transcript_id":"ENST00000579050","distance":58649,"cadd_raw":5.156509,"variant_allele":"C","tssdistance":58649},{"strand":1,"canonical":1,"impact":"MODIFIER","cadd_phred":28.9,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000263657","transcript_id":"ENST00000577846","distance":250172,"cadd_raw":5.156509,"variant_allele":"C","tssdistance":250172},{"variant_allele":"C","swissprot":["Q6QEF8.143"],"uniparc":["UPI0000DA4C55"],"tssdistance":111981,"transcript_id":"ENST00000388767","distance":103831,"cadd_raw":5.156509,"uniprot_isoform":["Q6QEF8-5"],"hgvsg":"17:g.29510931T>C","consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000167549","strand":-1,"canonical":1,"impact":"MODIFIER","mane_select":"NM_032854.4","cadd_phred":28.9},{"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000263781","strand":-1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9,"variant_allele":"C","tssdistance":489291,"transcript_id":"ENST00000580924","distance":489291,"cadd_raw":5.156509},{"strand":1,"impact":"MODIFIER","canonical":1,"mane_select":"NM_198529.4","cadd_phred":28.9,"uniprot_isoform":["A4FU69-1"],"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000176927","appris":"P1","transcript_id":"ENST00000394835","distance":430703,"cadd_raw":5.156509,"variant_allele":"C","swissprot":["A4FU69.119"],"uniparc":["UPI0000E59EF5"],"tssdistance":430703},{"cdna_start":2399,"tssdistance":120568,"amino_acids":"L/P","swissprot":["Q7L7X3.173"],"transcript_id":"ENST00000261716","appris":"P1","consequence_terms":["missense_variant"],"trembl":["A0A024QZ70.65"],"cds_start":1643,"mane_select":"NM_020791.4","cadd_phred":28.9,"strand":1,"cds_end":1643,"impact":"MODERATE","canonical":1,"uniparc":["UPI000004A033"],"variant_allele":"C","cadd_raw":5.156509,"sift_score":0,"protein_start":548,"cdna_end":2399,"gene_id":"ENSG00000160551","uniprot_isoform":["Q7L7X3-1"],"codons":"cTg/cCg","sift_prediction":"deleterious_low_confidence","hgvsg":"17:g.29510931T>C","alphamissense":{"am_class":"likely_pathogenic","am_pathogenicity":0.9994},"protein_end":548,"polyphen_score":0.999,"polyphen_prediction":"probably_damaging"},{"uniparc":["UPI0000246D82"],"tssdistance":82201,"variant_allele":"C","swissprot":["Q86YJ7.146"],"cadd_raw":5.156509,"transcript_id":"ENST00000394859","appris":"P1","distance":82201,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000198720","uniprot_isoform":["Q86YJ7-1"],"hgvsg":"17:g.29510931T>C","trembl":["A0A024QZ29.60"],"mane_select":"NM_152345.5","cadd_phred":28.9,"strand":1,"impact":"MODIFIER","canonical":1},{"transcript_id":"ENST00000459235","distance":372075,"cadd_raw":5.156509,"variant_allele":"C","tssdistance":372075,"strand":1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000239129"},{"tssdistance":205754,"variant_allele":"C","cadd_raw":5.156509,"distance":205348,"transcript_id":"ENST00000493028","gene_id":"ENSG00000240531","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"impact":"MODIFIER","canonical":1,"strand":-1},{"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000284162","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":1,"canonical":1,"impact":"MODIFIER","tssdistance":120269,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000580425","distance":120201},{"tssdistance":49616,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000581474","distance":49616,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000264031","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":1,"canonical":1,"impact":"MODIFIER"},{"hgvsg":"17:g.29510931T>C","gene_id":"ENSG00000222858","consequence_terms":["downstream_gene_variant"],"impact":"MODIFIER","canonical":1,"strand":-1,"cadd_phred":28.9,"variant_allele":"C","tssdistance":130771,"distance":130680,"transcript_id":"ENST00000410926","cadd_raw":5.156509},{"tssdistance":461583,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000581995","distance":461583,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000264435","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":1,"canonical":1,"impact":"MODIFIER"},{"gene_id":"ENSG00000179761","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C","mane_select":"NM_016518.3","cadd_phred":28.9,"canonical":1,"impact":"MODIFIER","strand":1,"tssdistance":467790,"uniparc":["UPI00001410B0"],"swissprot":["Q9P0Z9.165"],"variant_allele":"C","cadd_raw":5.156509,"distance":453715,"appris":"P1","transcript_id":"ENST00000323372"},{"strand":-1,"canonical":1,"impact":"MODIFIER","cadd_phred":28.9,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000253064","transcript_id":"ENST00000517255","distance":86064,"cadd_raw":5.156509,"variant_allele":"C","tssdistance":86064},{"tssdistance":313146,"variant_allele":"C","cadd_raw":5.156509,"distance":313146,"transcript_id":"ENST00000580309","gene_id":"ENSG00000264050","consequence_terms":["upstream_gene_variant"],"hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"canonical":1,"impact":"MODIFIER","strand":-1},{"variant_allele":"C","tssdistance":134916,"transcript_id":"ENST00000582881","distance":133865,"cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000265625","strand":-1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9},{"hgvsg":"17:g.29510931T>C","gene_id":"ENSG00000240074","consequence_terms":["upstream_gene_variant"],"impact":"MODIFIER","canonical":1,"strand":1,"cadd_phred":28.9,"variant_allele":"C","tssdistance":344828,"distance":344828,"transcript_id":"ENST00000478775","cadd_raw":5.156509},{"cadd_phred":28.9,"canonical":1,"impact":"MODIFIER","strand":-1,"gene_id":"ENSG00000264647","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C","cadd_raw":5.156509,"distance":80772,"transcript_id":"ENST00000584986","tssdistance":81310,"variant_allele":"C"},{"variant_allele":"C","tssdistance":65531,"transcript_id":"ENST00000365335","distance":65531,"cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000202205","strand":-1,"canonical":1,"impact":"MODIFIER","cadd_phred":28.9},{"gene_id":"ENSG00000266111","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"impact":"MODIFIER","canonical":1,"strand":1,"tssdistance":158862,"variant_allele":"C","cadd_raw":5.156509,"distance":106826,"transcript_id":"ENST00000584958"},{"variant_allele":"C","tssdistance":265770,"distance":264816,"transcript_id":"ENST00000580031","cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","gene_id":"ENSG00000265713","consequence_terms":["downstream_gene_variant"],"canonical":1,"impact":"MODIFIER","strand":-1,"cadd_phred":28.9},{"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000108255","uniprot_isoform":["P05813-1"],"hgvsg":"17:g.29510931T>C","mane_select":"NM_005208.5","cadd_phred":28.9,"strand":1,"impact":"MODIFIER","canonical":1,"uniparc":["UPI00001283CF"],"tssdistance":264072,"variant_allele":"C","swissprot":["P05813.205"],"cadd_raw":5.156509,"transcript_id":"ENST00000225387","appris":"P1","distance":256437},{"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000264808","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":-1,"canonical":1,"impact":"MODIFIER","tssdistance":120702,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000685798","distance":120702},{"cadd_phred":28.9,"strand":-1,"canonical":1,"impact":"MODIFIER","consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000290082","hgvsg":"17:g.29510931T>C","cadd_raw":5.156509,"transcript_id":"ENST00000702873","distance":56892,"tssdistance":57602,"variant_allele":"C"},{"mane_select":"NM_078471.4","cadd_phred":28.9,"strand":-1,"canonical":1,"impact":"MODIFIER","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000196535","uniprot_isoform":["Q92614-1"],"hgvsg":"17:g.29510931T>C","cadd_raw":5.156509,"appris":"P4","transcript_id":"ENST00000527372","distance":330533,"uniparc":["UPI0000167F32"],"tssdistance":330533,"variant_allele":"C","swissprot":["Q92614.216"]},{"cadd_raw":5.156509,"transcript_id":"ENST00000492004","distance":170109,"tssdistance":170109,"variant_allele":"C","cadd_phred":28.9,"strand":-1,"impact":"MODIFIER","canonical":1,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000239256","hgvsg":"17:g.29510931T>C"},{"gene_id":"ENSG00000263709","consequence_terms":["downstream_gene_variant"],"hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"canonical":1,"impact":"MODIFIER","strand":1,"tssdistance":370448,"variant_allele":"C","cadd_raw":5.156509,"distance":355442,"transcript_id":"ENST00000582196"},{"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000252657","hgvsg":"17:g.29510931T>C","cadd_phred":28.9,"strand":1,"impact":"MODIFIER","canonical":1,"tssdistance":266688,"variant_allele":"C","cadd_raw":5.156509,"transcript_id":"ENST00000516848","distance":266688},{"trembl":["F5H527.88"],"mane_select":"NM_001282129.2","cadd_phred":28.9,"strand":-1,"impact":"MODIFIER","canonical":1,"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000141298","hgvsg":"17:g.29510931T>C","cadd_raw":5.156509,"transcript_id":"ENST00000540801","appris":"A1","distance":115007,"uniparc":["UPI0002065A97"],"tssdistance":419297,"variant_allele":"C"},{"tssdistance":216783,"uniparc":["UPI00001B078D"],"swissprot":["Q7Z417.159"],"variant_allele":"C","cadd_raw":5.156509,"distance":216783,"transcript_id":"ENST00000225388","appris":"P1","gene_id":"ENSG00000108256","consequence_terms":["upstream_gene_variant"],"hgvsg":"17:g.29510931T>C","uniprot_isoform":["Q7Z417-1"],"mane_select":"NM_020772.3","cadd_phred":28.9,"impact":"MODIFIER","canonical":1,"strand":-1},{"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000108262","uniprot_isoform":["Q9Y2X7-1"],"hgvsg":"17:g.29510931T>C","mane_select":"NM_014030.4","cadd_phred":28.9,"strand":-1,"impact":"MODIFIER","canonical":1,"uniparc":["UPI000013C867"],"tssdistance":78717,"variant_allele":"C","swissprot":["Q9Y2X7.219"],"cadd_raw":5.156509,"transcript_id":"ENST00000225394","appris":"A1","distance":62544},{"variant_allele":"C","tssdistance":499922,"transcript_id":"ENST00000581964","distance":499922,"cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000263613","strand":-1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9},{"variant_allele":"C","tssdistance":306457,"transcript_id":"ENST00000580812","distance":306457,"cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000178082","strand":-1,"impact":"MODIFIER","canonical":1,"cadd_phred":28.9},{"variant_allele":"C","tssdistance":352471,"distance":352471,"transcript_id":"ENST00000584258","cadd_raw":5.156509,"hgvsg":"17:g.29510931T>C","gene_id":"ENSG00000263477","consequence_terms":["upstream_gene_variant"],"canonical":1,"impact":"MODIFIER","strand":1,"cadd_phred":28.9},{"cadd_raw":5.156509,"transcript_id":"ENST00000301057","appris":"P1","distance":57770,"uniparc":["UPI000003B08D"],"tssdistance":57770,"variant_allele":"C","swissprot":["Q8NBR0.130"],"mane_select":"NM_138349.4","cadd_phred":28.9,"strand":1,"impact":"MODIFIER","canonical":1,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000167543","hgvsg":"17:g.29510931T>C"}],"allele_string":"T/C","seq_region_name":"17","strand":1,"end":29510931,"start":29510931,"colocated_variants":[{"clin_sig":["pathogenic"],"clin_sig_allele":"C:pathogenic","phenotype_or_disease":1,"strand":1,"allele_string":"T/C","start":29510931,"id":"rs2153029597","seq_region_name":"17","pubmed":[33565190],"end":29510931,"var_synonyms":{"ClinVar":["RCV001731168","VCV001300172"],"OMIM":[610266.0003]}}],"id":"rs2153029597"} +{"strand":1,"seq_region_name":"9","allele_string":"C/T","transcript_consequences":[{"hgvsg":"9:g.82445881C>T","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000228046","strand":-1,"impact":"MODIFIER","canonical":1,"cadd_phred":7.002,"variant_allele":"T","tssdistance":17856,"transcript_id":"ENST00000392516","distance":17856,"cadd_raw":0.6583},{"cadd_phred":7.002,"impact":"MODIFIER","canonical":1,"strand":1,"gene_id":"ENSG00000225085","consequence_terms":["downstream_gene_variant"],"hgvsg":"9:g.82445881C>T","cadd_raw":0.6583,"distance":39642,"transcript_id":"ENST00000436084","tssdistance":40693,"variant_allele":"T"},{"cadd_raw":0.6583,"transcript_id":"ENST00000637606","tssdistance":468267,"variant_allele":"T","cadd_phred":7.002,"canonical":1,"impact":"MODIFIER","strand":1,"gene_id":"ENSG00000290551","consequence_terms":["intron_variant","non_coding_transcript_variant"],"hgvsg":"9:g.82445881C>T"},{"gene_id":"ENSG00000278988","consequence_terms":["upstream_gene_variant"],"hgvsg":"9:g.82445881C>T","cadd_phred":7.002,"canonical":1,"impact":"MODIFIER","strand":1,"tssdistance":97837,"variant_allele":"T","cadd_raw":0.6583,"distance":97837,"transcript_id":"ENST00000623079"},{"swissprot":["Q6ZQQ2.115"],"variant_allele":"T","tssdistance":457109,"uniparc":["UPI00001C10A6"],"distance":450628,"appris":"P1","transcript_id":"ENST00000344803","cadd_raw":0.6583,"hgvsg":"9:g.82445881C>T","gene_id":"ENSG00000214929","consequence_terms":["downstream_gene_variant"],"impact":"MODIFIER","canonical":1,"strand":1,"cadd_phred":7.002,"mane_select":"NM_001001670.3"},{"cadd_phred":7.002,"impact":"MODIFIER","canonical":1,"strand":-1,"gene_id":"ENSG00000230360","consequence_terms":["upstream_gene_variant"],"hgvsg":"9:g.82445881C>T","cadd_raw":0.6583,"distance":357113,"transcript_id":"ENST00000417796","tssdistance":357113,"variant_allele":"T"},{"cadd_raw":0.6583,"transcript_id":"ENST00000422010","distance":5775,"tssdistance":5775,"variant_allele":"T","cadd_phred":7.002,"strand":1,"canonical":1,"impact":"MODIFIER","consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000232749","hgvsg":"9:g.82445881C>T"},{"tssdistance":12976,"variant_allele":"T","cadd_raw":0.6583,"transcript_id":"ENST00000438986","distance":12976,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000228123","hgvsg":"9:g.82445881C>T","cadd_phred":7.002,"strand":-1,"canonical":1,"impact":"MODIFIER"},{"tssdistance":382199,"variant_allele":"T","cadd_raw":0.6583,"transcript_id":"ENST00000434692","distance":382199,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000231649","hgvsg":"9:g.82445881C>T","cadd_phred":7.002,"strand":-1,"canonical":1,"impact":"MODIFIER"},{"tssdistance":298911,"variant_allele":"T","cadd_raw":0.6583,"transcript_id":"ENST00000432491","distance":298186,"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000233309","hgvsg":"9:g.82445881C>T","cadd_phred":7.002,"strand":-1,"canonical":1,"impact":"MODIFIER"},{"canonical":1,"impact":"MODIFIER","strand":1,"cadd_phred":7.002,"hgvsg":"9:g.82445881C>T","gene_id":"ENSG00000235377","consequence_terms":["downstream_gene_variant"],"distance":314249,"transcript_id":"ENST00000445918","cadd_raw":0.6583,"variant_allele":"T","tssdistance":315129},{"variant_allele":"T","tssdistance":17682,"distance":17588,"transcript_id":"ENST00000636401","cadd_raw":0.6583,"hgvsg":"9:g.82445881C>T","gene_id":"ENSG00000228430","consequence_terms":["downstream_gene_variant"],"impact":"MODIFIER","canonical":1,"strand":1,"cadd_phred":7.002},{"cadd_raw":0.6583,"transcript_id":"ENST00000585776","distance":468792,"tssdistance":468792,"variant_allele":"T","cadd_phred":7.002,"strand":-1,"impact":"MODIFIER","canonical":1,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000267559","hgvsg":"9:g.82445881C>T"},{"impact":"MODIFIER","canonical":1,"strand":1,"cadd_phred":7.002,"hgvsg":"9:g.82445881C>T","gene_id":"ENSG00000237770","consequence_terms":["downstream_gene_variant"],"distance":473751,"transcript_id":"ENST00000429999","cadd_raw":0.6583,"variant_allele":"T","tssdistance":479317},{"distance":166671,"transcript_id":"ENST00000661177","cadd_raw":0.6583,"variant_allele":"T","tssdistance":200703,"impact":"MODIFIER","canonical":1,"strand":-1,"cadd_phred":7.002,"hgvsg":"9:g.82445881C>T","gene_id":"ENSG00000286612","consequence_terms":["downstream_gene_variant"]},{"mane_select":"NM_207416.3","cadd_phred":7.002,"impact":"MODIFIER","canonical":1,"strand":1,"gene_id":"ENSG00000186788","consequence_terms":["downstream_gene_variant"],"hgvsg":"9:g.82445881C>T","cadd_raw":0.6583,"distance":495788,"appris":"P1","transcript_id":"ENST00000445385","tssdistance":502381,"uniparc":["UPI000048D678"],"swissprot":["P0C874.81"],"variant_allele":"T"}],"assembly_name":"GRCh38","input":"9\t82445881\t9_82445881_C_T\tC\tT","most_severe_consequence":"intron_variant","id":"9_82445881_C_T","colocated_variants":[{"phenotype_or_disease":1,"strand":1,"allele_string":"C/G/T","frequencies":{"T":{"gnomadg":0.01197,"gnomadg_amr":0.0191,"gnomadg_afr":0.003331,"gnomadg_asj":0.02364,"eas":0,"amr":0.0216,"gnomadg_eas":0,"sas":0,"gnomadg_nfe":0.01704,"gnomadg_fin":0.009992,"gnomadg_mid":0.006329,"afr":0,"gnomadg_oth":0.01772,"gnomadg_ami":0.003289,"af":0.0068,"eur":0.0189,"gnomadg_sas":0.0004142}},"start":82445881,"id":"rs117517710","seq_region_name":"9","pubmed":[31073882],"end":82445881}],"end":82445881,"start":82445881} +{"assembly_name":"GRCh38","seq_region_name":"20","id":"rs1555828246","start":10645397,"strand":1,"transcript_consequences":[{"hgvsg":"20:g.10645397C>T","canonical":1,"strand":-1,"distance":295769,"consequence_terms":["upstream_gene_variant"],"cadd_raw":4.925023,"cadd_phred":27.5,"variant_allele":"T","gene_id":"ENSG00000214835","impact":"MODIFIER","transcript_id":"ENST00000446637","tssdistance":295769},{"impact":"MODIFIER","transcript_id":"ENST00000417299","tssdistance":51552,"gene_id":"ENSG00000224961","distance":51552,"consequence_terms":["upstream_gene_variant"],"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"canonical":1,"hgvsg":"20:g.10645397C>T","strand":1},{"consequence_terms":["upstream_gene_variant"],"distance":355907,"variant_allele":"T","cadd_phred":27.5,"cadd_raw":4.925023,"strand":1,"hgvsg":"20:g.10645397C>T","canonical":1,"transcript_id":"ENST00000605338","impact":"MODIFIER","tssdistance":355907,"gene_id":"ENSG00000270777"},{"gene_id":"ENSG00000235036","transcript_id":"ENST00000456064","tssdistance":31168,"impact":"MODIFIER","canonical":1,"hgvsg":"20:g.10645397C>T","strand":-1,"distance":31168,"consequence_terms":["upstream_gene_variant"],"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023},{"hgvsg":"20:g.10645397C>T","canonical":1,"strand":-1,"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"distance":107881,"consequence_terms":["downstream_gene_variant"],"gene_id":"ENSG00000234900","transcript_id":"ENST00000418690","impact":"MODIFIER","tssdistance":119889},{"strand":1,"hgvsg":"20:g.10645397C>T","canonical":1,"cadd_raw":4.925023,"cadd_phred":27.5,"variant_allele":"T","consequence_terms":["downstream_gene_variant"],"distance":444573,"gene_id":"ENSG00000230506","transcript_id":"ENST00000662058","impact":"MODIFIER","tssdistance":472875},{"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"consequence_terms":["upstream_gene_variant"],"distance":211175,"strand":-1,"canonical":1,"hgvsg":"20:g.10645397C>T","uniparc":["UPI0000D483F7"],"mane_select":"NM_001394149.2","tssdistance":211175,"transcript_id":"ENST00000713549","impact":"MODIFIER","gene_id":"ENSG00000285508"},{"impact":"MODIFIER","transcript_id":"ENST00000666915","tssdistance":472696,"gene_id":"ENSG00000232448","consequence_terms":["downstream_gene_variant"],"distance":458657,"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"strand":1,"canonical":1,"hgvsg":"20:g.10645397C>T"},{"consequence_terms":["downstream_gene_variant"],"distance":310699,"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"strand":1,"canonical":1,"hgvsg":"20:g.10645397C>T","transcript_id":"ENST00000416198","impact":"MODIFIER","tssdistance":310978,"gene_id":"ENSG00000237005"},{"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"distance":229936,"consequence_terms":["downstream_gene_variant"],"hgvsg":"20:g.10645397C>T","canonical":1,"strand":-1,"tssdistance":263882,"transcript_id":"ENST00000448859","impact":"MODIFIER","gene_id":"ENSG00000232900"},{"impact":"MODIFIER","transcript_id":"ENST00000649912","tssdistance":211175,"appris":"P1","gene_id":"ENSG00000285723","trembl":["Q9HB66.115"],"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"distance":211175,"consequence_terms":["upstream_gene_variant"],"canonical":1,"hgvsg":"20:g.10645397C>T","strand":-1,"mane_select":"NM_001394148.2","uniparc":["UPI000006FBAA"]},{"transcript_id":"ENST00000347364","tssdistance":211175,"impact":"MODIFIER","appris":"P1","gene_id":"ENSG00000125863","cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"swissprot":["Q9NPJ1.195"],"consequence_terms":["upstream_gene_variant"],"distance":211175,"strand":-1,"canonical":1,"hgvsg":"20:g.10645397C>T","uniparc":["UPI000012F199"],"mane_select":"NM_170784.3"},{"tssdistance":4298,"transcript_id":"ENST00000615931","impact":"MODIFIER","gene_id":"ENSG00000273745","cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"distance":4239,"consequence_terms":["downstream_gene_variant"],"canonical":1,"hgvsg":"20:g.10645397C>T","strand":-1},{"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"consequence_terms":["downstream_gene_variant"],"distance":257591,"strand":1,"hgvsg":"20:g.10645397C>T","canonical":1,"impact":"MODIFIER","transcript_id":"ENST00000441308","tssdistance":259618,"gene_id":"ENSG00000230750"},{"consequence_terms":["downstream_gene_variant"],"distance":17367,"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"swissprot":["Q5VYV7.120"],"uniparc":["UPI00001D8318"],"mane_select":"NM_001009608.3","strand":1,"hgvsg":"20:g.10645397C>T","canonical":1,"appris":"P1","transcript_id":"ENST00000334534","impact":"MODIFIER","tssdistance":210092,"gene_id":"ENSG00000149346"},{"gene_id":"ENSG00000125899","transcript_id":"ENST00000659767","tssdistance":350896,"impact":"MODIFIER","hgvsg":"20:g.10645397C>T","canonical":1,"strand":1,"cadd_raw":4.925023,"cadd_phred":27.5,"variant_allele":"T","distance":350896,"consequence_terms":["upstream_gene_variant"]},{"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"distance":335492,"consequence_terms":["downstream_gene_variant"],"canonical":1,"hgvsg":"20:g.10645397C>T","strand":1,"transcript_id":"ENST00000688853","tssdistance":336975,"impact":"MODIFIER","gene_id":"ENSG00000289505"},{"appris":"P3","impact":"MODIFIER","transcript_id":"ENST00000254976","tssdistance":426567,"gene_id":"ENSG00000132639","uniprot_isoform":["P60880-1"],"distance":337979,"consequence_terms":["downstream_gene_variant"],"swissprot":["P60880.188"],"cadd_raw":4.925023,"cadd_phred":27.5,"variant_allele":"T","mane_select":"NM_130811.4","uniparc":["UPI0000001103"],"hgvsg":"20:g.10645397C>T","canonical":1,"strand":1},{"strand":1,"canonical":1,"hgvsg":"20:g.10645397C>T","consequence_terms":["upstream_gene_variant"],"distance":27531,"cadd_raw":4.925023,"variant_allele":"T","cadd_phred":27.5,"gene_id":"ENSG00000270792","transcript_id":"ENST00000605292","impact":"MODIFIER","tssdistance":27531},{"hgvsg":"20:g.10645397C>T","canonical":1,"strand":-1,"distance":276678,"consequence_terms":["upstream_gene_variant"],"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"gene_id":"ENSG00000227906","impact":"MODIFIER","transcript_id":"ENST00000421143","tssdistance":276678},{"distance":243185,"consequence_terms":["downstream_gene_variant"],"variant_allele":"T","cadd_phred":27.5,"cadd_raw":4.925023,"canonical":1,"hgvsg":"20:g.10645397C>T","strand":-1,"tssdistance":243691,"transcript_id":"ENST00000406588","impact":"MODIFIER","gene_id":"ENSG00000217809"},{"uniprot_isoform":["P78504-1"],"cdna_end":2541,"appris":"P1","transcript_id":"ENST00000254958","impact":"MODERATE","tssdistance":28602,"sift_prediction":"deleterious","codons":"tGt/tAt","uniparc":["UPI00000498B5"],"strand":-1,"canonical":1,"swissprot":["P78504.228"],"cds_start":2072,"gene_id":"ENSG00000101384","cds_end":2072,"protein_start":691,"sift_score":0,"mane_select":"NM_000214.3","hgvsg":"20:g.10645397C>T","consequence_terms":["missense_variant"],"protein_end":691,"cadd_raw":4.925023,"cadd_phred":27.5,"variant_allele":"T","cdna_start":2541,"amino_acids":"C/Y"},{"canonical":1,"hgvsg":"20:g.10645397C>T","strand":-1,"cadd_phred":27.5,"variant_allele":"T","cadd_raw":4.925023,"distance":326644,"consequence_terms":["upstream_gene_variant"],"gene_id":"ENSG00000286936","transcript_id":"ENST00000664194","tssdistance":326644,"impact":"MODIFIER"}],"input":"20\t10645397\trs1555828246\tC\tT\t.\t.\t.","allele_string":"C/T","end":10645397,"colocated_variants":[{"end":10645397,"allele_string":"C/T","strand":1,"id":"rs1555828246","seq_region_name":"20","start":10645397},{"end":10645397,"allele_string":"C/T","phenotype_or_disease":1,"clin_sig":["uncertain_significance"],"pubmed":[26076142,21752016],"strand":1,"clin_sig_allele":"T:uncertain_significance","start":10645397,"seq_region_name":"20","var_synonyms":{"ClinVar":["RCV002260566","VCV001693298"]}}],"most_severe_consequence":"missense_variant"} +{"input":"20\t10649087\trs863223652\tG\tA\t.\t.\t.","transcript_consequences":[{"strand":1,"canonical":1,"hgvsg":"20:g.10649087G>A","cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"consequence_terms":["upstream_gene_variant"],"distance":352217,"gene_id":"ENSG00000270777","transcript_id":"ENST00000605338","impact":"MODIFIER","tssdistance":352217},{"impact":"MODIFIER","transcript_id":"ENST00000417299","tssdistance":47862,"gene_id":"ENSG00000224961","cadd_raw":9.333171,"cadd_phred":40,"variant_allele":"A","distance":47862,"consequence_terms":["upstream_gene_variant"],"hgvsg":"20:g.10649087G>A","canonical":1,"strand":1},{"gene_id":"ENSG00000214835","impact":"MODIFIER","transcript_id":"ENST00000446637","tssdistance":299459,"strand":-1,"hgvsg":"20:g.10649087G>A","canonical":1,"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"consequence_terms":["upstream_gene_variant"],"distance":299459},{"transcript_id":"ENST00000456064","impact":"MODIFIER","tssdistance":34858,"gene_id":"ENSG00000235036","distance":34858,"consequence_terms":["upstream_gene_variant"],"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"canonical":1,"hgvsg":"20:g.10649087G>A","strand":-1},{"transcript_id":"ENST00000662058","tssdistance":476565,"impact":"MODIFIER","gene_id":"ENSG00000230506","consequence_terms":["downstream_gene_variant"],"distance":448263,"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"strand":1,"canonical":1,"hgvsg":"20:g.10649087G>A"},{"impact":"MODIFIER","transcript_id":"ENST00000418690","tssdistance":116199,"gene_id":"ENSG00000234900","cadd_raw":9.333171,"variant_allele":"A","cadd_phred":40,"distance":104191,"consequence_terms":["downstream_gene_variant"],"hgvsg":"20:g.10649087G>A","canonical":1,"strand":-1},{"gene_id":"ENSG00000232448","transcript_id":"ENST00000666915","tssdistance":476386,"impact":"MODIFIER","hgvsg":"20:g.10649087G>A","canonical":1,"strand":1,"cadd_raw":9.333171,"cadd_phred":40,"variant_allele":"A","distance":462347,"consequence_terms":["downstream_gene_variant"]},{"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"distance":214865,"consequence_terms":["upstream_gene_variant"],"hgvsg":"20:g.10649087G>A","canonical":1,"strand":-1,"mane_select":"NM_001394149.2","uniparc":["UPI0000D483F7"],"impact":"MODIFIER","transcript_id":"ENST00000713549","tssdistance":214865,"gene_id":"ENSG00000285508"},{"transcript_id":"ENST00000416198","impact":"MODIFIER","tssdistance":314668,"gene_id":"ENSG00000237005","consequence_terms":["downstream_gene_variant"],"distance":314389,"cadd_raw":9.333171,"cadd_phred":40,"variant_allele":"A","strand":1,"canonical":1,"hgvsg":"20:g.10649087G>A"},{"gene_id":"ENSG00000289505","tssdistance":340665,"transcript_id":"ENST00000688853","impact":"MODIFIER","hgvsg":"20:g.10649087G>A","canonical":1,"strand":1,"distance":339182,"consequence_terms":["downstream_gene_variant"],"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171},{"impact":"MODIFIER","transcript_id":"ENST00000659767","tssdistance":347206,"gene_id":"ENSG00000125899","distance":347206,"consequence_terms":["upstream_gene_variant"],"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"hgvsg":"20:g.10649087G>A","canonical":1,"strand":1},{"consequence_terms":["upstream_gene_variant"],"distance":214865,"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"swissprot":["Q9NPJ1.195"],"uniparc":["UPI000012F199"],"mane_select":"NM_170784.3","strand":-1,"hgvsg":"20:g.10649087G>A","canonical":1,"appris":"P1","transcript_id":"ENST00000347364","tssdistance":214865,"impact":"MODIFIER","gene_id":"ENSG00000125863"},{"gene_id":"ENSG00000285723","appris":"P1","tssdistance":214865,"transcript_id":"ENST00000649912","impact":"MODIFIER","mane_select":"NM_001394148.2","uniparc":["UPI000006FBAA"],"hgvsg":"20:g.10649087G>A","canonical":1,"strand":-1,"distance":214865,"consequence_terms":["upstream_gene_variant"],"trembl":["Q9HB66.115"],"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171},{"strand":-1,"hgvsg":"20:g.10649087G>A","canonical":1,"consequence_terms":["downstream_gene_variant"],"distance":549,"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"gene_id":"ENSG00000273745","impact":"MODIFIER","transcript_id":"ENST00000615931","tssdistance":608},{"consequence_terms":["downstream_gene_variant"],"distance":261281,"cadd_raw":9.333171,"variant_allele":"A","cadd_phred":40,"strand":1,"canonical":1,"hgvsg":"20:g.10649087G>A","transcript_id":"ENST00000441308","tssdistance":263308,"impact":"MODIFIER","gene_id":"ENSG00000230750"},{"strand":-1,"hgvsg":"20:g.10649087G>A","canonical":1,"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"consequence_terms":["downstream_gene_variant"],"distance":226246,"gene_id":"ENSG00000232900","transcript_id":"ENST00000448859","impact":"MODIFIER","tssdistance":260192},{"appris":"P1","transcript_id":"ENST00000334534","tssdistance":213782,"impact":"MODIFIER","gene_id":"ENSG00000149346","consequence_terms":["downstream_gene_variant"],"distance":21057,"cadd_raw":9.333171,"variant_allele":"A","cadd_phred":40,"swissprot":["Q5VYV7.120"],"uniparc":["UPI00001D8318"],"mane_select":"NM_001009608.3","strand":1,"hgvsg":"20:g.10649087G>A","canonical":1},{"consequence_terms":["downstream_gene_variant"],"distance":341669,"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"swissprot":["P60880.188"],"uniparc":["UPI0000001103"],"mane_select":"NM_130811.4","strand":1,"canonical":1,"hgvsg":"20:g.10649087G>A","appris":"P3","transcript_id":"ENST00000254976","tssdistance":430257,"impact":"MODIFIER","gene_id":"ENSG00000132639","uniprot_isoform":["P60880-1"]},{"gene_id":"ENSG00000227906","transcript_id":"ENST00000421143","impact":"MODIFIER","tssdistance":280368,"strand":-1,"canonical":1,"hgvsg":"20:g.10649087G>A","cadd_raw":9.333171,"variant_allele":"A","cadd_phred":40,"consequence_terms":["upstream_gene_variant"],"distance":280368},{"consequence_terms":["downstream_gene_variant"],"distance":239495,"cadd_phred":40,"variant_allele":"A","cadd_raw":9.333171,"strand":-1,"canonical":1,"hgvsg":"20:g.10649087G>A","transcript_id":"ENST00000406588","tssdistance":240001,"impact":"MODIFIER","gene_id":"ENSG00000217809"},{"strand":1,"hgvsg":"20:g.10649087G>A","canonical":1,"consequence_terms":["upstream_gene_variant"],"distance":23841,"variant_allele":"A","cadd_phred":40,"cadd_raw":9.333171,"gene_id":"ENSG00000270792","impact":"MODIFIER","transcript_id":"ENST00000605292","tssdistance":23841},{"gene_id":"ENSG00000286936","transcript_id":"ENST00000664194","impact":"MODIFIER","tssdistance":330334,"strand":-1,"canonical":1,"hgvsg":"20:g.10649087G>A","cadd_raw":9.333171,"cadd_phred":40,"variant_allele":"A","consequence_terms":["upstream_gene_variant"],"distance":330334},{"transcript_id":"ENST00000254958","impact":"HIGH","tssdistance":24912,"lof_info":"PERCENTILE:0.374350560568772,GERP_DIST:2349.53755103406,BP_DIST:2273,DIST_FROM_LAST_EXON:1816,50_BP_RULE:PASS,ANN_ORF:237.018,MAX_ORF:237.018","codons":"Cag/Tag","cdna_end":1838,"appris":"P1","uniprot_isoform":["P78504-1"],"swissprot":["P78504.228"],"lof":"HC","strand":-1,"canonical":1,"uniparc":["UPI00000498B5"],"cds_end":1369,"protein_start":457,"cds_start":1369,"gene_id":"ENSG00000101384","cadd_raw":9.333171,"variant_allele":"A","cadd_phred":40,"cdna_start":1838,"amino_acids":"Q/*","consequence_terms":["stop_gained"],"protein_end":457,"hgvsg":"20:g.10649087G>A","mane_select":"NM_000214.3"}],"strand":1,"colocated_variants":[{"strand":1,"start":10649087,"seq_region_name":"20","id":"rs1555828721","end":10649087,"allele_string":"G/A"},{"id":"rs863223652","var_synonyms":{"ClinVar":["RCV002383649","VCV001770992"]},"seq_region_name":"20","clin_sig_allele":"A:pathogenic","start":10649087,"strand":1,"clin_sig":["pathogenic"],"phenotype_or_disease":1,"allele_string":"G/A","end":10649087}],"most_severe_consequence":"stop_gained","allele_string":"G/A","end":10649087,"id":"rs863223652","assembly_name":"GRCh38","seq_region_name":"20","start":10649087} diff --git a/tests/gentropy/dataset/test_biosample_index.py b/tests/gentropy/dataset/test_biosample_index.py new file mode 100644 index 000000000..c647710d1 --- /dev/null +++ b/tests/gentropy/dataset/test_biosample_index.py @@ -0,0 +1,8 @@ +"""Tests on Biosample index.""" + +from gentropy.dataset.biosample_index import BiosampleIndex + + +def test_biosample_index_creation(mock_biosample_index: BiosampleIndex) -> None: + """Test biosample index creation with mock biosample index.""" + assert isinstance(mock_biosample_index, BiosampleIndex) diff --git a/tests/gentropy/dataset/test_colocalisation.py b/tests/gentropy/dataset/test_colocalisation.py index 2937efbca..c15653787 100644 --- a/tests/gentropy/dataset/test_colocalisation.py +++ b/tests/gentropy/dataset/test_colocalisation.py @@ -1,9 +1,133 @@ """Test colocalisation dataset.""" + from __future__ import annotations +from typing import TYPE_CHECKING + +import pytest + from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus + +if TYPE_CHECKING: + from pyspark.sql import SparkSession def test_colocalisation_creation(mock_colocalisation: Colocalisation) -> None: """Test colocalisation creation with mock data.""" assert isinstance(mock_colocalisation, Colocalisation) + + +def test_append_study_metadata_study_locus( + mock_colocalisation: Colocalisation, + mock_study_locus: StudyLocus, + mock_study_index: StudyIndex, + metadata_cols: list[str] | None = None, +) -> None: + """Test appending right study metadata.""" + if metadata_cols is None: + metadata_cols = ["studyType"] + expected_extra_col = ["rightStudyType", "rightStudyId"] + res_df = mock_colocalisation.append_study_metadata( + mock_study_locus, + mock_study_index, + metadata_cols=metadata_cols, + colocalisation_side="right", + ) + for col in expected_extra_col: + assert col in res_df.columns, f"Column {col} not found in result DataFrame." + + +class TestAppendStudyMetadata: + """Test Colocalisation.append_study_metadata method.""" + + @pytest.mark.parametrize( + ("colocalisation_side", "expected_geneId"), [("right", "g1"), ("left", None)] + ) + def test_append_study_metadata_right( + self: TestAppendStudyMetadata, + colocalisation_side: str, + expected_geneId: str | None, + metadata_cols: list[str] | None = None, + ) -> None: + """Test appending right study metadata.""" + if metadata_cols is None: + metadata_cols = ["geneId"] + observed_df = self.sample_colocalisation.append_study_metadata( + self.sample_study_locus, + self.sample_study_index, + metadata_cols=metadata_cols, + colocalisation_side=colocalisation_side, + ) + assert ( + observed_df.select(f"{colocalisation_side}GeneId").collect()[0][0] + == expected_geneId + ), f"Expected {colocalisation_side}GeneId {expected_geneId}, but got {observed_df.select(f'{colocalisation_side}GeneId').collect()[0][0]}" + + @pytest.fixture(autouse=True) + def _setup(self: TestAppendStudyMetadata, spark: SparkSession) -> None: + """Setup fixture.""" + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + ( + "1", + "var1", + "gwas1", + ), + ( + "2", + "var2", + "eqtl1", + ), + ], + ["studyLocusId", "variantId", "studyId"], + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_study_index = StudyIndex( + _df=spark.createDataFrame( + [("gwas1", "gwas", None, "p1"), ("eqtl1", "eqtl", "g1", "p2")], + [ + "studyId", + "studyType", + "geneId", + "projectId", + ], + ), + _schema=StudyIndex.get_schema(), + ) + self.sample_colocalisation = Colocalisation( + _df=spark.createDataFrame( + [("1", "2", "eqtl", "X", "COLOC", 1, 0.9)], + [ + "leftStudyLocusId", + "rightStudyLocusId", + "rightStudyType", + "chromosome", + "colocalisationMethod", + "numberColocalisingVariants", + "h4", + ], + ), + _schema=Colocalisation.get_schema(), + ) + + +def test_extract_maximum_coloc_probability_per_region_and_gene( + mock_colocalisation: Colocalisation, + mock_study_locus: StudyLocus, + mock_study_index: StudyIndex, + filter_by_colocalisation_method: str | None = None, +) -> None: + """Test extracting maximum coloc probability per region and gene returns a dataframe with the correct columns: studyLocusId, geneId, h4.""" + filter_by_colocalisation_method = filter_by_colocalisation_method or "Coloc" + res_df = mock_colocalisation.extract_maximum_coloc_probability_per_region_and_gene( + mock_study_locus, + mock_study_index, + filter_by_colocalisation_method=filter_by_colocalisation_method, + ) + expected_cols = ["studyLocusId", "geneId", "h4"] + for col in expected_cols: + assert col in res_df.columns, f"Column {col} not found in result DataFrame." diff --git a/tests/gentropy/dataset/test_dataset.py b/tests/gentropy/dataset/test_dataset.py index 340906322..7c61f3f52 100644 --- a/tests/gentropy/dataset/test_dataset.py +++ b/tests/gentropy/dataset/test_dataset.py @@ -1,12 +1,15 @@ """Test Dataset class.""" + from __future__ import annotations +import numpy as np import pyspark.sql.functions as f import pytest +from pyspark.sql import SparkSession +from pyspark.sql.types import DoubleType, IntegerType, StructField, StructType + from gentropy.dataset.dataset import Dataset from gentropy.dataset.study_index import StudyIndex -from pyspark.sql import SparkSession -from pyspark.sql.types import IntegerType, StructField, StructType class MockDataset(Dataset): @@ -56,3 +59,31 @@ def test_dataset_filter(mock_study_index: StudyIndex) -> None: filtered.df.select("studyType").distinct().toPandas()["studyType"].to_list()[0] == expected_filter_value ), "Filtering failed." + + +def test_dataset_drop_infinity_values() -> None: + """drop_infinity_values method shoud remove inf value from standardError field.""" + spark = SparkSession.getActiveSession() + data = [np.Infinity, -np.Infinity, np.inf, -np.inf, np.Inf, -np.Inf, 5.1] + rows = [(v,) for v in data] + schema = StructType([StructField("field", DoubleType())]) + input_df = spark.createDataFrame(rows, schema=schema) + assert input_df.count() == 7 + # run without specifying *cols results in no filtering + ds = MockDataset(_df=input_df, _schema=schema) + assert ds.drop_infinity_values().df.count() == 7 + # otherwise drop all columns + assert ds.drop_infinity_values("field").df.count() == 1 + + +def test__process_class_params(spark: SparkSession) -> None: + """Test splitting of parameters between class and spark parameters.""" + params = { + "_df": spark.createDataFrame([(1,)], schema=MockDataset.get_schema()), + "recursiveFileLookup": True, + } + class_params, spark_params = Dataset._process_class_params(params) + assert "_df" in class_params, "Class params should contain _df" + assert ( + "recursiveFileLookup" in spark_params + ), "Spark params should contain recursiveFileLookup" diff --git a/tests/gentropy/dataset/test_dataset_exclusion.py b/tests/gentropy/dataset/test_dataset_exclusion.py new file mode 100644 index 000000000..1b6fce967 --- /dev/null +++ b/tests/gentropy/dataset/test_dataset_exclusion.py @@ -0,0 +1,96 @@ +"""Test dataset validation/exclusion.""" + +from __future__ import annotations + +import pyspark.sql.functions as f +import pytest +from pyspark.sql import SparkSession + +from gentropy.dataset.study_index import StudyIndex, StudyQualityCheck + + +class TestDataExclusion: + """Testing Dataset exclusion. + + Calling `dataset.valid_rows` methods on a mock datasets to test if + the right rows are excluded. + """ + + CORRECT_FLAG = ["DUPLICATED_STUDY"] + INCORRECT_FLAG = ["UNKNOWN_CATEGORY"] + ALL_FLAGS = [member.name for member in StudyQualityCheck] + + DATASET = [ + # Good study no flag: + ("S1", None), + # Good study permissive flag: + ("S2", "This type of study is not supported"), + ("S2", "No valid disease identifier found"), + # Bad study: + ("S3", "The identifier of this study is not unique"), + ("S3", "This type of study is not supported"), + ] + + @pytest.fixture(autouse=True) + def _setup(self: TestDataExclusion, spark: SparkSession) -> None: + """Setup study the mock index for testing.""" + self.study_index = StudyIndex( + _df=( + spark.createDataFrame(self.DATASET, ["studyId", "flag"]) + .groupBy("studyId") + .agg(f.collect_list("flag").alias("qualityControls")) + .select( + "studyId", + "qualityControls", + f.lit("project1").alias("projectId"), + f.lit("gwas").alias("studyType"), + ) + ), + _schema=StudyIndex.get_schema(), + ) + + @pytest.mark.parametrize( + "filter_, expected", + [ + (CORRECT_FLAG, ["S1", "S2"]), + (ALL_FLAGS, ["S1"]), + ], + ) + def test_valid_rows( + self: TestDataExclusion, filter_: list[str], expected: list[str] + ) -> None: + """Test valid rows.""" + passing_studies = [ + study["studyId"] + for study in self.study_index.valid_rows( + filter_, invalid=False + ).df.collect() + ] + + assert passing_studies == expected + + @pytest.mark.parametrize( + "filter_, expected", + [ + (CORRECT_FLAG, ["S3"]), + (ALL_FLAGS, ["S2", "S3"]), + ], + ) + def test_invalid_rows( + self: TestDataExclusion, filter_: list[str], expected: list[str] + ) -> None: + """Test invalid rows.""" + failing_studies = [ + study["studyId"] + for study in self.study_index.valid_rows(filter_, invalid=True).df.collect() + ] + + assert failing_studies == expected + + def test_failing_quality_flag(self: TestDataExclusion) -> None: + """Test invalid quality flag.""" + with pytest.raises(ValueError): + self.study_index.valid_rows(self.INCORRECT_FLAG, invalid=True).df.collect() + + with pytest.raises(ValueError): + self.study_index.valid_rows(self.INCORRECT_FLAG, invalid=False).df.collect() diff --git a/tests/gentropy/dataset/test_gene_index.py b/tests/gentropy/dataset/test_gene_index.py index 68c279cab..e4ae8e581 100644 --- a/tests/gentropy/dataset/test_gene_index.py +++ b/tests/gentropy/dataset/test_gene_index.py @@ -1,9 +1,11 @@ """Tests on LD index.""" + from __future__ import annotations -from gentropy.dataset.gene_index import GeneIndex from pyspark.sql import DataFrame +from gentropy.dataset.gene_index import GeneIndex + def test_gene_index_creation(mock_gene_index: GeneIndex) -> None: """Test gene index creation with mock gene index.""" diff --git a/tests/gentropy/dataset/test_intervals.py b/tests/gentropy/dataset/test_intervals.py deleted file mode 100644 index bfa12ad69..000000000 --- a/tests/gentropy/dataset/test_intervals.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Tests on LD index.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -from gentropy.dataset.v2g import V2G - -if TYPE_CHECKING: - from gentropy.dataset.intervals import Intervals - from gentropy.dataset.variant_index import VariantIndex - - -def test_interval_v2g_creation( - mock_intervals: Intervals, mock_variant_index: VariantIndex -) -> None: - """Test creation of V2G from intervals.""" - assert isinstance(mock_intervals.v2g(mock_variant_index), V2G) diff --git a/tests/gentropy/dataset/test_l2g.py b/tests/gentropy/dataset/test_l2g.py index 045b98d62..293735edd 100644 --- a/tests/gentropy/dataset/test_l2g.py +++ b/tests/gentropy/dataset/test_l2g.py @@ -1,8 +1,11 @@ """Tests on L2G datasets.""" + from __future__ import annotations from typing import TYPE_CHECKING +from pyspark.sql.types import FloatType + from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.l2g_gold_standard import L2GGoldStandard from gentropy.dataset.l2g_prediction import L2GPrediction @@ -31,7 +34,7 @@ def test_process_gene_interactions(sample_otp_interactions: DataFrame) -> None: ), "Gene interactions has a different schema." -def test_predictions(mock_l2g_predictions: L2GFeatureMatrix) -> None: +def test_predictions(mock_l2g_predictions: L2GPrediction) -> None: """Test L2G predictions creation with mock data.""" assert isinstance(mock_l2g_predictions, L2GPrediction) @@ -40,44 +43,47 @@ def test_filter_unique_associations(spark: SparkSession) -> None: """Test filter_unique_associations.""" mock_l2g_gs_df = spark.createDataFrame( [ - (1, "variant1", "study1", "gene1", "positive"), + ("1", "variant1", "study1", "gene1", "positive"), ( - 2, + "2", "variant2", "study1", "gene1", "negative", ), # in the same locus as sl1 and pointing to same gene, has to be dropped ( - 3, + "3", "variant3", "study1", "gene1", "positive", ), # in diff locus as sl1 and pointing to same gene, has to be kept ( - 4, + "4", "variant4", "study1", "gene2", "positive", ), # in same locus as sl1 and pointing to diff gene, has to be kept ], - "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + "studyLocusId STRING, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", ) mock_sl_overlap_df = spark.createDataFrame( - [(1, 2, "variant2"), (1, 4, "variant4")], - "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + [ + ("1", "2", "eqtl", "CHROM1", "variant2", None), + ("1", "4", "eqtl", "CHROM1", "variant4", None), + ], + StudyLocusOverlap.get_schema(), ) expected_df = spark.createDataFrame( [ - (1, "variant1", "study1", "gene1", "positive"), - (3, "variant3", "study1", "gene1", "positive"), - (4, "variant4", "study1", "gene2", "positive"), + ("1", "variant1", "study1", "gene1", "positive"), + ("3", "variant3", "study1", "gene1", "positive"), + ("4", "variant4", "study1", "gene2", "positive"), ], - "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + "studyLocusId STRING, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", ) mock_l2g_gs = L2GGoldStandard( @@ -96,30 +102,30 @@ def test_remove_false_negatives(spark: SparkSession) -> None: """Test `remove_false_negatives`.""" mock_l2g_gs_df = spark.createDataFrame( [ - (1, "variant1", "study1", "gene1", "positive"), + ("1", "variant1", "study1", "gene1", "positive"), ( - 2, + "2", "variant2", "study1", "gene2", "negative", ), # gene2 is a partner of gene1, has to be dropped ( - 3, + "3", "variant3", "study1", "gene3", "negative", ), # gene 3 is not a partner of gene1, has to be kept ( - 4, + "4", "variant4", "study1", "gene4", "positive", ), # gene 4 is a partner of gene1, has to be kept because it's positive ], - "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + "studyLocusId STRING, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", ) mock_interactions_df = spark.createDataFrame( @@ -133,11 +139,11 @@ def test_remove_false_negatives(spark: SparkSession) -> None: expected_df = spark.createDataFrame( [ - (1, "variant1", "study1", "gene1", "positive"), - (3, "variant3", "study1", "gene3", "negative"), - (4, "variant4", "study1", "gene4", "positive"), + ("1", "variant1", "study1", "gene1", "positive"), + ("3", "variant3", "study1", "gene3", "negative"), + ("4", "variant4", "study1", "gene4", "positive"), ], - "studyLocusId LONG, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", + "studyLocusId STRING, variantId STRING, studyId STRING, geneId STRING, goldStandardSet STRING", ) mock_l2g_gs = L2GGoldStandard( @@ -151,24 +157,36 @@ def test_remove_false_negatives(spark: SparkSession) -> None: assert observed_df.collect() == expected_df.collect() -def test_calculate_feature_missingness_rate(spark: SparkSession) -> None: - """Test L2GFeatureMatrix.calculate_feature_missingness_rate.""" +def test_l2g_feature_constructor_with_schema_mismatch( + spark: SparkSession, +) -> None: + """Test if provided schema mismatch is converted to right type in the L2GFeatureMatrix constructor.""" fm = L2GFeatureMatrix( _df=spark.createDataFrame( [ - (1, "gene1", 100.0, None), - (2, "gene2", 1000.0, 0.0), + ("1", "gene1", 100.0), + ("2", "gene2", 1000.0), ], - "studyLocusId LONG, geneId STRING, distanceTssMean DOUBLE, distanceTssMinimum DOUBLE", + "studyLocusId STRING, geneId STRING, distanceTssMean DOUBLE", ), - _schema=L2GFeatureMatrix.get_schema(), + with_gold_standard=False, ) + assert ( + fm._df.schema["distanceTssMean"].dataType == FloatType() + ), "Feature `distanceTssMean` is not being casted to FloatType. Check L2GFeatureMatrix constructor." - expected_missingness = {"distanceTssMean": 0.0, "distanceTssMinimum": 1.0} - observed_missingness = fm.calculate_feature_missingness_rate() + +def test_calculate_feature_missingness_rate( + spark: SparkSession, mock_l2g_feature_matrix: L2GFeatureMatrix +) -> None: + """Test L2GFeatureMatrix.calculate_feature_missingness_rate.""" + expected_missingness = {"distanceTssMean": 0.0, "distanceSentinelTssMinimum": 1.0} + observed_missingness = mock_l2g_feature_matrix.calculate_feature_missingness_rate() assert isinstance(observed_missingness, dict) - assert len(observed_missingness) == len( - fm.features_list # type: ignore + assert mock_l2g_feature_matrix.features_list is not None and len( + observed_missingness + ) == len( + mock_l2g_feature_matrix.features_list ), "Missing features in the missingness rate dictionary." assert ( observed_missingness == expected_missingness diff --git a/tests/gentropy/dataset/test_l2g_feature.py b/tests/gentropy/dataset/test_l2g_feature.py new file mode 100644 index 000000000..0637b4a86 --- /dev/null +++ b/tests/gentropy/dataset/test_l2g_feature.py @@ -0,0 +1,1092 @@ +# pylint: disable=too-few-public-methods +# isort: skip_file + +"""Test locus-to-gene feature generation.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pyspark.sql.functions as f +import pytest +from pyspark.sql.types import ( + ArrayType, + BooleanType, + FloatType, + IntegerType, + LongType, + StringType, + StructField, + StructType, +) + +from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.l2g_features.colocalisation import ( + EQtlColocClppMaximumFeature, + EQtlColocClppMaximumNeighbourhoodFeature, + EQtlColocH4MaximumFeature, + EQtlColocH4MaximumNeighbourhoodFeature, + PQtlColocClppMaximumFeature, + PQtlColocClppMaximumNeighbourhoodFeature, + PQtlColocH4MaximumFeature, + PQtlColocH4MaximumNeighbourhoodFeature, + SQtlColocClppMaximumFeature, + SQtlColocClppMaximumNeighbourhoodFeature, + SQtlColocH4MaximumFeature, + SQtlColocH4MaximumNeighbourhoodFeature, + common_colocalisation_feature_logic, + common_neighbourhood_colocalisation_feature_logic, + extend_missing_colocalisation_to_neighbourhood_genes, +) +from gentropy.dataset.l2g_features.distance import ( + DistanceFootprintMeanFeature, + DistanceFootprintMeanNeighbourhoodFeature, + DistanceSentinelFootprintFeature, + DistanceSentinelFootprintNeighbourhoodFeature, + DistanceSentinelTssFeature, + DistanceSentinelTssNeighbourhoodFeature, + DistanceTssMeanFeature, + DistanceTssMeanNeighbourhoodFeature, + common_distance_feature_logic, + common_neighbourhood_distance_feature_logic, +) +from gentropy.dataset.l2g_features.l2g_feature import L2GFeature +from gentropy.dataset.l2g_features.vep import ( + VepMaximumFeature, + VepMaximumNeighbourhoodFeature, + VepMeanFeature, + VepMeanNeighbourhoodFeature, + common_neighbourhood_vep_feature_logic, + common_vep_feature_logic, +) +from gentropy.dataset.l2g_features.other import ( + common_genecount_feature_logic, + is_protein_coding_feature_logic, + GeneCountFeature, + ProteinGeneCountFeature, + CredibleSetConfidenceFeature, + ProteinCodingFeature, +) +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.variant_index import VariantIndex +from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +@pytest.mark.parametrize( + "feature_class", + [ + EQtlColocH4MaximumFeature, + PQtlColocH4MaximumFeature, + SQtlColocH4MaximumFeature, + EQtlColocClppMaximumFeature, + PQtlColocClppMaximumFeature, + SQtlColocClppMaximumFeature, + EQtlColocClppMaximumNeighbourhoodFeature, + PQtlColocClppMaximumNeighbourhoodFeature, + SQtlColocClppMaximumNeighbourhoodFeature, + EQtlColocH4MaximumNeighbourhoodFeature, + PQtlColocH4MaximumNeighbourhoodFeature, + SQtlColocH4MaximumNeighbourhoodFeature, + DistanceTssMeanFeature, + DistanceTssMeanNeighbourhoodFeature, + DistanceFootprintMeanFeature, + DistanceFootprintMeanNeighbourhoodFeature, + DistanceSentinelTssFeature, + DistanceSentinelTssNeighbourhoodFeature, + DistanceSentinelFootprintFeature, + DistanceSentinelFootprintNeighbourhoodFeature, + VepMaximumFeature, + VepMeanFeature, + VepMaximumNeighbourhoodFeature, + VepMeanNeighbourhoodFeature, + GeneCountFeature, + ProteinGeneCountFeature, + CredibleSetConfidenceFeature, + ProteinCodingFeature, + ], +) +def test_feature_factory_return_type( + feature_class: Any, + mock_study_locus: StudyLocus, + mock_colocalisation: Colocalisation, + mock_study_index: StudyIndex, + mock_variant_index: VariantIndex, + mock_gene_index: GeneIndex, +) -> None: + """Test that every feature factory returns a L2GFeature dataset.""" + loader = L2GFeatureInputLoader( + colocalisation=mock_colocalisation, + study_index=mock_study_index, + variant_index=mock_variant_index, + study_locus=mock_study_locus, + gene_index=mock_gene_index, + ) + feature_dataset = feature_class.compute( + study_loci_to_annotate=mock_study_locus, + feature_dependency=loader.get_dependency_by_type( + feature_class.feature_dependency_type + ), + ) + assert isinstance(feature_dataset, L2GFeature) + + +@pytest.fixture(scope="module") +def sample_gene_index(spark: SparkSession) -> GeneIndex: + """Create a sample gene index for testing.""" + return GeneIndex( + _df=spark.createDataFrame( + [ + { + "geneId": "gene1", + "biotype": "protein_coding", + "chromosome": "1", + }, + { + "geneId": "gene2", + "biotype": "lncRNA", + "chromosome": "1", + }, + { + "geneId": "gene3", + "biotype": "protein_coding", + "chromosome": "1", + }, + ], + GeneIndex.get_schema(), + ), + _schema=GeneIndex.get_schema(), + ) + + +@pytest.fixture(scope="module") +def sample_variant_index(spark: SparkSession) -> VariantIndex: + """Create a sample variant index for testing.""" + return VariantIndex( + _df=spark.createDataFrame( + [ + ( + "var1", + "chrom", + 1, + "A", + "T", + [ + { + "targetId": "gene1", + "consequenceScore": 0.66, + "isEnsemblCanonical": True, + }, + { + "targetId": "gene2", + "consequenceScore": 1.0, + "isEnsemblCanonical": True, + }, + { + "targetId": "gene3", + "consequenceScore": 0.0, + "isEnsemblCanonical": True, + }, + ], + ), + ], + schema=StructType( + [ + StructField("variantId", StringType(), True), + StructField("chromosome", StringType(), True), + StructField("position", IntegerType(), True), + StructField("referenceAllele", StringType(), True), + StructField("alternateAllele", StringType(), True), + StructField( + "transcriptConsequences", + ArrayType( + StructType( + [ + StructField("targetId", StringType(), True), + StructField( + "isEnsemblCanonical", BooleanType(), True + ), + StructField("consequenceScore", FloatType(), True), + ] + ) + ), + True, + ), + ] + ), + ), + _schema=VariantIndex.get_schema(), + ) + + +@pytest.fixture(scope="module") +def sample_variant_index_schema() -> StructType: + """Partial schema of the variant index.""" + return StructType( + [ + StructField("variantId", StringType(), True), + StructField("chromosome", StringType(), True), + StructField("position", IntegerType(), True), + StructField("referenceAllele", StringType(), True), + StructField("alternateAllele", StringType(), True), + StructField( + "transcriptConsequences", + ArrayType( + StructType( + [ + StructField("distanceFromTss", LongType(), True), + StructField("targetId", StringType(), True), + StructField("isEnsemblCanonical", BooleanType(), True), + ] + ) + ), + True, + ), + ] + ) + + +class TestCommonColocalisationFeatureLogic: + """Test the common logic of the colocalisation features.""" + + def test__common_colocalisation_feature_logic( + self: TestCommonColocalisationFeatureLogic, + spark: SparkSession, + ) -> None: + """Test the common logic of the colocalisation features. + + The test data associates studyLocusId1 with gene1 based on the colocalisation with studyLocusId2 and studyLocusId3. + The H4 value of number 2 is higher, therefore the feature value should be based on that. + """ + feature_name = "eQtlColocH4Maximum" + observed_df = common_colocalisation_feature_logic( + self.sample_study_loci_to_annotate, + self.colocalisation_method, + self.colocalisation_metric, + feature_name, + self.qtl_type, + colocalisation=self.sample_colocalisation, + study_index=self.sample_studies, + study_locus=self.sample_study_locus, + ) + expected_df = spark.createDataFrame( + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "eQtlColocH4Maximum": 0.81, + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "eQtlColocH4Maximum": 0.9, + }, + ], + ).select("studyLocusId", "geneId", "eQtlColocH4Maximum") + assert ( + observed_df.collect() == expected_df.collect() + ), "The feature values are not as expected." + + def test_extend_missing_colocalisation_to_neighbourhood_genes( + self: TestCommonColocalisationFeatureLogic, + spark: SparkSession, + sample_gene_index: GeneIndex, + sample_variant_index: VariantIndex, + ) -> None: + """Test the extend_missing_colocalisation_to_neighbourhood_genes function.""" + local_features = spark.createDataFrame( + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "eQtlColocH4Maximum": 0.81, + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "eQtlColocH4Maximum": 0.9, + }, + ], + ) + observed_df = extend_missing_colocalisation_to_neighbourhood_genes( + feature_name="eQtlColocH4Maximum", + local_features=local_features, + variant_index=sample_variant_index, + gene_index=sample_gene_index, + study_locus=self.sample_study_locus, + ).select("studyLocusId", "geneId", "eQtlColocH4Maximum") + expected_df = spark.createDataFrame( + [{"geneId": "gene3", "studyLocusId": "1", "eQtlColocH4Maximum": 0.0}] + ).select("studyLocusId", "geneId", "eQtlColocH4Maximum") + assert ( + observed_df.collect() == expected_df.collect() + ), "The feature values are not as expected." + + def test_common_neighbourhood_colocalisation_feature_logic( + self: TestCommonColocalisationFeatureLogic, + spark: SparkSession, + sample_gene_index: GeneIndex, + sample_variant_index: VariantIndex, + ) -> None: + """Test the common logic of the neighbourhood colocalisation features.""" + feature_name = "eQtlColocH4MaximumNeighbourhood" + observed_df = common_neighbourhood_colocalisation_feature_logic( + self.sample_study_loci_to_annotate, + self.colocalisation_method, + self.colocalisation_metric, + feature_name, + self.qtl_type, + colocalisation=self.sample_colocalisation, + study_index=self.sample_studies, + study_locus=self.sample_study_locus, + gene_index=sample_gene_index, + variant_index=sample_variant_index, + ).withColumn(feature_name, f.round(f.col(feature_name), 3)) + # expected average is (0.81 + 0)/2 = 0.405 + expected_df = spark.createDataFrame( + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "eQtlColocH4MaximumNeighbourhood": 0.405, # 0.81 - 0.405 + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "eQtlColocH4MaximumNeighbourhood": 0.495, # 0.9 - 0.405 + }, + ], + ).select("studyLocusId", "geneId", "eQtlColocH4MaximumNeighbourhood") + assert ( + observed_df.collect() == expected_df.collect() + ), "The expected and observed dataframes do not match." + + @pytest.fixture(autouse=True) + def _setup(self: TestCommonColocalisationFeatureLogic, spark: SparkSession) -> None: + """Set up the test variables.""" + self.colocalisation_method = "Coloc" + self.colocalisation_metric = "h4" + self.qtl_type = "eqtl" + + self.sample_study_loci_to_annotate = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "var1", + "studyId": "study1", # this is a GWAS + "chromosome": "1", + }, + ] + ), + _schema=StudyLocus.get_schema(), + ) + + self.sample_colocalisation = Colocalisation( + _df=spark.createDataFrame( + [ + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "chromosome": "1", + "colocalisationMethod": "COLOC", + "numberColocalisingVariants": 1, + "h4": 0.81, + "rightStudyType": "eqtl", + }, + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "3", # qtl linked to the same gene as studyLocusId 2 with a lower score + "chromosome": "1", + "colocalisationMethod": "COLOC", + "numberColocalisingVariants": 1, + "h4": 0.50, + "rightStudyType": "eqtl", + }, + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "4", # qtl linked to a diff gene and with the highest score + "chromosome": "1", + "colocalisationMethod": "COLOC", + "numberColocalisingVariants": 1, + "h4": 0.90, + "rightStudyType": "eqtl", + }, + ], + schema=Colocalisation.get_schema(), + ), + _schema=Colocalisation.get_schema(), + ) + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "var1", + "studyId": "study1", # this is a GWAS + "chromosome": "1", + }, + { + "studyLocusId": "2", + "variantId": "var1", + "studyId": "study2", # this is a QTL (same gene) + "chromosome": "1", + }, + { + "studyLocusId": "3", + "variantId": "var1", + "studyId": "study3", # this is another QTL (same gene) + "chromosome": "1", + }, + { + "studyLocusId": "4", + "variantId": "var1", + "studyId": "study4", # this is another QTL (diff gene) + "chromosome": "1", + }, + ] + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_studies = StudyIndex( + _df=spark.createDataFrame( + [ + { + "studyId": "study1", + "studyType": "gwas", + "geneId": None, + "traitFromSource": "trait1", + "projectId": "project1", + }, + { + "studyId": "study2", + "studyType": "eqtl", + "geneId": "gene1", + "traitFromSource": "trait2", + "projectId": "project2", + }, + { + "studyId": "study3", + "studyType": "eqtl", + "geneId": "gene1", + "traitFromSource": "trait3", + "projectId": "project3", + }, + { + "studyId": "study4", + "studyType": "eqtl", + "geneId": "gene2", + "traitFromSource": "trait4", + "projectId": "project4", + }, + ] + ), + _schema=StudyIndex.get_schema(), + ) + + +class TestCommonDistanceFeatureLogic: + """Test the CommonDistanceFeatureLogic methods.""" + + @pytest.mark.parametrize( + ("feature_name", "expected_data"), + [ + ( + "distanceSentinelTss", + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "distanceSentinelTss": 0.0, + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "distanceSentinelTss": 0.92, + }, + ], + ), + ( + "distanceTssMean", + [ + {"studyLocusId": "1", "geneId": "gene1", "distanceTssMean": 0.52}, + {"studyLocusId": "1", "geneId": "gene2", "distanceTssMean": 0.63}, + ], + ), + ], + ) + def test_common_distance_feature_logic( + self: TestCommonDistanceFeatureLogic, + spark: SparkSession, + feature_name: str, + expected_data: dict[str, Any], + ) -> None: + """Test the logic of the function that extracts features from distance. + + 2 tests: + - distanceSentinelTss: distance of the sentinel is 10, the max distance is 10. In log scale, the score is 0. + - distanceTssMean: avg distance of any variant in the credible set, weighted by its posterior. + """ + observed_df = ( + common_distance_feature_logic( + self.sample_study_locus, + variant_index=self.sample_variant_index, + feature_name=feature_name, + distance_type=self.distance_type, + genomic_window=10, + ) + .withColumn(feature_name, f.round(f.col(feature_name), 2)) + .orderBy(feature_name) + ) + expected_df = ( + spark.createDataFrame(expected_data) + .select("studyLocusId", "geneId", feature_name) + .orderBy(feature_name) + ) + assert ( + observed_df.collect() == expected_df.collect() + ), f"Expected and observed dataframes are not equal for feature {feature_name}." + + def test_common_neighbourhood_distance_feature_logic( + self: TestCommonDistanceFeatureLogic, + spark: SparkSession, + ) -> None: + """Test the logic of the function that extracts the distance between the sentinel of a credible set and the nearby genes.""" + feature_name = "distanceSentinelTssNeighbourhood" + observed_df = ( + common_neighbourhood_distance_feature_logic( + self.sample_study_locus, + variant_index=self.sample_variant_index, + feature_name=feature_name, + distance_type=self.distance_type, + genomic_window=10, + ) + .withColumn(feature_name, f.round(f.col(feature_name), 2)) + .orderBy(f.col(feature_name).asc()) + ) + expected_df = spark.createDataFrame( + (["1", "gene1", -0.44], ["1", "gene2", 0.44]), + ["studyLocusId", "geneId", feature_name], + ).orderBy(feature_name) + assert ( + observed_df.collect() == expected_df.collect() + ), "Output doesn't meet the expectation." + + @pytest.fixture(autouse=True) + def _setup( + self: TestCommonDistanceFeatureLogic, + spark: SparkSession, + sample_variant_index_schema: StructType, + ) -> None: + """Set up testing fixtures.""" + self.distance_type = "distanceFromTss" + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "lead1", + "studyId": "study1", + "locus": [ + { + "variantId": "lead1", + "posteriorProbability": 0.5, + }, + { + "variantId": "tag1", + "posteriorProbability": 0.5, + }, + ], + "chromosome": "1", + }, + ], + StudyLocus.get_schema(), + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_variant_index = VariantIndex( + _df=spark.createDataFrame( + [ + ( + "lead1", + "chrom", + 1, + "A", + "T", + [ + { + "distanceFromTss": 10, + "targetId": "gene1", + "isEnsemblCanonical": True, + }, + { + "distanceFromTss": 2, + "targetId": "gene2", + "isEnsemblCanonical": True, + }, + ], + ), + ( + "tag1", + "chrom", + 1, + "A", + "T", + [ + { + "distanceFromTss": 5, + "targetId": "gene1", + "isEnsemblCanonical": True, + }, + ], + ), + ], + sample_variant_index_schema, + ), + _schema=VariantIndex.get_schema(), + ) + + +class TestCommonVepFeatureLogic: + """Test the common_vep_feature_logic methods.""" + + @pytest.mark.parametrize( + ("feature_name", "expected_data"), + [ + ( + "vepMean", + [ + { + "studyLocusId": "1", + "geneId": "gene3", + "vepMean": "0.00", + }, + { + "studyLocusId": "1", + "geneId": "gene1", + "vepMean": "0.33", + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "vepMean": "0.50", + }, + ], + ), + ( + "vepMaximum", + [ + { + "studyLocusId": "1", + "geneId": "gene3", + "vepMaximum": "0.00", + }, + { + "studyLocusId": "1", + "geneId": "gene1", + "vepMaximum": "0.66", + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "vepMaximum": "1.00", + }, + ], + ), + ], + ) + def test_common_vep_feature_logic( + self: TestCommonVepFeatureLogic, + spark: SparkSession, + feature_name: str, + expected_data: dict[str, Any], + sample_variant_index: VariantIndex, + ) -> None: + """Test the logic of the function that extracts features from VEP's functional consequences.""" + observed_df = ( + common_vep_feature_logic( + self.sample_study_locus, + variant_index=sample_variant_index, + feature_name=feature_name, + ) + .orderBy(feature_name) + .withColumn( + feature_name, f.format_number(f.round(f.col(feature_name), 2), 2) + ) + ) + expected_df = ( + spark.createDataFrame(expected_data) + .orderBy(feature_name) + .select("studyLocusId", "geneId", feature_name) + ) + assert ( + observed_df.collect() == expected_df.collect() + ), f"Expected and observed dataframes are not equal for feature {feature_name}." + + def test_common_neighbourhood_vep_feature_logic_no_protein_coding( + self: TestCommonVepFeatureLogic, + spark: SparkSession, + sample_gene_index: GeneIndex, + sample_variant_index: VariantIndex, + ) -> None: + """Test the logic of the function that extracts the maximum severity score for a gene given the average of the maximum scores for all protein coding genes in the vicinity. + + Because the genes in the vicinity are all non coding, the neighbourhood features should equal the local ones. + """ + feature_name = "vepMaximumNeighbourhood" + non_protein_coding_gene_index = GeneIndex( + _df=sample_gene_index.df.filter(f.col("geneId") != "gene3"), + _schema=GeneIndex.get_schema(), + ) + observed_df = ( + common_neighbourhood_vep_feature_logic( + self.sample_study_locus, + variant_index=sample_variant_index, + gene_index=non_protein_coding_gene_index, + feature_name=feature_name, + ) + .withColumn(feature_name, f.round(f.col(feature_name), 2)) + .orderBy(f.col(feature_name).asc()) + .select("studyLocusId", "geneId", feature_name) + ) + expected_df = ( + spark.createDataFrame( + # regional mean is 0.66 + ( + ["1", "gene1", 0.0], + ["1", "gene2", 0.34], + ), # (0.66-0.66) and (1.0-0.66) + ["studyLocusId", "geneId", feature_name], + ) + .orderBy(feature_name) + .select("studyLocusId", "geneId", feature_name) + ) + assert ( + observed_df.collect() == expected_df.collect() + ), "Output doesn't meet the expectation." + + def test_common_neighbourhood_vep_feature_logic( + self: TestCommonVepFeatureLogic, + spark: SparkSession, + sample_gene_index: GeneIndex, + sample_variant_index: VariantIndex, + ) -> None: + """Test the logic of the function that extracts the maximum severity score for a gene given the average of the maximum scores for all protein coding genes in the vicinity.""" + feature_name = "vepMaximumNeighbourhood" + observed_df = ( + common_neighbourhood_vep_feature_logic( + self.sample_study_locus, + variant_index=sample_variant_index, + gene_index=sample_gene_index, + feature_name=feature_name, + ) + .withColumn(feature_name, f.round(f.col(feature_name), 2)) + .orderBy(f.col(feature_name).asc()) + ) + expected_df = ( + spark.createDataFrame( + # regional mean is 0.66/2 = 0.33 + ( + ["1", "gene3", -0.33], + ["1", "gene1", 0.33], + ["1", "gene2", 0.67], + ), # (0 - 0.33) and (0.66-0.33) and (1.0 -0.33) + ["studyLocusId", "geneId", feature_name], + ) + .orderBy(feature_name) + .select("studyLocusId", "geneId", feature_name) + ) + assert ( + observed_df.collect() == expected_df.collect() + ), "Output doesn't meet the expectation." + + @pytest.fixture(autouse=True) + def _setup(self: TestCommonVepFeatureLogic, spark: SparkSession) -> None: + """Set up testing fixtures.""" + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "var1", + "studyId": "study1", + "locus": [ + { + "variantId": "var1", + "posteriorProbability": 0.5, + }, + ], + "chromosome": "1", + }, + ], + StudyLocus.get_schema(), + ), + _schema=StudyLocus.get_schema(), + ) + + +class TestCommonGeneCountFeatureLogic: + """Test the CommonGeneCountFeatureLogic methods.""" + + @pytest.mark.parametrize( + ("feature_name", "expected_data", "protein_coding_only"), + [ + ( + "geneCount", + [ + {"studyLocusId": "1", "geneId": "gene1", "geneCount": 3}, + {"studyLocusId": "1", "geneId": "gene2", "geneCount": 3}, + {"studyLocusId": "1", "geneId": "gene3", "geneCount": 3}, + ], + False, # Test case for all genes + ), + ( + "geneCountProteinCoding", + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "geneCountProteinCoding": 2, + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "geneCountProteinCoding": 2, + }, + ], + True, # Test case for protein-coding genes only + ), + ], + ) + def test_common_genecount_feature_logic( + self: TestCommonGeneCountFeatureLogic, + spark: SparkSession, + feature_name: str, + expected_data: list[dict[str, Any]], + protein_coding_only: bool, + ) -> None: + """Test the common logic of the gene count features.""" + observed_df = common_genecount_feature_logic( + study_loci_to_annotate=self.sample_study_locus, + gene_index=self.sample_gene_index, + feature_name=feature_name, + genomic_window=500000, + protein_coding_only=protein_coding_only, + ).orderBy("studyLocusId", "geneId") + expected_df = ( + spark.createDataFrame(expected_data) + .select("studyLocusId", "geneId", feature_name) + .orderBy("studyLocusId", "geneId") + ) + + assert ( + observed_df.collect() == expected_df.collect() + ), f"Expected and observed dataframes do not match for feature {feature_name}." + + @pytest.fixture(autouse=True) + def _setup(self: TestCommonGeneCountFeatureLogic, spark: SparkSession) -> None: + """Set up testing fixtures.""" + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "var1", + "studyId": "study1", + "chromosome": "1", + "position": 1000000, + }, + ], + StudyLocus.get_schema(), + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_gene_index = GeneIndex( + _df=spark.createDataFrame( + [ + { + "geneId": "gene1", + "chromosome": "1", + "tss": 950000, + "biotype": "protein_coding", + }, + { + "geneId": "gene2", + "chromosome": "1", + "tss": 1050000, + "biotype": "protein_coding", + }, + { + "geneId": "gene3", + "chromosome": "1", + "tss": 1010000, + "biotype": "non_coding", + }, + ], + GeneIndex.get_schema(), + ), + _schema=GeneIndex.get_schema(), + ) + + +class TestCommonProteinCodingFeatureLogic: + """Test the CommonGeneCountFeatureLogic methods.""" + + @pytest.mark.parametrize( + ("expected_data"), + [ + ( + [ + {"studyLocusId": "1", "geneId": "gene1", "isProteinCoding500kb": 1}, + {"studyLocusId": "1", "geneId": "gene2", "isProteinCoding500kb": 1}, + {"studyLocusId": "1", "geneId": "gene3", "isProteinCoding500kb": 0}, + ] + ), + ], + ) + def test_is_protein_coding_feature_logic( + self: TestCommonProteinCodingFeatureLogic, + spark: SparkSession, + expected_data: list[dict[str, Any]], + ) -> None: + """Test the logic of the is_protein_coding_feature_logic function.""" + observed_df = ( + is_protein_coding_feature_logic( + study_loci_to_annotate=self.sample_study_locus, + gene_index=self.sample_gene_index, + feature_name="isProteinCoding500kb", + genomic_window=500000, + ) + .select("studyLocusId", "geneId", "isProteinCoding500kb") + .orderBy("studyLocusId", "geneId") + ) + + expected_df = ( + spark.createDataFrame(expected_data) + .select("studyLocusId", "geneId", "isProteinCoding500kb") + .orderBy("studyLocusId", "geneId") + ) + assert ( + observed_df.collect() == expected_df.collect() + ), "Expected and observed DataFrames do not match." + + @pytest.fixture(autouse=True) + def _setup(self: TestCommonProteinCodingFeatureLogic, spark: SparkSession) -> None: + """Set up sample data for the test.""" + # Sample study locus data + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "var1", + "studyId": "study1", + "chromosome": "1", + "position": 1000000, + }, + ], + StudyLocus.get_schema(), + ), + _schema=StudyLocus.get_schema(), + ) + + # Sample gene index data with biotype + self.sample_gene_index = GeneIndex( + _df=spark.createDataFrame( + [ + { + "geneId": "gene1", + "chromosome": "1", + "tss": 950000, + "biotype": "protein_coding", + }, + { + "geneId": "gene2", + "chromosome": "1", + "tss": 1050000, + "biotype": "protein_coding", + }, + { + "geneId": "gene3", + "chromosome": "1", + "tss": 1010000, + "biotype": "non_coding", + }, + ], + GeneIndex.get_schema(), + ), + _schema=GeneIndex.get_schema(), + ) + + +class TestCredibleSetConfidenceFeatureLogic: + """Test the CredibleSetConfidenceFeature method.""" + + def test_compute( + self: TestCredibleSetConfidenceFeatureLogic, + spark: SparkSession, + ) -> None: + """Test the logic of the function that scores a credible set's confidence.""" + sample_study_loci_to_annotate = self.sample_study_locus + observed_df = CredibleSetConfidenceFeature.compute( + study_loci_to_annotate=sample_study_loci_to_annotate, + feature_dependency={ + "study_locus": self.sample_study_locus, + "variant_index": self.sample_variant_index, + }, + ) + assert observed_df.df.first()["featureValue"] == 0.25 + + @pytest.fixture(autouse=True) + def _setup( + self: TestCredibleSetConfidenceFeatureLogic, + spark: SparkSession, + sample_variant_index_schema: StructType, + ) -> None: + """Set up testing fixtures.""" + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "lead1", + "studyId": "study1", + "confidence": "PICS fine-mapped credible set based on reported top hit", + "chromosome": "1", + "locus": [ + { + "variantId": "lead1", + }, + ], + }, + ], + StudyLocus.get_schema(), + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_variant_index = VariantIndex( + _df=spark.createDataFrame( + [ + ( + "lead1", + "chrom", + 1, + "A", + "T", + [ + { + "distanceFromTss": 10, + "targetId": "gene1", + "isEnsemblCanonical": True, + }, + ], + ) + ], + sample_variant_index_schema, + ), + _schema=VariantIndex.get_schema(), + ) diff --git a/tests/gentropy/dataset/test_l2g_feature_matrix.py b/tests/gentropy/dataset/test_l2g_feature_matrix.py new file mode 100644 index 000000000..4fe338254 --- /dev/null +++ b/tests/gentropy/dataset/test_l2g_feature_matrix.py @@ -0,0 +1,243 @@ +"""Test L2G feature matrix methods.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pytest +from pyspark.sql.types import ( + ArrayType, + DoubleType, + IntegerType, + StringType, + StructField, + StructType, +) + +from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix +from gentropy.dataset.l2g_gold_standard import L2GGoldStandard +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus +from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +def test_select_features_inheritance( + spark: SparkSession, mock_l2g_feature_matrix: L2GFeatureMatrix +) -> None: + """Test L2GFeatureMatrix.select_features method inherits the instance attributes in the new instance.""" + new_instance = mock_l2g_feature_matrix.select_features( + features_list=["distanceTssMean"] + ) + assert new_instance.features_list == ["distanceTssMean"] + # Because the feature matrix contains the gold standard flag information, the new fixed colums should be the same + assert "goldStandardSet" in new_instance.fixed_cols + + +class TestFromFeaturesList: + """Test L2GFeatureMatrix.from_features_list method. + + If the columns from the features list are there, it means that the business logic is working (the dataframe is not empty when converting from long to wide). + """ + + def test_study_locus( + self: TestFromFeaturesList, + ) -> None: + """Test building feature matrix for a SL with the eQtlColocH4Maximum feature.""" + features_list = ["eQtlColocH4Maximum", "geneCount500kb"] + loader = L2GFeatureInputLoader( + colocalisation=self.sample_colocalisation, + study_index=self.sample_study_index, + study_locus=self.sample_study_locus, + gene_index=self.sample_gene_index, + ) + fm = L2GFeatureMatrix.from_features_list( + self.sample_study_locus, features_list, loader + ) + for feature in features_list: + assert ( + feature in fm._df.columns + ), f"Feature {feature} not found in feature matrix." + + def test_gold_standard( + self: TestFromFeaturesList, + ) -> None: + """Test building feature matrix for a gold standard with the eQtlColocH4Maximum feature.""" + features_list = ["eQtlColocH4Maximum"] + loader = L2GFeatureInputLoader( + colocalisation=self.sample_colocalisation, + study_index=self.sample_study_index, + study_locus=self.sample_study_locus, + ) + fm = L2GFeatureMatrix.from_features_list( + self.sample_gold_standard, features_list, loader + ) + for feature in features_list: + assert ( + feature in fm._df.columns + ), f"Feature {feature} not found in feature matrix." + + @pytest.fixture(autouse=True) + def _setup(self: TestFromFeaturesList, spark: SparkSession) -> None: + """Setup fixture.""" + self.sample_gold_standard = L2GGoldStandard( + _df=spark.createDataFrame( + [(1, "var1", "gwas1", "g1", "positive", ["a_source"])], + L2GGoldStandard.get_schema(), + ), + _schema=L2GGoldStandard.get_schema(), + ) + self.sample_study_locus = StudyLocus( + _df=spark.createDataFrame( + [ + ( + "1", + "var1", + "gwas1", + "X", + 2, + [ + {"variantId": "var1", "posteriorProbability": 0.8}, + {"variantId": "var12", "posteriorProbability": 0.2}, + ], + ), + ( + "2", + "var2", + "eqtl1", + "X", + 10, + [ + {"variantId": "var2", "posteriorProbability": 1.0}, + ], + ), + ], + schema=StructType( + [ + StructField("studyLocusId", StringType(), True), + StructField("variantId", StringType(), True), + StructField("studyId", StringType(), True), + StructField("chromosome", StringType(), True), + StructField("position", IntegerType(), True), + StructField( + "locus", + ArrayType( + StructType( + [ + StructField("variantId", StringType(), True), + StructField( + "posteriorProbability", DoubleType(), True + ), + ] + ) + ), + True, + ), + ] + ), + ), + _schema=StudyLocus.get_schema(), + ) + self.sample_study_index = StudyIndex( + _df=spark.createDataFrame( + [("gwas1", "gwas", None, "p1"), ("eqtl1", "eqtl", "g1", "p2")], + [ + "studyId", + "studyType", + "geneId", + "projectId", + ], + ), + _schema=StudyIndex.get_schema(), + ) + self.sample_colocalisation = Colocalisation( + _df=spark.createDataFrame( + [("1", "2", "eqtl", "X", "COLOC", 1, 0.9)], + [ + "leftStudyLocusId", + "rightStudyLocusId", + "rightStudyType", + "chromosome", + "colocalisationMethod", + "numberColocalisingVariants", + "h4", + ], + ), + _schema=Colocalisation.get_schema(), + ) + self.sample_gene_index = GeneIndex( + _df=spark.createDataFrame( + [ + ("g1", "X", "protein_coding", 200), + ("g2", "X", "protein_coding", 300), + ], + [ + "geneId", + "chromosome", + "biotype", + "tss", + ], + ), + _schema=GeneIndex.get_schema(), + ) + + +def test_fill_na(spark: SparkSession) -> None: + """Tests L2GFeatureMatrix.fill_na, particularly the imputation logic.""" + sample_fm = L2GFeatureMatrix( + _df=spark.createDataFrame( + [ + { + "studyLocusId": "1", + "geneId": "gene1", + "proteinGeneCount500kb": 3.0, + "geneCount500kb": 8.0, + "isProteinCoding": 1.0, + "anotherFeature": None, + }, + { + "studyLocusId": "1", + "geneId": "gene2", + "proteinGeneCount500kb": 4.0, + "geneCount500kb": 10.0, + "isProteinCoding": 1.0, + "anotherFeature": None, + }, + { + "studyLocusId": "1", + "geneId": "gene3", + "proteinGeneCount500kb": None, + "geneCount500kb": None, + "isProteinCoding": None, + "anotherFeature": None, + }, + ], + schema="studyLocusId STRING, geneId STRING, proteinGeneCount500kb DOUBLE, geneCount500kb DOUBLE, isProteinCoding DOUBLE, anotherFeature DOUBLE", + ), + ) + observed_df = sample_fm.fill_na()._df.filter(f.col("geneId") == "gene3") + expected_df_missing_row = spark.createDataFrame( + [ + { + "studyLocusId": "1", + "geneId": "gene3", + "proteinGeneCount500kb": 3.5, + "geneCount500kb": 9.0, + "isProteinCoding": 0.0, + "anotherFeature": 0.0, + }, + ], + ).select( + "studyLocusId", + "geneId", + "proteinGeneCount500kb", + "geneCount500kb", + "isProteinCoding", + "anotherFeature", + ) + assert observed_df.collect() == expected_df_missing_row.collect() diff --git a/tests/gentropy/dataset/test_ld_index.py b/tests/gentropy/dataset/test_ld_index.py index c3eff6a4d..dc2b49c09 100644 --- a/tests/gentropy/dataset/test_ld_index.py +++ b/tests/gentropy/dataset/test_ld_index.py @@ -1,4 +1,5 @@ """Tests on LD index.""" + from __future__ import annotations from gentropy.dataset.ld_index import LDIndex diff --git a/tests/gentropy/dataset/test_pairwise_ld.py b/tests/gentropy/dataset/test_pairwise_ld.py new file mode 100644 index 000000000..9a57c129b --- /dev/null +++ b/tests/gentropy/dataset/test_pairwise_ld.py @@ -0,0 +1,103 @@ +"""Testing pairwise LD dataset.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +import pytest +from pyspark.sql import functions as f +from pyspark.sql.window import Window + +from gentropy.dataset.pairwise_ld import PairwiseLD + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +class TestPairwiseLD: + """Test suit for pairwise LD dataset and associated methods.""" + + variants = [ + "1_8_A_C", + "1_9_A_C", + "1_10_A_C", + "1_99_A_C", + ] + + @pytest.fixture(scope="class") + def mock_pairwise_ld(self: TestPairwiseLD, spark: SparkSession) -> PairwiseLD: + """Generate a mock pairwise LD dataset. + + Args: + spark (SparkSession): _description_ + + Returns: + PairwiseLD: _description_ + """ + spark = spark.builder.getOrCreate() + + data = [(v1, v2) for v1 in self.variants for v2 in self.variants] + return PairwiseLD( + _df=( + spark.createDataFrame(data, ["variantIdI", "variantIdJ"]) + .withColumn( + "r", + f.row_number() + .over(Window.partitionBy(f.lit("x")).orderBy("variantIdI")) + .cast("double"), + ) + .withColumn( + "r", + f.when(f.col("variantIdI") == f.col("variantIdJ"), 1.0).otherwise( + f.col("r") + ), + ) + .persist() + ), + _schema=PairwiseLD.get_schema(), + ) + + @staticmethod + def test_pairwise_ld__type(mock_pairwise_ld: PairwiseLD) -> None: + """Testing type.""" + assert isinstance(mock_pairwise_ld, PairwiseLD) + + def test_pariwise_ld__get_variants( + self: TestPairwiseLD, mock_pairwise_ld: PairwiseLD + ) -> None: + """Testing function that returns list of variants from the LD table. + + Args: + mock_pairwise_ld (PairwiseLD): _description_ + """ + variant_set_expected = set(self.variants) + variant_set_from_data = set(mock_pairwise_ld.get_variant_list()) + + assert variant_set_from_data == variant_set_expected + + def test_pairwise_ld__r_to_numpy_matrix__type( + self: TestPairwiseLD, mock_pairwise_ld: PairwiseLD + ) -> None: + """Testing the returned numpy array.""" + assert isinstance(mock_pairwise_ld.r_to_numpy_matrix(), np.ndarray) + + def test_pairwise_ld__r_to_numpy_matrix__dimensions( + self: TestPairwiseLD, mock_pairwise_ld: PairwiseLD + ) -> None: + """Testing the returned numpy array.""" + assert mock_pairwise_ld.r_to_numpy_matrix().shape == ( + len(self.variants), + len(self.variants), + ) + + def test_pairwise_ld__overlap_with_locus( + self: TestPairwiseLD, mock_pairwise_ld: PairwiseLD + ) -> None: + """Testing the returned numpy array.""" + variant_subset = self.variants[1:3] + + assert ( + mock_pairwise_ld.overlap_with_locus(variant_subset).df.count() + == len(variant_subset) ** 2 + ) diff --git a/tests/gentropy/dataset/test_study_index.py b/tests/gentropy/dataset/test_study_index.py index 1d43b3b07..05b652752 100644 --- a/tests/gentropy/dataset/test_study_index.py +++ b/tests/gentropy/dataset/test_study_index.py @@ -1,10 +1,15 @@ """Test study index dataset.""" + from __future__ import annotations -from gentropy.dataset.study_index import StudyIndex +import pytest from pyspark.sql import DataFrame, SparkSession from pyspark.sql import functions as f +from gentropy.dataset.biosample_index import BiosampleIndex +from gentropy.dataset.gene_index import GeneIndex +from gentropy.dataset.study_index import StudyIndex + def test_study_index_creation(mock_study_index: StudyIndex) -> None: """Test study index creation with mock data.""" @@ -137,3 +142,365 @@ def test_aggregate_samples_by_ancestry__correctness(spark: SparkSession) -> None ) == 300.0 ) + + +class TestQTLValidation: + """A small test suite to ensure the QTL study validation works as intended.""" + + GENE_DATA = [ + ("ENSG00000102021", "1"), + ("ENSG000001020", "1"), + ] + GENE_COLUMNS = ["geneId", "chromosome"] + + BIOSAMPLE_DATA = [("UBERON_00123", "lung"), ("CL_00321", "monocyte")] + BIOSAMPLE_COLUMNS = ["biosampleId", "biosampleName"] + + STUDY_DATA = [ + ("s1", "eqtl", "p", "ENSG00000102021", "UBERON_00123"), + # This is the only study to be flagged: QTL + Wrong gene + ("s2", "eqtl", "p", "cicaful", "UBERON_00123"), + # This is the only study to be flagged: QTL + Wrong biosample + ("s3", "sqtl", "p", "ENSG00000102021", "jibberish"), + ("s4", "gwas", "p", None, "anything"), + ("s5", "gwas", "p", "pocok", None), + ] + STUDY_COLUMNS = [ + "studyId", + "studyType", + "projectId", + "geneId", + "biosampleFromSourceId", + ] + + @pytest.fixture(autouse=True) + def _setup(self: TestQTLValidation, spark: SparkSession) -> None: + """Setup fixture.""" + + def create_study_index(drop_column: str) -> StudyIndex: + df = spark.createDataFrame(self.STUDY_DATA, self.STUDY_COLUMNS) + df = df.withColumn("qualityControls", f.array().cast("array")) + if drop_column != "": + df = df.drop(drop_column) + return StudyIndex(_df=df, _schema=StudyIndex.get_schema()) + + self.study_index = create_study_index("") + self.study_index_no_gene = create_study_index("geneId") + self.study_index_no_biosample_id = create_study_index("biosampleFromSourceId") + + self.gene_index = GeneIndex( + _df=spark.createDataFrame(self.GENE_DATA, self.GENE_COLUMNS), + _schema=GeneIndex.get_schema(), + ) + self.biosample_index = BiosampleIndex( + _df=spark.createDataFrame(self.BIOSAMPLE_DATA, self.BIOSAMPLE_COLUMNS), + _schema=BiosampleIndex.get_schema(), + ) + + def test_gene_validation_type(self: TestQTLValidation) -> None: + """Testing if the target validation runs and returns the expected type.""" + validated = self.study_index.validate_target(self.gene_index) + assert isinstance(validated, StudyIndex) + + def test_biosample_validation_type(self: TestQTLValidation) -> None: + """Testing if the biosample validation runs and returns the expected type.""" + validated = self.study_index.validate_biosample(self.biosample_index) + assert isinstance(validated, StudyIndex) + + @pytest.mark.parametrize("test", ["gene", "biosample"]) + def test_qtl_validation_correctness(self: TestQTLValidation, test: str) -> None: + """Testing if the QTL validation only flags the expected studies.""" + if test == "gene": + validated = self.study_index.validate_target(self.gene_index).persist() + bad_study = "s2" + if test == "biosample": + validated = self.study_index.validate_biosample( + self.biosample_index + ).persist() + bad_study = "s3" + + # Make sure there's only one flagged: + assert validated.df.filter(f.size("qualityControls") != 0).count() == 1 + + # Make sure there's only one flagged: + flagged_study = validated.df.filter(f.size("qualityControls") != 0).collect()[ + 0 + ]["studyId"] + + assert flagged_study == bad_study + + def test_gene_validation_correctness(self: TestQTLValidation) -> None: + """Testing if the gene validation only flags the expected studies.""" + self.test_qtl_validation_correctness("gene") + + def test_biosample_validation_correctness(self: TestQTLValidation) -> None: + """Testing if the biosample validation only flags the expected studies.""" + self.test_qtl_validation_correctness("biosample") + + @pytest.mark.parametrize( + "drop,test", + [ + ("gene", "gene"), + ("gene", "biosample"), + ("biosample", "biosample"), + ("biosample", "gene"), + ], + ) + def test_qtl_validation_drop_relevant_column( + self: TestQTLValidation, drop: str, test: str + ) -> None: + """Testing what happens if an expected column is not present.""" + if drop == "gene": + if test == "gene": + validated = self.study_index_no_gene.validate_target(self.gene_index) + if test == "biosample": + validated = self.study_index_no_gene.validate_biosample( + self.biosample_index + ) + if drop == "biosample": + if test == "gene": + validated = self.study_index_no_biosample_id.validate_target( + self.gene_index + ) + if test == "biosample": + validated = self.study_index_no_biosample_id.validate_biosample( + self.biosample_index + ) + + # Asserty type: + assert isinstance(validated, StudyIndex) + + # Assert count: + assert validated.df.count() == self.study_index.df.count() + + def test_qtl_validation_no_gene_column(self: TestQTLValidation) -> None: + """Testing what happens if no gene column is present.""" + self.test_qtl_validation_drop_relevant_column(test="gene", drop="gene") + + def test_qtl_validation_no_biosample_from_source_column( + self: TestQTLValidation, + ) -> None: + """Testing what happens if no biosampleFromSourceId column is present.""" + self.test_qtl_validation_drop_relevant_column( + test="biosample", drop="biosample" + ) + + def test_qtl_validation_existing_gene_column(self: TestQTLValidation) -> None: + """Testing what happens if no gene column is present.""" + self.test_qtl_validation_drop_relevant_column(test="gene", drop="biosample") + + def test_qtl_validation_existing_biosample_from_source_column( + self: TestQTLValidation, + ) -> None: + """Testing what happens if a biosampleFromSourceId column is present.""" + self.test_qtl_validation_drop_relevant_column(test="biosample", drop="gene") + + def test_qtl_validation_existing_biosample_column(self: TestQTLValidation) -> None: + """Testing what happens if a biosampleId column is present in study index as well as biosampleFromSourceId.""" + # Append a biosample column filled with null to the self.study_index then validate: + validated = StudyIndex( + _df=self.study_index.df.withColumn( + "biosampleId", f.lit(None).cast("string") + ), + _schema=StudyIndex.get_schema(), + ).validate_biosample(self.biosample_index) + assert isinstance(validated, StudyIndex) + + +class TestUniquenessValidation: + """A small test suite to ensure the gene validation works as intended.""" + + STUDY_DATA = [ + # This is the only study to be flagged: + ("s1", "eqtl", "p"), + ("s1", "eqtl", "p"), # Duplicate -> one should be flagged + ("s3", "gwas", "p"), + ("s4", "gwas", "p"), + ] + STUDY_COLUMNS = ["studyId", "studyType", "projectId"] + + @pytest.fixture(autouse=True) + def _setup(self: TestUniquenessValidation, spark: SparkSession) -> None: + """Setup fixture.""" + self.study_index = StudyIndex( + _df=spark.createDataFrame(self.STUDY_DATA, self.STUDY_COLUMNS).withColumn( + "qualityControls", f.array().cast("array") + ), + _schema=StudyIndex.get_schema(), + ) + + def test_uniqueness_return_type(self: TestUniquenessValidation) -> None: + """Testing if the function returns the right type.""" + assert isinstance(self.study_index.validate_unique_study_id(), StudyIndex) + + def test_uniqueness_correct_data(self: TestUniquenessValidation) -> None: + """Testing if the function returns the right type.""" + validated = self.study_index.validate_unique_study_id().persist() + + # We have only one flagged study: + assert validated.df.filter(f.size(f.col("qualityControls")) > 0).count() == 1 + + # The flagged study identifiers are found more than once: + flagged_ids = { + study["studyId"]: study["count"] + for study in validated.df.filter(f.size(f.col("qualityControls")) > 0) + .groupBy("studyId") + .count() + .collect() + } + + for _, count in flagged_ids.items(): + assert count == 1 + + # the right study is found: + assert "s1" in flagged_ids + + +class TestStudyTypeValidation: + """Testing study type validation.""" + + STUDY_DATA = [ + # This study is flagged because of unexpected type: + ("s1", "cicaful", "p", "gene1"), + ("s3", "eqtl", "p", "gene1"), + ("s4", "gwas", "p", None), + ] + STUDY_COLUMNS = ["studyId", "studyType", "projectId", "geneId"] + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyTypeValidation, spark: SparkSession) -> None: + """Setup fixture.""" + self.study_index = StudyIndex( + _df=spark.createDataFrame(self.STUDY_DATA, self.STUDY_COLUMNS).withColumn( + "qualityControls", f.array().cast("array") + ), + _schema=StudyIndex.get_schema(), + ) + + def test_study_type_validation_return_type(self: TestStudyTypeValidation) -> None: + """Testing if the function returns the expected type.""" + assert isinstance(self.study_index.validate_study_type(), StudyIndex) + + def test_study_type_validation_correctness(self: TestStudyTypeValidation) -> None: + """Test if the correct study is flagged.""" + flagged_study_ids = [ + study["studyId"] + for study in self.study_index.validate_study_type() + .df.filter(f.size("qualityControls") > 0) + .collect() + ] + assert "s1" in flagged_study_ids + # Check if any + flagged_study_types = [ + study["studyType"] + for study in self.study_index.validate_study_type() + .df.filter(f.size("qualityControls") != 0) + .collect() + ] + for study_type in flagged_study_types: + assert study_type != "gwas" + assert "qtl" not in study_type + + +class TestDiseaseValidation: + """Testing the disease validation.""" + + DISEASE_DATA = [ + ("EFO_old", "EFO_new"), + ("EFO_new", "EFO_new"), + ("EFO_new2", "EFO_new2"), + ] + + DISEASE_HEADER = ["efo", "diseaseId"] + + STUDY_DATA = [ + # Old EFO mapped to new: + ("s1", "gwas", "p", "EFO_old"), + # List of EFOs some mapped, some not: + ("s2", "gwas", "p", "EFO_old"), + ("s2", "gwas", "p", "EFO_new2"), + ("s2", "gwas", "p", "EFO_invalid"), + # single EFO mapped as the same: + ("s3", "gwas", "p", "EFO_new2"), + # Invalid study: + ("s4", "gwas", "p", "EFO_invalid"), + # Invalid study - no EFO: + ("s5", "gwas", "p", None), + # Valid study, missing efo, not gwas: + ("s6", "eqtl", "p2", None), + ] + + STUDY_COLUMNS = ["studyId", "studyType", "projectId", "efo"] + + @pytest.fixture(autouse=True) + def _setup(self: TestDiseaseValidation, spark: SparkSession) -> None: + """Setup fixture.""" + study_df = ( + spark.createDataFrame(self.STUDY_DATA, self.STUDY_COLUMNS) + .groupBy("studyId", "studyType", "projectId") + .agg(f.collect_set("efo").alias("traitFromSourceMappedIds")) + .withColumn("qualityControls", f.array().cast("array")) + .withColumn( + "backgroundTraitFromSourceMappedIds", f.array().cast("array") + ) + ) + # Mock study index: + self.study_index = StudyIndex( + _df=study_df, + _schema=StudyIndex.get_schema(), + ) + + # Disease mapping: + self.disease = spark.createDataFrame(self.DISEASE_DATA, self.DISEASE_HEADER) + + # Validated data: + self.validated = self.study_index.validate_disease(self.disease).persist() + + def test_disease_validation_return_type(self: TestDiseaseValidation) -> None: + """Testing if the disease validation returns the right type.""" + assert isinstance(self.validated, StudyIndex) + + def test_disease_validation_right_flag(self: TestDiseaseValidation) -> None: + """Testing if the right studies are flagged in the validation step.""" + # Testing flagged studies: + for study in self.validated.df.filter(f.size("qualityControls") > 0).collect(): + # All flagged studies are from gwas: + assert study["studyType"] == "gwas" + # None of the flagged studies have assigned valid disease: + assert len(study["diseaseIds"]) == 0 + + # Testing unflagged studies: + for study in self.validated.df.filter(f.size("qualityControls") == 0).collect(): + # If a valid study has no disease, it cannot be gwas: + if len(study["diseaseIds"]) == 0: + assert study["studyType"] != "gwas" + + def test_disease_validation_disease_mapping(self: TestDiseaseValidation) -> None: + """Testing if old disease identifiers can be rescued.""" + example_study_id = "s1" + + test_study = self.validated.df.filter( + f.col("studyId") == example_study_id + ).collect()[0] + + # Assert validation: + assert len(test_study["qualityControls"]) == 0 + + # Assert disease mapping: + assert test_study["traitFromSourceMappedIds"][0] != test_study["diseaseIds"][0] + + def test_disease_validation_disease_removal(self: TestDiseaseValidation) -> None: + """Testing if not all diseases can be mapped, the study still passes QC.""" + example_study_id = "s2" + + test_study = self.validated.df.filter( + f.col("studyId") == example_study_id + ).collect()[0] + + # Assert validation: + assert len(test_study["qualityControls"]) == 0 + + # Assert not all diseases could be mapped to disease index: + assert len(test_study["traitFromSourceMappedIds"]) > len( + test_study["diseaseIds"] + ) diff --git a/tests/gentropy/dataset/test_study_locus.py b/tests/gentropy/dataset/test_study_locus.py index 037ede068..1d34479e1 100644 --- a/tests/gentropy/dataset/test_study_locus.py +++ b/tests/gentropy/dataset/test_study_locus.py @@ -1,29 +1,36 @@ """Test study locus dataset.""" + from __future__ import annotations from typing import Any import pyspark.sql.functions as f +import pyspark.sql.types as t import pytest -from gentropy.dataset.ld_index import LDIndex -from gentropy.dataset.study_index import StudyIndex -from gentropy.dataset.study_locus import CredibleInterval, StudyLocus -from gentropy.dataset.study_locus_overlap import StudyLocusOverlap -from pyspark.sql import Column, SparkSession +from pyspark.sql import Column, Row, SparkSession from pyspark.sql.types import ( ArrayType, BooleanType, DoubleType, - LongType, StringType, StructField, StructType, ) - -def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: - """Test study locus creation with mock data.""" - assert isinstance(mock_study_locus, StudyLocus) +from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix +from gentropy.dataset.ld_index import LDIndex +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import ( + CredibleInterval, + CredibleSetConfidenceClasses, + StudyLocus, + StudyLocusQualityCheck, +) +from gentropy.dataset.study_locus_overlap import StudyLocusOverlap +from gentropy.dataset.summary_statistics import SummaryStatistics +from gentropy.dataset.variant_index import VariantIndex +from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader @pytest.mark.parametrize( @@ -34,8 +41,9 @@ def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: True, [ { - "leftStudyLocusId": 1, - "rightStudyLocusId": 2, + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", "chromosome": "1", "tagVariantId": "commonTag", "statistics": { @@ -44,8 +52,9 @@ def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: }, }, { - "leftStudyLocusId": 1, - "rightStudyLocusId": 2, + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", "chromosome": "1", "tagVariantId": "nonCommonTag", "statistics": { @@ -69,18 +78,20 @@ def test_find_overlaps_semantic( # 2 associations with a common variant in the locus [ { - "studyLocusId": 1, + "studyLocusId": "1", "variantId": "lead1", "studyId": "study1", + "studyType": "gwas", "locus": [ {"variantId": "commonTag", "posteriorProbability": 0.9}, ], "chromosome": "1", }, { - "studyLocusId": 2, + "studyLocusId": "2", "variantId": "lead2", "studyId": "study2", + "studyType": "eqtl", "locus": [ {"variantId": "commonTag", "posteriorProbability": 0.6}, {"variantId": "nonCommonTag", "posteriorProbability": 0.6}, @@ -98,18 +109,20 @@ def test_find_overlaps_semantic( # 2 associations with no common variants in the locus [ { - "studyLocusId": 1, + "studyLocusId": "1", "variantId": "lead1", "studyId": "study1", + "studyType": "gwas", "locus": [ {"variantId": "var1", "posteriorProbability": 0.9}, ], "chromosome": "1", }, { - "studyLocusId": 2, + "studyLocusId": "2", "variantId": "lead2", "studyId": "study2", + "studyType": "eqtl", "locus": None, "chromosome": "1", }, @@ -119,25 +132,6 @@ def test_find_overlaps_semantic( _schema=StudyLocus.get_schema(), ) - studies = StudyIndex( - _df=spark.createDataFrame( - [ - { - "studyId": "study1", - "studyType": "gwas", - "traitFromSource": "trait1", - "projectId": "project1", - }, - { - "studyId": "study2", - "studyType": "eqtl", - "traitFromSource": "trait2", - "projectId": "project2", - }, - ] - ), - _schema=StudyIndex.get_schema(), - ) expected_overlaps_df = spark.createDataFrame( expected, StudyLocusOverlap.get_schema() ) @@ -147,71 +141,25 @@ def test_find_overlaps_semantic( "statistics.right_posteriorProbability", ] assert ( - credset.find_overlaps(studies).df.select(*cols_to_compare).collect() + credset.find_overlaps().df.select(*cols_to_compare).collect() == expected_overlaps_df.select(*cols_to_compare).collect() ), "Overlaps differ from expected." -def test_find_overlaps( - mock_study_locus: StudyLocus, mock_study_index: StudyIndex -) -> None: +def test_find_overlaps(mock_study_locus: StudyLocus) -> None: """Test study locus overlaps.""" - assert isinstance( - mock_study_locus.find_overlaps(mock_study_index), StudyLocusOverlap - ) + assert isinstance(mock_study_locus.find_overlaps(), StudyLocusOverlap) -@pytest.mark.parametrize( - "study_type, expected_sl_count", [("gwas", 1), ("eqtl", 1), ("pqtl", 0)] -) -def test_filter_by_study_type( - spark: SparkSession, study_type: str, expected_sl_count: int +def test_annotate_locus_statistics( + mock_study_locus: StudyLocus, mock_summary_statistics: SummaryStatistics ) -> None: - """Test filter by study type.""" - # Input data - sl = StudyLocus( - _df=spark.createDataFrame( - [ - { - # from gwas - "studyLocusId": 1, - "variantId": "lead1", - "studyId": "study1", - }, - { - # from eqtl - "studyLocusId": 2, - "variantId": "lead2", - "studyId": "study2", - }, - ], - StudyLocus.get_schema(), - ), - _schema=StudyLocus.get_schema(), - ) - studies = StudyIndex( - _df=spark.createDataFrame( - [ - { - "studyId": "study1", - "studyType": "gwas", - "traitFromSource": "trait1", - "projectId": "project1", - }, - { - "studyId": "study2", - "studyType": "eqtl", - "traitFromSource": "trait2", - "projectId": "project2", - }, - ] - ), - _schema=StudyIndex.get_schema(), + """Test annotate locus statistics returns a StudyLocus.""" + assert isinstance( + mock_study_locus.annotate_locus_statistics(mock_summary_statistics, 100), + StudyLocus, ) - observed = sl.filter_by_study_type(study_type, studies) - assert observed.df.count() == expected_sl_count - def test_filter_credible_set(mock_study_locus: StudyLocus) -> None: """Test credible interval filter.""" @@ -220,86 +168,84 @@ def test_filter_credible_set(mock_study_locus: StudyLocus) -> None: ) -def test_assign_study_locus_id__null_variant_id(spark: SparkSession) -> None: - """Test assign study locus id when variant id is null for the same study.""" - df = spark.createDataFrame( - [("GCST000001", None), ("GCST000001", None)], - schema="studyId: string, variantId: string", - ).withColumn( - "studyLocusId", - StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), - ) - assert ( - df.select("studyLocusId").distinct().count() == 2 - ), "studyLocusId is not unique when variantId is null" +def test_qc_abnormal_pips(mock_study_locus: StudyLocus) -> None: + """Test that the qc_abnormal_pips method returns a StudyLocus object.""" + assert isinstance(mock_study_locus.qc_abnormal_pips(0.99, 1), StudyLocus) -@pytest.mark.parametrize( - ("observed", "expected"), +# Used primarily for test_unique_variants_in_locus but also for other tests +test_unique_variants_in_locus_test_data = [ + ( + # Locus is not null, should return union between variants in locus and lead variant + [ + ( + "1", + "traitA", + "22_varA", + [ + {"variantId": "22_varA", "posteriorProbability": 0.44}, + {"variantId": "22_varB", "posteriorProbability": 0.015}, + ], + ), + ], + [ + ( + "22_varA", + "22", + ), + ( + "22_varB", + "22", + ), + ], + ), + ( + # locus is null, should return lead variant + [ + ("1", "traitA", "22_varA", None), + ], + [ + ( + "22_varA", + "22", + ), + ], + ), +] + +test_unique_variants_in_locus_test_schema = StructType( [ - ( - # Locus is not null, should return union between variants in locus and lead variant - [ - ( - 1, - "traitA", - "22_varA", + StructField("studyLocusId", StringType(), True), + StructField("studyId", StringType(), True), + StructField("variantId", StringType(), True), + StructField( + "locus", + ArrayType( + StructType( [ - {"variantId": "22_varA", "posteriorProbability": 0.44}, - {"variantId": "22_varB", "posteriorProbability": 0.015}, - ], - ), - ], - [ - ( - "22_varA", - "22", - ), - ( - "22_varB", - "22", - ), - ], - ), - ( - # locus is null, should return lead variant - [ - (1, "traitA", "22_varA", None), - ], - [ - ( - "22_varA", - "22", - ), - ], + StructField("variantId", StringType(), True), + StructField("posteriorProbability", DoubleType(), True), + ] + ) + ), + True, ), - ], + ] +) + + +@pytest.mark.parametrize( + ("observed", "expected"), + test_unique_variants_in_locus_test_data, ) def test_unique_variants_in_locus( spark: SparkSession, observed: list[Any], expected: list[Any] ) -> None: """Test unique variants in locus.""" # assert isinstance(mock_study_locus.test_unique_variants_in_locus(), DataFrame) - schema = StructType( - [ - StructField("studyLocusId", LongType(), True), - StructField("studyId", StringType(), True), - StructField("variantId", StringType(), True), - StructField( - "locus", - ArrayType( - StructType( - [ - StructField("variantId", StringType(), True), - ] - ) - ), - True, - ), - ] - ) data_sl = StudyLocus( - _df=spark.createDataFrame(observed, schema), _schema=StudyLocus.get_schema() + _df=spark.createDataFrame(observed, test_unique_variants_in_locus_test_schema), + _schema=StudyLocus.get_schema(), ) expected_df = spark.createDataFrame( expected, schema="variantId: string, chromosome: string" @@ -317,205 +263,929 @@ def test_clump(mock_study_locus: StudyLocus) -> None: assert isinstance(mock_study_locus.clump(), StudyLocus) -@pytest.mark.parametrize( - ("observed", "expected"), +# Used primarily for test_annotate_credible_sets but also for other tests +test_annotate_credible_sets_test_data = [ + ( + # Simple case + [ + # Observed + ( + "1", + "traitA", + "leadB", + [{"variantId": "tagVariantA", "posteriorProbability": 1.0}], + ), + ], + [ + # Expected + ( + "1", + "traitA", + "leadB", + [ + { + "variantId": "tagVariantA", + "posteriorProbability": 1.0, + "is95CredibleSet": True, + "is99CredibleSet": True, + } + ], + ) + ], + ), + ( + # Unordered credible set + [ + # Observed + ( + "1", + "traitA", + "leadA", + [ + {"variantId": "tagVariantA", "posteriorProbability": 0.44}, + {"variantId": "tagVariantB", "posteriorProbability": 0.015}, + {"variantId": "tagVariantC", "posteriorProbability": 0.04}, + {"variantId": "tagVariantD", "posteriorProbability": 0.005}, + {"variantId": "tagVariantE", "posteriorProbability": 0.5}, + {"variantId": "tagVariantNull", "posteriorProbability": None}, + {"variantId": "tagVariantNull", "posteriorProbability": None}, + ], + ) + ], + [ + # Expected + ( + "1", + "traitA", + "leadA", + [ + { + "variantId": "tagVariantE", + "posteriorProbability": 0.5, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantA", + "posteriorProbability": 0.44, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantC", + "posteriorProbability": 0.04, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantB", + "posteriorProbability": 0.015, + "is95CredibleSet": False, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantD", + "posteriorProbability": 0.005, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + { + "variantId": "tagVariantNull", + "posteriorProbability": None, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + { + "variantId": "tagVariantNull", + "posteriorProbability": None, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + ], + ) + ], + ), + ( + # Null credible set + [ + # Observed + ( + "1", + "traitA", + "leadB", + None, + ), + ], + [ + # Expected + ( + "1", + "traitA", + "leadB", + None, + ) + ], + ), + ( + # Empty credible set + [ + # Observed + ( + "1", + "traitA", + "leadB", + [], + ), + ], + [ + # Expected + ( + "1", + "traitA", + "leadB", + None, + ) + ], + ), +] +test_annotate_credible_sets_test_schema = StructType( [ - ( - # Simple case - [ - # Observed - ( - 1, - "traitA", - "leadB", - [{"variantId": "tagVariantA", "posteriorProbability": 1.0}], - ), - ], - [ - # Expected - ( - 1, - "traitA", - "leadB", + StructField("studyLocusId", StringType(), True), + StructField("studyId", StringType(), True), + StructField("variantId", StringType(), True), + StructField( + "locus", + ArrayType( + StructType( [ - { - "variantId": "tagVariantA", - "posteriorProbability": 1.0, - "is95CredibleSet": True, - "is99CredibleSet": True, - } - ], + StructField("variantId", StringType(), True), + StructField("posteriorProbability", DoubleType(), True), + StructField("is95CredibleSet", BooleanType(), True), + StructField("is99CredibleSet", BooleanType(), True), + ] ) - ], + ), + True, ), + ] +) + + +@pytest.mark.parametrize( + ("observed", "expected"), + test_annotate_credible_sets_test_data, +) +def test_annotate_credible_sets( + spark: SparkSession, observed: list[Any], expected: list[Any] +) -> None: + """Test annotate_credible_sets.""" + data_sl = StudyLocus( + _df=spark.createDataFrame(observed, test_annotate_credible_sets_test_schema), + _schema=StudyLocus.get_schema(), + ) + expected_sl = StudyLocus( + _df=spark.createDataFrame(expected, test_annotate_credible_sets_test_schema), + _schema=StudyLocus.get_schema(), + ) + assert data_sl.annotate_credible_sets().df.collect() == expected_sl.df.collect() + + +def test_qc_abnormal_pips_good_locus(spark: SparkSession) -> None: + """Test qc_abnormal_pips with a well-behaving locus.""" + # Input data + sl = StudyLocus( + _df=spark.createDataFrame( + test_annotate_credible_sets_test_data[1][0], + test_annotate_credible_sets_test_schema, + ), + _schema=StudyLocus.get_schema(), + ) + assert ( + sl.qc_abnormal_pips().df.filter(f.size("qualityControls") > 0).count() == 0 + ), "Expected number of rows differ from observed." + + +def test_qc_abnormal_pips_bad_locus(spark: SparkSession) -> None: + """Test qc_abnormal_pips with an abnormal locus.""" + # Input data + sl = StudyLocus( + _df=spark.createDataFrame( + test_unique_variants_in_locus_test_data[0][0], + test_unique_variants_in_locus_test_schema, + ), + _schema=StudyLocus.get_schema(), + ) + assert ( + sl.qc_abnormal_pips().df.filter(f.size("qualityControls") > 0).count() == 1 + ), "Expected number of rows differ from observed." + + +def test_annotate_ld( + mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex +) -> None: + """Test annotate_ld.""" + assert isinstance( + mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + ) + + +def test__qc_no_population(mock_study_locus: StudyLocus) -> None: + """Test _qc_no_population.""" + assert isinstance(mock_study_locus._qc_no_population(), StudyLocus) + + +def test_qc_MHC_region(mock_study_locus: StudyLocus) -> None: + """Test qc_MHC_region.""" + assert isinstance(mock_study_locus.qc_MHC_region(), StudyLocus) + + +def test_ldannotate( + mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex +) -> None: + """Test ldannotate.""" + assert isinstance( + mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + ) + + +def test_filter_ld_set(spark: SparkSession) -> None: + """Test filter_ld_set.""" + observed_data = [ + Row(studyLocusId="sl1", ldSet=[{"tagVariantId": "tag1", "r2Overall": 0.4}]) + ] + observed_df = spark.createDataFrame( + observed_data, ["studyLocusId", "ldSet"] + ).withColumn("ldSet", StudyLocus.filter_ld_set(f.col("ldSet"), 0.5)) + expected_tags_in_ld = 0 + assert ( + observed_df.filter(f.size("ldSet") > 1).count() == expected_tags_in_ld + ), "Expected tags in ld set differ from observed." + + +def test_annotate_locus_statistics_boundaries( + mock_study_locus: StudyLocus, mock_summary_statistics: SummaryStatistics +) -> None: + """Test annotate locus statistics returns a StudyLocus.""" + df = mock_study_locus.df + df = df.withColumn("locusStart", f.col("position") - 10) + df = df.withColumn("locusEnd", f.col("position") + 10) + slt = StudyLocus(df, StudyLocus.get_schema()) + assert isinstance( + slt.annotate_locus_statistics_boundaries(mock_summary_statistics), + StudyLocus, + ) + + +class TestStudyLocusVariantValidation: + """Collection of tests for StudyLocus variant validation.""" + + VARIANT_DATA = [ + ("v1", "c1", 1, "r", "a"), + ("v2", "c1", 2, "r", "a"), + ("v3", "c1", 3, "r", "a"), + ("v4", "c1", 4, "r", "a"), + ] + VARIANT_HEADERS = [ + "variantId", + "chromosome", + "position", + "referenceAllele", + "alternateAllele", + ] + + STUDYLOCUS_DATA = [ + # First studylocus passes qc: + ("1", "v1", "s1", "v1"), + ("1", "v1", "s1", "v2"), + ("1", "v1", "s1", "v3"), + # Second studylocus passes qc: + ("2", "v1", "s1", "v1"), + ("2", "v1", "s1", "v5"), + ] + STUDYLOCUS_HEADER = ["studyLocusId", "variantId", "studyId", "tagVariantId"] + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyLocusVariantValidation, spark: SparkSession) -> None: + """Setup study locus for testing.""" + self.variant_index = VariantIndex( + _df=spark.createDataFrame( + self.VARIANT_DATA, self.VARIANT_HEADERS + ).withColumn("position", f.col("position").cast(t.IntegerType())), + _schema=VariantIndex.get_schema(), + ) + + self.credible_set = StudyLocus( + _df=( + spark.createDataFrame(self.STUDYLOCUS_DATA, self.STUDYLOCUS_HEADER) + .withColumn("studyLocusId", f.col("studyLocusId").cast(t.StringType())) + .withColumn("qualityControls", f.array()) + .groupBy("studyLocusId", "variantId", "studyId") + .agg( + f.collect_set( + f.struct(f.col("tagVariantId").alias("variantId")) + ).alias("locus") + ) + ), + _schema=StudyLocus.get_schema(), + ) + + def test_validation_return_type(self: TestStudyLocusVariantValidation) -> None: + """Testing if the validation returns the right type.""" + assert isinstance( + self.credible_set.validate_variant_identifiers(self.variant_index), + StudyLocus, + ) + + def test_validation_no_data_loss(self: TestStudyLocusVariantValidation) -> None: + """Testing if the validation returns same number of rows.""" + assert ( + self.credible_set.validate_variant_identifiers( + self.variant_index + ).df.count() + == self.credible_set.df.count() + ) + + def test_validation_correctness(self: TestStudyLocusVariantValidation) -> None: + """Testing if the validation flags the right number of variants.""" + # Execute validation: + validated = self.credible_set.validate_variant_identifiers( + self.variant_index + ).df + + # Make sure there's only one study locus with a failed variants: + assert validated.filter(f.size("qualityControls") > 0).count() == 1 + + # Check that the right one is flagged: + assert ( + validated.filter( + (f.size("qualityControls") > 0) & (f.col("studyLocusId") == "2") + ).count() + == 1 + ) + + +class TestStudyLocusValidation: + """Collection of tests for StudyLocus validation.""" + + STUDY_LOCUS_DATA = [ + # Won't be flagged: + ("1", "v1", "s1", 1.0, -8, [], "pics"), + # Already flagged, needs to be tested if the flag reamins unique: ( - # Unordered credible set - [ - # Observed - ( - 1, - "traitA", - "leadA", - [ - {"variantId": "tagVariantA", "posteriorProbability": 0.44}, - {"variantId": "tagVariantB", "posteriorProbability": 0.015}, - {"variantId": "tagVariantC", "posteriorProbability": 0.04}, - {"variantId": "tagVariantD", "posteriorProbability": 0.005}, - {"variantId": "tagVariantE", "posteriorProbability": 0.5}, - {"variantId": "tagVariantNull", "posteriorProbability": None}, - {"variantId": "tagVariantNull", "posteriorProbability": None}, - ], + "2", + "v2", + "s2", + 5.0, + -4, + [StudyLocusQualityCheck.SUBSIGNIFICANT_FLAG.value], + "pics", + ), + # To be flagged: + ("3", "v3", "s3", 1.0, -4, [], "SuSiE-inf"), + ("4", "v4", "s4", 5.0, -3, [], "unknown"), + ] + + STUDY_LOCUS_SCHEMA = t.StructType( + [ + t.StructField("studyLocusId", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("studyId", t.StringType(), False), + t.StructField("pValueMantissa", t.FloatType(), False), + t.StructField("pValueExponent", t.IntegerType(), False), + t.StructField("qualityControls", t.ArrayType(t.StringType()), False), + t.StructField("finemappingMethod", t.StringType(), False), + ] + ) + + STUDY_DATA = [ + # Unflagged: + ("s1", "p1", "gwas", []), + # Flagged: + ("s2", "p1", "gwas", ["some_flag"]), + ("s3", "p1", "gwas", ["some_flag"]), + ] + + STUDY_SCHEMA = t.StructType( + [ + t.StructField("studyId", t.StringType(), False), + t.StructField("projectId", t.StringType(), False), + t.StructField("studyType", t.StringType(), False), + t.StructField("qualityControls", t.ArrayType(t.StringType(), True), True), + ] + ) + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyLocusValidation, spark: SparkSession) -> None: + """Setup study locus for testing.""" + self.study_locus = StudyLocus( + _df=spark.createDataFrame( + self.STUDY_LOCUS_DATA, schema=self.STUDY_LOCUS_SCHEMA + ), + _schema=StudyLocus.get_schema(), + ) + + self.study_index = StudyIndex( + _df=spark.createDataFrame(self.STUDY_DATA, schema=self.STUDY_SCHEMA), + _schema=StudyIndex.get_schema(), + ) + + @pytest.mark.parametrize( + "test_pvalues", + [1e-6, 1e-5], + ) + def test_return_type_pval_validation( + self: TestStudyLocusValidation, test_pvalues: float + ) -> None: + """Testing if the p-value validation returns the right type.""" + assert isinstance( + self.study_locus.validate_lead_pvalue(test_pvalues), StudyLocus + ) + + def test_confidence_flag_return_type(self: TestStudyLocusValidation) -> None: + """Testing if the confidence flagging returns the right type.""" + assert isinstance(self.study_locus.assign_confidence(), StudyLocus) + + def test_confidence_flag_new_column(self: TestStudyLocusValidation) -> None: + """Testing if the confidence flagging adds a new column.""" + assert ( + self.study_locus.assign_confidence().df.columns + == self.study_locus.df.columns + ["confidence"] + ) + + def test_confidence_flag_unknown_confidence(self: TestStudyLocusValidation) -> None: + """Testing if the confidence flagging adds a new column.""" + assert ( + self.study_locus.assign_confidence() + .df.filter( + f.col("confidence") == CredibleSetConfidenceClasses.UNKNOWN.value + ) + .count() + == 1 + ) + + @pytest.mark.parametrize( + ("test_pvalues", "flagged_count"), + [(1e-5, 3), (1e-4, 2)], + ) + def test_flagged_count( + self: TestStudyLocusValidation, test_pvalues: float, flagged_count: int + ) -> None: + """Testing if the p-value validation flags the right number of variants.""" + assert ( + self.study_locus.validate_lead_pvalue(test_pvalues) + .df.filter(f.size("qualityControls") > 0) + .count() + == flagged_count + ) + + def test_flag_uniqueness(self: TestStudyLocusValidation) -> None: + """Testing if the flag remains unique although the locus should be flagged twice.""" + assert ( + self.study_locus.validate_lead_pvalue(1e-10) + .df.filter(f.size("qualityControls") > 1) + .count() + ) == 0 + + def test_study_validation_return_type(self: TestStudyLocusValidation) -> None: + """Testing if the study validation returns the right type.""" + assert isinstance(self.study_locus.validate_study(self.study_index), StudyLocus) + + def test_study_validation_no_data_loss(self: TestStudyLocusValidation) -> None: + """Testing if the study validation returns same number of rows.""" + assert ( + self.study_locus.validate_study(self.study_index).df.count() + ) == self.study_locus.df.count() + + def test_study_validation_correctness(self: TestStudyLocusValidation) -> None: + """Testing if the study validation flags the right number of studies.""" + assert ( + self.study_locus.validate_study(self.study_index) + .df.filter( + f.array_contains( + f.col("qualityControls"), StudyLocusQualityCheck.FLAGGED_STUDY.value ) - ], - [ - # Expected - ( - 1, - "traitA", - "leadA", - [ - { - "variantId": "tagVariantE", - "posteriorProbability": 0.5, - "is95CredibleSet": True, - "is99CredibleSet": True, - }, - { - "variantId": "tagVariantA", - "posteriorProbability": 0.44, - "is95CredibleSet": True, - "is99CredibleSet": True, - }, - { - "variantId": "tagVariantC", - "posteriorProbability": 0.04, - "is95CredibleSet": True, - "is99CredibleSet": True, - }, - { - "variantId": "tagVariantB", - "posteriorProbability": 0.015, - "is95CredibleSet": False, - "is99CredibleSet": True, - }, - { - "variantId": "tagVariantD", - "posteriorProbability": 0.005, - "is95CredibleSet": False, - "is99CredibleSet": False, - }, - { - "variantId": "tagVariantNull", - "posteriorProbability": None, - "is95CredibleSet": False, - "is99CredibleSet": False, - }, - { - "variantId": "tagVariantNull", - "posteriorProbability": None, - "is95CredibleSet": False, - "is99CredibleSet": False, - }, - ], + ) + .count() + ) == 2 + + assert ( + self.study_locus.validate_study(self.study_index) + .df.filter( + f.array_contains( + f.col("qualityControls"), StudyLocusQualityCheck.MISSING_STUDY.value + ) + ) + .count() + ) == 1 + + +class TestStudyLocusWindowClumping: + """Testing window-based clumping on study locus.""" + + TEST_DATASET = [ + ("s1", "c1", 1, -1), + ("s1", "c1", 2, -2), + ("s1", "c1", 3, -3), + ("s2", "c2", 2, -2), + ("s3", "c2", 2, -2), + ] + + TEST_SCHEMA = t.StructType( + [ + t.StructField("studyId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("position", t.IntegerType(), False), + t.StructField("pValueExponent", t.IntegerType(), False), + ] + ) + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyLocusWindowClumping, spark: SparkSession) -> None: + """Setup study locus for testing.""" + self.study_locus = StudyLocus( + _df=( + spark.createDataFrame( + self.TEST_DATASET, schema=self.TEST_SCHEMA + ).withColumns( + { + "studyLocusId": f.monotonically_increasing_id().cast( + t.StringType() + ), + "pValueMantissa": f.lit(1).cast(t.FloatType()), + "variantId": f.concat( + f.lit("v"), + f.monotonically_increasing_id().cast(t.StringType()), + ), + } ) + ), + _schema=StudyLocus.get_schema(), + ) + + def test_clump_return_type(self: TestStudyLocusWindowClumping) -> None: + """Testing if the clumping returns the right type.""" + assert isinstance(self.study_locus.window_based_clumping(3), StudyLocus) + + def test_clump_no_data_loss(self: TestStudyLocusWindowClumping) -> None: + """Testing if the clumping returns same number of rows.""" + assert ( + self.study_locus.window_based_clumping(3).df.count() + == self.study_locus.df.count() + ) + + def test_correct_flag(self: TestStudyLocusWindowClumping) -> None: + """Testing if the clumping flags are for variants.""" + assert ( + self.study_locus.window_based_clumping(3) + .df.filter( + f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.WINDOW_CLUMPED.value, + ) + ) + .count() + ) == 2 + + +def test_build_feature_matrix( + mock_study_locus: StudyLocus, + mock_colocalisation: Colocalisation, + mock_study_index: StudyIndex, +) -> None: + """Test building feature matrix with the eQtlColocH4Maximum feature.""" + features_list = ["eQtlColocH4Maximum"] + loader = L2GFeatureInputLoader( + colocalisation=mock_colocalisation, + study_index=mock_study_index, + study_locus=mock_study_locus, + ) + fm = mock_study_locus.build_feature_matrix(features_list, loader) + assert isinstance( + fm, L2GFeatureMatrix + ), "Feature matrix should be of type L2GFeatureMatrix" + + +class TestStudyLocusRedundancyFlagging: + """Collection of tests related to flagging redundant credible sets.""" + + STUDY_LOCUS_DATA = [ + ("1", "v1", "s1", "pics", []), + ("2", "v2", "s1", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ("3", "v3", "s1", "pics", []), + ("3", "v3", "s1", "pics", []), + ("1", "v1", "s1", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ("1", "v1", "s2", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ("1", "v1", "s2", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ("1", "v1", "s3", "SuSie", []), + ("1", "v1", "s3", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ("1", "v1", "s4", "pics", []), + ("1", "v1", "s4", "SuSie", []), + ("1", "v1", "s4", "pics", [StudyLocusQualityCheck.TOP_HIT.value]), + ] + + STUDY_LOCUS_SCHEMA = t.StructType( + [ + t.StructField("studyLocusId", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("studyId", t.StringType(), False), + t.StructField("finemappingMethod", t.StringType(), False), + t.StructField("qualityControls", t.ArrayType(t.StringType()), False), + ] + ) + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyLocusRedundancyFlagging, spark: SparkSession) -> None: + """Setup study locus for testing.""" + self.study_locus = StudyLocus( + _df=spark.createDataFrame( + self.STUDY_LOCUS_DATA, schema=self.STUDY_LOCUS_SCHEMA + ), + _schema=StudyLocus.get_schema(), + ) + + def test_qc_redundant_top_hits_from_PICS_returntype( + self: TestStudyLocusRedundancyFlagging, + ) -> None: + """Test qc_redundant_top_hits_from_PICS.""" + assert isinstance( + self.study_locus.qc_redundant_top_hits_from_PICS(), StudyLocus + ) + + def test_qc_redundant_top_hits_from_PICS_no_data_loss( + self: TestStudyLocusRedundancyFlagging, + ) -> None: + """Testing if the redundancy flagging returns the same number of rows.""" + assert ( + self.study_locus.qc_redundant_top_hits_from_PICS().df.count() + == self.study_locus.df.count() + ) + + def test_qc_redundant_top_hits_from_PICS_correctness( + self: TestStudyLocusRedundancyFlagging, + ) -> None: + """Testing if the study validation flags the right number of studies.""" + assert ( + self.study_locus.qc_redundant_top_hits_from_PICS() + .df.filter( + f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.REDUNDANT_PICS_TOP_HIT.value, + ) + ) + .count() + ) == 3 + + +class TestStudyLocusSuSiERedundancyFlagging: + """Collection of tests related to flagging redundant credible sets.""" + + STUDY_LOCUS_DATA: Any = [ + # to be flagged due to v4 + ( + "1", + "v1", + "s1", + "X", + "pics", + 1, + 3, + [ + {"variantId": "X_1_A_A"}, + {"variantId": "X_2_A_A"}, + {"variantId": "X_3_A_A"}, ], + [], ), + # to be flagged due to v4 ( - # Null credible set + "2", + "v2", + "s1", + "X", + "pics", + 4, + 5, [ - # Observed - ( - 1, - "traitA", - "leadB", - None, - ), + {"variantId": "X_4_A_A"}, + {"variantId": "X_5_A_A"}, ], + [], + ), + # NOT to be flagged (outside regions) + ( + "3", + "v3", + "s1", + "X", + "pics", + 6, + 7, [ - # Expected - ( - 1, - "traitA", - "leadB", - None, - ) + {"variantId": "X_6_A_A"}, + {"variantId": "X_7_A_A"}, ], + [], ), + # NOT to be flagged (SuSie-Inf credible set) ( - # Empty credible set + "4", + "v4", + "s1", + "X", + "SuSiE-inf", + 3, + 5, + [{"variantId": "X_3_A_A"}, {"variantId": "X_5_A_A"}], + [], + ), + # To be flagged (Unresolved LD flag on it) + ( + "5", + "v5", + "s1", + "X", + "pics", + 5, + 5, [ - # Observed - ( - 1, - "traitA", - "leadB", - [], - ), + {"variantId": "X_5_A_A"}, ], + [StudyLocusQualityCheck.UNRESOLVED_LD.value], + ), + # NOT to be flagged (different study) + ( + "6", + "v6", + "s2", + "X", + "pics", + 3, + 5, [ - # Expected - ( - 1, - "traitA", - "leadB", - None, - ) + {"variantId": "X_3_A_A"}, + {"variantId": "X_5_A_A"}, ], + [], ), - ], -) -def test_annotate_credible_sets( - spark: SparkSession, observed: list[Any], expected: list[Any] -) -> None: - """Test annotate_credible_sets.""" - schema = StructType( + ] + + STUDY_LOCUS_SCHEMA = t.StructType( [ - StructField("studyLocusId", LongType(), True), - StructField("studyId", StringType(), True), - StructField("variantId", StringType(), True), + t.StructField("studyLocusId", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("studyId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("finemappingMethod", t.StringType(), False), + t.StructField("locusStart", t.IntegerType(), False), + t.StructField("locusEnd", t.IntegerType(), False), StructField( "locus", ArrayType( StructType( [ StructField("variantId", StringType(), True), - StructField("posteriorProbability", DoubleType(), True), - StructField("is95CredibleSet", BooleanType(), True), - StructField("is99CredibleSet", BooleanType(), True), ] ) ), True, ), + t.StructField("qualityControls", t.ArrayType(t.StringType()), False), ] ) - data_sl = StudyLocus( - _df=spark.createDataFrame(observed, schema), _schema=StudyLocus.get_schema() - ) - expected_sl = StudyLocus( - _df=spark.createDataFrame(expected, schema), _schema=StudyLocus.get_schema() - ) - assert data_sl.annotate_credible_sets().df.collect() == expected_sl.df.collect() + @pytest.fixture(autouse=True) + def _setup( + self: TestStudyLocusSuSiERedundancyFlagging, spark: SparkSession + ) -> None: + """Setup study locus for testing.""" + self.study_locus = StudyLocus( + _df=spark.createDataFrame( + self.STUDY_LOCUS_DATA, schema=self.STUDY_LOCUS_SCHEMA + ), + _schema=StudyLocus.get_schema(), + ) -def test_annotate_ld( - mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex + def test_qc_qc_explained_by_SuSiE_returntype( + self: TestStudyLocusSuSiERedundancyFlagging, + ) -> None: + """Test qc_explained_by_SuSiE.""" + assert isinstance(self.study_locus.qc_explained_by_SuSiE(), StudyLocus) + + def test_qc_explained_by_SuSiE_no_data_loss( + self: TestStudyLocusSuSiERedundancyFlagging, + ) -> None: + """Test qc_explained_by_SuSiE no data loss.""" + assert ( + self.study_locus.qc_explained_by_SuSiE().df.count() + == self.study_locus.df.count() + ) + + def test_qc_explained_by_SuSiE_correctness( + self: TestStudyLocusSuSiERedundancyFlagging, + ) -> None: + """Testing if the study validation flags the right number of studies.""" + assert ( + self.study_locus.qc_explained_by_SuSiE() + .df.filter( + f.array_contains( + f.col("qualityControls"), + StudyLocusQualityCheck.EXPLAINED_BY_SUSIE.value, + ) + ) + .count() + ) == 3 + + +def test_qc_valid_chromosomes( + spark: SparkSession, ) -> None: - """Test annotate_ld.""" - assert isinstance( - mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + """Testing if chredible sets with invalid chromosomes are properly flagged.""" + df = spark.createDataFrame( + [ + # Chromosome is fine: + ("1", "v1", "s1", "X", []), + ("2", "v2", "s1", "1", []), + # Should be flagged: + ("3", "v3", "s1", "11325", []), + ("4", "v4", "s1", "CICAFUL", []), + ], + schema=t.StructType( + [ + t.StructField("studyLocusId", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("studyId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("qualityControls", t.ArrayType(t.StringType()), False), + ] + ), ) + sl = StudyLocus(_df=df, _schema=StudyLocus.get_schema()).validate_chromosome_label() -def test__qc_no_population(mock_study_locus: StudyLocus) -> None: - """Test _qc_no_population.""" - assert isinstance(mock_study_locus._qc_no_population(), StudyLocus) + # Assert return type: + assert isinstance(sl, StudyLocus) + # Assert flagging correctness: + for row in sl.df.collect(): + if row["chromosome"] in ["1", "X"]: + assert not row["qualityControls"] + else: + assert ( + StudyLocusQualityCheck.INVALID_CHROMOSOME.value + in row["qualityControls"] + ) -def test_ldannotate( - mock_study_locus: StudyLocus, mock_study_index: StudyIndex, mock_ld_index: LDIndex -) -> None: - """Test ldannotate.""" - assert isinstance( - mock_study_locus.annotate_ld(mock_study_index, mock_ld_index), StudyLocus + +class TestStudyLocusDuplicationFlagging: + """Collection of tests related to flagging redundant credible sets.""" + + STUDY_LOCUS_DATA = [ + # Non-duplicated: + ("1", "v1", "s1", "pics"), + # Triplicate: + ("3", "v3", "s1", "pics"), + ("3", "v3", "s1", "pics"), + ("3", "v3", "s1", "pics"), + ] + + STUDY_LOCUS_SCHEMA = t.StructType( + [ + t.StructField("studyLocusId", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("studyId", t.StringType(), False), + t.StructField("finemappingMethod", t.StringType(), False), + ] ) + + @pytest.fixture(autouse=True) + def _setup(self: TestStudyLocusDuplicationFlagging, spark: SparkSession) -> None: + """Setup study locus for testing.""" + self.study_locus = StudyLocus( + _df=spark.createDataFrame( + self.STUDY_LOCUS_DATA, schema=self.STUDY_LOCUS_SCHEMA + ).withColumn( + "qualityControls", f.array().cast(t.ArrayType(t.StringType())) + ), + _schema=StudyLocus.get_schema(), + ) + + # Run validation: + self.validated = self.study_locus.validate_unique_study_locus_id() + + def test_duplication_flag_type(self: TestStudyLocusDuplicationFlagging) -> None: + """Test duplication flagging return type.""" + assert isinstance(self.validated, StudyLocus) + + def test_duplication_flag_no_data_loss( + self: TestStudyLocusDuplicationFlagging, + ) -> None: + """Test duplication flagging no data loss.""" + assert self.validated.df.count() == self.study_locus.df.count() + + def test_duplication_flag_correctness( + self: TestStudyLocusDuplicationFlagging, + ) -> None: + """Make sure that the end, there are two study loci that pass the validation.""" + assert self.validated.df.filter(f.size("qualityControls") == 0).count() == 2 + + assert self.validated.df.filter(f.size("qualityControls") > 0).count() == 2 diff --git a/tests/gentropy/dataset/test_study_locus_overlap.py b/tests/gentropy/dataset/test_study_locus_overlap.py index ca49fc067..c517c023d 100644 --- a/tests/gentropy/dataset/test_study_locus_overlap.py +++ b/tests/gentropy/dataset/test_study_locus_overlap.py @@ -1,9 +1,11 @@ """Test study locus overlap dataset.""" + from __future__ import annotations -from gentropy.dataset.study_locus_overlap import StudyLocusOverlap from pyspark.sql import SparkSession +from gentropy.dataset.study_locus_overlap import StudyLocusOverlap + def test_study_locus_overlap_creation( mock_study_locus_overlap: StudyLocusOverlap, @@ -17,19 +19,19 @@ def test_convert_to_square_matrix(spark: SparkSession) -> None: mock_sl_overlap = StudyLocusOverlap( _df=spark.createDataFrame( [ - (1, 2, "variant2"), + ("1", "2", "eqtl", "CHROM1", "variant2", None), ], - "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + StudyLocusOverlap.get_schema(), ), _schema=StudyLocusOverlap.get_schema(), ) expected_df = spark.createDataFrame( [ - (1, 2, "variant2"), - (2, 1, "variant2"), + ("1", "2", "eqtl", "CHROM1", "variant2", None), + ("2", "1", "eqtl", "CHROM1", "variant2", None), ], - "leftStudyLocusId LONG, rightStudyLocusId LONG, tagVariantId STRING", + StudyLocusOverlap.get_schema(), ) observed_df = mock_sl_overlap._convert_to_square_matrix().df diff --git a/tests/gentropy/dataset/test_study_locus_overlaps.py b/tests/gentropy/dataset/test_study_locus_overlaps.py index 6a812fb39..669af476f 100644 --- a/tests/gentropy/dataset/test_study_locus_overlaps.py +++ b/tests/gentropy/dataset/test_study_locus_overlaps.py @@ -1,15 +1,17 @@ """Test colocalisation dataset.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any +import pyspark.sql.functions as f import pyspark.sql.types as t import pytest + from gentropy.dataset.study_locus import StudyLocus from gentropy.dataset.study_locus_overlap import StudyLocusOverlap if TYPE_CHECKING: - from gentropy.dataset.study_index import StudyIndex from pyspark.sql import SparkSession @@ -20,66 +22,147 @@ def test_study_locus_overlap_creation( assert isinstance(mock_study_locus_overlap, StudyLocusOverlap) -def test_study_locus_overlap_from_associations( - mock_study_locus: StudyLocus, mock_study_index: StudyIndex -) -> None: +def test_study_locus_overlap_from_associations(mock_study_locus: StudyLocus) -> None: """Test colocalisation creation from mock associations.""" - overlaps = StudyLocusOverlap.from_associations(mock_study_locus, mock_study_index) + overlaps = StudyLocusOverlap.from_associations(mock_study_locus) assert isinstance(overlaps, StudyLocusOverlap) @pytest.mark.parametrize( - ("observed", "expected"), + ("observed", "intrastudy", "expected"), [ ( # observed - input DataFrame representing gwas and nongwas data to find overlapping signals [ { - "studyLocusId": 1, + "studyLocusId": "1", + "studyId": "A", "studyType": "gwas", "chromosome": "1", "tagVariantId": "A", }, { - "studyLocusId": 2, + "studyLocusId": "2", + "studyId": "B", "studyType": "eqtl", "chromosome": "1", "tagVariantId": "A", }, { - "studyLocusId": 3, + "studyLocusId": "3", + "studyId": "C", "studyType": "gwas", "chromosome": "1", "tagVariantId": "B", }, ], + # intrastudy - bool of whether or not to use inter-study or intra-study logic + False, # expected - output DataFrame with overlapping signals [ - {"leftStudyLocusId": 1, "rightStudyLocusId": 2, "chromosome": "1"}, + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + }, + ], + ), + ( + # observed - input DataFrame representing intra-study data to find overlapping signals in the same study + [ + { + "studyLocusId": "1", + "studyId": "A", + "studyType": "gwas", + "chromosome": "1", + "region": "X", + "tagVariantId": "A", + }, + { + "studyLocusId": "2", + "studyId": "A", + "studyType": "gwas", + "chromosome": "1", + "region": "Y", + "tagVariantId": "A", + }, + { + "studyLocusId": "3", + "studyId": "B", + "studyType": "gwas", + "chromosome": "1", + "region": "X", + "tagVariantId": "A", + }, + ], + # intrastudy - bool of whether or not to use inter-study or intra-study logic + True, + # expected - output DataFrame with overlapping signals + [ + { + "leftStudyLocusId": "2", + "rightStudyLocusId": "1", + "rightStudyType": "gwas", + "chromosome": "1", + } ], ), ], ) def test_overlapping_peaks( - spark: SparkSession, observed: list[dict[str, Any]], expected: list[dict[str, Any]] + spark: SparkSession, + observed: list[dict[str, Any]], + intrastudy: bool, + expected: list[dict[str, Any]], ) -> None: """Test overlapping signals between GWAS-GWAS and GWAS-Molecular trait to make sure that mQTLs are always on the right.""" mock_schema = t.StructType( [ - t.StructField("studyLocusId", t.LongType()), + t.StructField("studyLocusId", t.StringType()), + t.StructField("studyId", t.StringType()), t.StructField("studyType", t.StringType()), t.StructField("chromosome", t.StringType()), + t.StructField("region", t.StringType()), t.StructField("tagVariantId", t.StringType()), ] ) expected_schema = t.StructType( [ - t.StructField("leftStudyLocusId", t.LongType()), - t.StructField("rightStudyLocusId", t.LongType()), + t.StructField("leftStudyLocusId", t.StringType()), + t.StructField("rightStudyLocusId", t.StringType()), + t.StructField("rightStudyType", t.StringType()), t.StructField("chromosome", t.StringType()), ] ) observed_df = spark.createDataFrame(observed, mock_schema) - result_df = StudyLocus._overlapping_peaks(observed_df) + result_df = StudyLocus._overlapping_peaks(observed_df, intrastudy) expected_df = spark.createDataFrame(expected, expected_schema) assert result_df.collect() == expected_df.collect() + + +class TestStudyLocusOverlap: + """Test the overlapping of StudyLocus dataset.""" + + @pytest.fixture(autouse=True) + def setup( + self: TestStudyLocusOverlap, study_locus_sample_for_colocalisation: StudyLocus + ) -> None: + """Get sample dataset.""" + # Store imput dataset: + self.study_locus = study_locus_sample_for_colocalisation + + # Call locus overlap: + self.overlaps = study_locus_sample_for_colocalisation.find_overlaps() + + def test_coloc_return_type(self: TestStudyLocusOverlap) -> None: + """Test get_schema.""" + assert isinstance(self.overlaps, StudyLocusOverlap) + + def test_coloc_not_null(self: TestStudyLocusOverlap) -> None: + """Test get_schema.""" + assert self.overlaps.df.count() != 0 + + def test_coloc_study_type_not_null(self: TestStudyLocusOverlap) -> None: + """Test get_schema.""" + assert self.overlaps.filter(f.col("rightStudyType").isNull()).df.count() == 0 diff --git a/tests/gentropy/dataset/test_summary_statistics.py b/tests/gentropy/dataset/test_summary_statistics.py index b148994b6..b1b06442b 100644 --- a/tests/gentropy/dataset/test_summary_statistics.py +++ b/tests/gentropy/dataset/test_summary_statistics.py @@ -1,11 +1,14 @@ """Test study index dataset.""" + from __future__ import annotations from typing import TYPE_CHECKING +from pyspark.sql import types as t + +from gentropy.common.genomic_region import GenomicRegion from gentropy.dataset.study_locus import StudyLocus from gentropy.dataset.summary_statistics import SummaryStatistics -from pyspark.sql import types as t if TYPE_CHECKING: from pyspark.sql import SparkSession @@ -42,7 +45,10 @@ def test_summary_statistics__exclude_region__return_type( ) -> None: """Testing if the exclude region method returns the right datatype.""" assert isinstance( - mock_summary_statistics.exclude_region("chr12:124-1245"), SummaryStatistics + mock_summary_statistics.exclude_region( + GenomicRegion.from_string("chr12:124-1245") + ), + SummaryStatistics, ) @@ -83,7 +89,7 @@ def test_summary_statistics__exclude_region__correctness( df = spark.createDataFrame(data, schema=schema) filtered_sumstas = SummaryStatistics( _df=df, _schema=SummaryStatistics.get_schema() - ).exclude_region("c1:9-16") + ).exclude_region(GenomicRegion.from_string("c1:9-16")) # Test for the correct number of rows returned: assert filtered_sumstas.df.count() == 8 diff --git a/tests/gentropy/dataset/test_v2g.py b/tests/gentropy/dataset/test_v2g.py deleted file mode 100644 index e53395fe4..000000000 --- a/tests/gentropy/dataset/test_v2g.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Tests V2G dataset.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -from gentropy.dataset.v2g import V2G - -if TYPE_CHECKING: - from gentropy.dataset.gene_index import GeneIndex - - -def test_v2g_creation(mock_v2g: V2G) -> None: - """Test v2g creation with mock data.""" - assert isinstance(mock_v2g, V2G) - - -def test_v2g_filter_by_genes(mock_v2g: V2G, mock_gene_index: GeneIndex) -> None: - """Test v2g filter by genes.""" - assert isinstance( - mock_v2g.filter_by_genes(mock_gene_index), - V2G, - ) diff --git a/tests/gentropy/dataset/test_variant_annotation.py b/tests/gentropy/dataset/test_variant_annotation.py deleted file mode 100644 index 563d3c05c..000000000 --- a/tests/gentropy/dataset/test_variant_annotation.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Tests variant annotation dataset.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from gentropy.dataset.gene_index import GeneIndex - -from gentropy.dataset.v2g import V2G -from gentropy.dataset.variant_annotation import VariantAnnotation - - -def test_variant_index_creation(mock_variant_annotation: VariantAnnotation) -> None: - """Test gene index creation with mock gene index.""" - assert isinstance(mock_variant_annotation, VariantAnnotation) - - -def test_get_plof_v2g( - mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex -) -> None: - """Test get_plof_v2g with mock variant annotation.""" - assert isinstance(mock_variant_annotation.get_plof_v2g(mock_gene_index), V2G) - - -def test_get_distance_to_tss( - mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex -) -> None: - """Test get_distance_to_tss with mock variant annotation.""" - assert isinstance(mock_variant_annotation.get_distance_to_tss(mock_gene_index), V2G) diff --git a/tests/gentropy/dataset/test_variant_index.py b/tests/gentropy/dataset/test_variant_index.py index c79a04092..43c409ea6 100644 --- a/tests/gentropy/dataset/test_variant_index.py +++ b/tests/gentropy/dataset/test_variant_index.py @@ -1,13 +1,17 @@ """Tests on variant index generation.""" + from __future__ import annotations from typing import TYPE_CHECKING +import pytest +from pyspark.sql import functions as f +from pyspark.sql import types as t + from gentropy.dataset.variant_index import VariantIndex if TYPE_CHECKING: - from gentropy.dataset.study_locus import StudyLocus - from gentropy.dataset.variant_annotation import VariantAnnotation + from pyspark.sql import SparkSession def test_variant_index_creation(mock_variant_index: VariantIndex) -> None: @@ -15,11 +19,157 @@ def test_variant_index_creation(mock_variant_index: VariantIndex) -> None: assert isinstance(mock_variant_index, VariantIndex) -def test_from_variant_annotation( - mock_variant_annotation: VariantAnnotation, mock_study_locus: StudyLocus -) -> None: - """Test variant index creation from variant annotation.""" - variant_index = VariantIndex.from_variant_annotation( - mock_variant_annotation, mock_study_locus +class TestVariantIndex: + """Collection of tests around the functionality and shape of the variant index.""" + + MOCK_ANNOTATION_DATA = [ + ("v1", "c1", 2, "T", "A", ["rs5"], "really bad consequence"), + ( + "v4_long", + "c1", + 5, + "T", + "A", + ["rs6"], + "mild consequence", + ), # should be hashed automatically + ] + + MOCK_DATA = [ + ("v1", "c1", 2, "T", "A", ["rs1"]), + ("v2", "c1", 3, "T", "A", ["rs2", "rs3"]), + ("v3", "c1", 4, "T", "A", None), + ("v4_long", "c1", 5, "T", "A", None), # should be hashed automatically + ] + + MOCK_SCHEMA = t.StructType( + [ + t.StructField("variantId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("position", t.IntegerType(), False), + t.StructField("referenceAllele", t.StringType(), False), + t.StructField("alternateAllele", t.StringType(), False), + t.StructField("rsIds", t.ArrayType(t.StringType(), True), True), + ] + ) + + # The mock annotation has an extra column that needs to be propagated to the annotated data: + MOCK_ANNOTATION_SCHEMA = t.StructType( + [ + t.StructField("variantId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("position", t.IntegerType(), False), + t.StructField("referenceAllele", t.StringType(), False), + t.StructField("alternateAllele", t.StringType(), False), + t.StructField("rsIds", t.ArrayType(t.StringType(), True), True), + t.StructField("mostSevereConsequenceId", t.StringType(), False), + ] + ) + + @pytest.fixture(autouse=True) + def _setup(self: TestVariantIndex, spark: SparkSession) -> None: + """Setting up the test. + + Args: + spark (SparkSession): Spark session. + """ + # Create dataframe: + self.df = spark.createDataFrame(self.MOCK_DATA, schema=self.MOCK_SCHEMA) + # Loading variant index: + self.variant_index = VariantIndex( + _df=self.df, _schema=VariantIndex.get_schema(), id_threshold=2 + ) + + # Loading annotation variant index: + self.annotation = VariantIndex( + _df=spark.createDataFrame( + self.MOCK_ANNOTATION_DATA, schema=self.MOCK_ANNOTATION_SCHEMA + ), + _schema=VariantIndex.get_schema(), + id_threshold=2, + ) + + def test_init_type(self: TestVariantIndex) -> None: + """Just make sure the right datatype is created.""" + assert isinstance(self.variant_index, VariantIndex) + + def test_removed_null_values(self: TestVariantIndex) -> None: + """Making sure upon initialisation, the null values are removed and were replaced with empty arrays.""" + # RsIds column cannot be null: + assert self.variant_index.df.filter(f.col("rsIds").isNull()).count() == 0 + + # However can be empty array: + assert self.variant_index.df.filter(f.size("rsIds") == 0).count() > 0 + + def test_annotation_return_type(self: TestVariantIndex) -> None: + """Make sure the annotation method returns a dataframe.""" + assert isinstance( + self.variant_index.add_annotation(self.annotation), VariantIndex + ) + + def test_new_column_added(self: TestVariantIndex) -> None: + """Make sure the annotation method adds a new column.""" + assert ( + "mostSevereConsequenceId" + in self.variant_index.add_annotation(self.annotation).df.columns + ) + + def test_new_column_correct(self: TestVariantIndex) -> None: + """Make sure the annotation method adds the correct values.""" + assert ( + self.variant_index.add_annotation(self.annotation) + .df.filter(f.col("mostSevereConsequenceId").isNotNull()) + .count() + == 2 + ) + + def test_rsid_column_updated(self: TestVariantIndex) -> None: + """Make sure the annotation method updates the rsId column.""" + # RsId added to a new row: + assert ( + self.variant_index.add_annotation(self.annotation) + .df.filter(f.size("rsIds") > 0) + .count() + == 3 + ) + + # RsID added to an existing row: + assert ( + self.variant_index.add_annotation(self.annotation) + .df.filter(f.size("rsIds") > 1) + .count() + == 2 + ) + + def test_variantid_column_hashed(self: TestVariantIndex) -> None: + """Make sure the variantId column is hashed during initialisation. Threshold is set to 2, so var_4_long should be hashed.""" + assert ( + self.variant_index.df.filter(f.col("variantId").startswith("OTVAR")).count() + != 0 + ) + + @pytest.mark.parametrize( + "distance_type", ["distanceFromTss", "distanceFromFootprint"] ) - assert isinstance(variant_index, VariantIndex) + def test_get_distance_to_gene( + self: TestVariantIndex, mock_variant_index: VariantIndex, distance_type: str + ) -> None: + """Assert that the function returns a df with the requested columns.""" + expected_cols = ["variantId", "targetId", distance_type] + observed = mock_variant_index.get_distance_to_gene(distance_type=distance_type) + for col in expected_cols: + assert col in observed.columns, f"Column {col} not in {observed.columns}" + + def test_get_loftee( + self: TestVariantIndex, mock_variant_index: VariantIndex + ) -> None: + """Assert that the function returns a df with the requested columns.""" + expected_cols = [ + "variantId", + "targetId", + "lofteePrediction", + "isHighQualityPlof", + ] + observed = mock_variant_index.get_loftee() + for col in expected_cols: + assert col in observed.columns, f"Column {col} not in {observed.columns}" diff --git a/tests/gentropy/datasource/biosample_ontologies/test_biosample_ontology.py b/tests/gentropy/datasource/biosample_ontologies/test_biosample_ontology.py new file mode 100644 index 000000000..a9099048c --- /dev/null +++ b/tests/gentropy/datasource/biosample_ontologies/test_biosample_ontology.py @@ -0,0 +1,54 @@ +"""Tests for biosample index dataset.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from gentropy.dataset.biosample_index import BiosampleIndex +from gentropy.datasource.biosample_ontologies.utils import extract_ontology_from_json + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +class TestOntologyParger: + """Testing ontology parser.""" + + SAMPLE_CELL_ONTOLOGY_PATH = "tests/gentropy/data_samples/cell_ontology_sample.json" + SAMPLE_UBERON_PATH = "tests/gentropy/data_samples/uberon_sample.json" + SAMPLE_EFO_PATH = "tests/gentropy/data_samples/efo_biosample_sample.json" + + def test_ontology_parser(self: TestOntologyParger, spark: SparkSession) -> None: + """Test all ontology parsers.""" + cell_ontology = extract_ontology_from_json( + self.SAMPLE_CELL_ONTOLOGY_PATH, spark + ) + uberon = extract_ontology_from_json(self.SAMPLE_UBERON_PATH, spark) + efo_cell_line = extract_ontology_from_json( + self.SAMPLE_EFO_PATH, spark + ).retain_rows_with_ancestor_id(["CL_0000000"]) + + assert isinstance( + cell_ontology, BiosampleIndex + ), "Cell ontology subset is not parsed correctly to BiosampleIndex." + assert isinstance( + uberon, BiosampleIndex + ), "Uberon subset is not parsed correctly to BiosampleIndex." + assert isinstance( + efo_cell_line, BiosampleIndex + ), "EFO cell line subset is not parsed correctly to BiosampleIndex." + + def test_merge_biosample_indices( + self: TestOntologyParger, spark: SparkSession + ) -> None: + """Test merging of biosample indices.""" + cell_ontology = extract_ontology_from_json( + self.SAMPLE_CELL_ONTOLOGY_PATH, spark + ) + uberon = extract_ontology_from_json(self.SAMPLE_UBERON_PATH, spark) + efo = extract_ontology_from_json(self.SAMPLE_EFO_PATH, spark) + + merged = cell_ontology.merge_indices([uberon, efo]) + assert isinstance( + merged, BiosampleIndex + ), "Merging of biosample indices is not correct." diff --git a/tests/gentropy/datasource/ensembl/test_vep_variants.py b/tests/gentropy/datasource/ensembl/test_vep_variants.py new file mode 100644 index 000000000..556a22411 --- /dev/null +++ b/tests/gentropy/datasource/ensembl/test_vep_variants.py @@ -0,0 +1,183 @@ +"""Testing VEP parsing and variant index extraction.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from pyspark.sql import DataFrame +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.dataset.variant_index import VariantIndex +from gentropy.datasource.ensembl.vep_parser import VariantEffectPredictorParser + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +class TestVEPParserInSilicoExtractor: + """Testing the _vep_in_silico_prediction_extractor method of the VEP parser class. + + These tests assumes that the _get_most_severe_transcript() method works correctly, as it's not tested. + + The test cases try to cover the following scenarios: + - Transcripts with no assessments. + - Transcripts without assessments flag. + - Transcripts with no score. + - Testing cases, where no score column is provided. + """ + + # Data prototype: + SAMPLE_DATA = [ + # Complete dataset: + ("v1", "deleterious", 0.1, "gene1", "flag"), + # No assessment: + ("v2", None, 0.1, "gene1", "flag"), + # No flag: + ("v3", "deleterious", 0.1, "gene1", None), + # No score: + ("v4", "deleterious", None, "gene1", "flag"), + ] + + SAMPLE_COLUMNS = ["variantId", "assessment", "score", "gene_id", "flag"] + + @pytest.fixture(autouse=True) + def _setup(self: TestVEPParserInSilicoExtractor, spark: SparkSession) -> None: + """Setup fixture.""" + parsed_df = ( + spark.createDataFrame(self.SAMPLE_DATA, self.SAMPLE_COLUMNS) + .groupBy("variantId") + .agg( + f.collect_list( + f.struct( + f.col("assessment").alias("assessment"), + f.col("score").alias("score"), + f.col("flag").alias("flag"), + f.col("gene_id").alias("gene_id"), + ) + ).alias("transcripts") + ) + .select( + "variantId", + VariantEffectPredictorParser._vep_in_silico_prediction_extractor( + "transcripts", "method_name", "score", "assessment", "flag" + ).alias("in_silico_predictions"), + ) + ).persist() + + self.df = parsed_df + + def test_in_silico_output_missing_value( + self: TestVEPParserInSilicoExtractor, + ) -> None: + """Test if the in silico output count is correct.""" + variant_with_missing_score = [ + x[0] for x in filter(lambda x: x[2] is None, self.SAMPLE_DATA) + ] + # Assert that the correct variants return null: + assert ( + [ + x["variantId"] + for x in self.df.filter( + f.col("in_silico_predictions").isNull() + ).collect() + ] + == variant_with_missing_score + ), "Not the right variants got nullified in-silico predictor object." + + +class TestVEPParser: + """Testing VEP parser class. + + Some of the input data: + - 6_151445307_C_T - complicated variant with numerous annotations. + - 2_140699625_G_GT - simple variant with no annotations whatsoever. + """ + + SAMPLE_VEP_DATA_PATH = "tests/gentropy/data_samples/vep_sample.jsonl" + + @pytest.fixture(autouse=True) + def _setup(self: TestVEPParser, spark: SparkSession) -> None: + """Setup fixture.""" + self.raw_vep_output = spark.read.json( + self.SAMPLE_VEP_DATA_PATH, + schema=VariantEffectPredictorParser.get_schema(), + ) + self.processed_vep_output = VariantEffectPredictorParser.process_vep_output( + self.raw_vep_output, 200 + ) + + def test_extract_variant_index_from_vep( + self: TestVEPParser, spark: SparkSession + ) -> None: + """Test if the variant index can be extracted from the VEP output.""" + variant_index = VariantEffectPredictorParser.extract_variant_index_from_vep( + spark, self.SAMPLE_VEP_DATA_PATH, hash_threshold=100 + ) + + assert isinstance( + variant_index, VariantIndex + ), "VariantIndex object not created." + in_silico_schema = t.ArrayType( + t.StructType( + [ + t.StructField("method", t.StringType(), True), + t.StructField("assessment", t.StringType(), True), + t.StructField("score", t.FloatType(), True), + t.StructField("assessmentFlag", t.StringType(), True), + t.StructField("targetId", t.StringType(), True), + ] + ) + ) + assert ( + variant_index.df.select("inSilicoPredictors").schema.fields[0].dataType + == in_silico_schema + ), "In silico schema is not correct." + + def test_process(self: TestVEPParser) -> None: + """Test process method.""" + df = VariantEffectPredictorParser.process_vep_output(self.raw_vep_output) + assert isinstance(df, DataFrame), "Processed VEP output is not a DataFrame." + assert df.count() > 0, "No variant data in processed VEP dataframe." + + def test_conversion(self: TestVEPParser) -> None: + """Test if processed data can be converted into a VariantIndex object.""" + variant_index = VariantIndex( + _df=self.processed_vep_output, + _schema=VariantIndex.get_schema(), + ) + + assert isinstance( + variant_index, VariantIndex + ), "VariantIndex object not created." + + def test_variant_count(self: TestVEPParser) -> None: + """Test if the number of variants is correct. + + It is expected that all rows from the parsed VEP output are present in the processed VEP output. + """ + assert ( + self.raw_vep_output.count() == self.processed_vep_output.count() + ), f"Incorrect number of variants in processed VEP output: expected {self.raw_vep_output.count()}, got {self.processed_vep_output.count()}." + + def test_collection(self: TestVEPParser) -> None: + """Test if the collection of VEP variantIndex runs without failures.""" + assert ( + len(self.processed_vep_output.collect()) + == self.processed_vep_output.count() + ), "Collection performed incorrectly." + + def test_ensembl_transcripts_no_duplicates(self: TestVEPParser) -> None: + """Test if in single row all ensembl target ids (gene ids) do not have duplicates.""" + targets = ( + self.processed_vep_output.limit(1) + .select(f.explode("transcriptConsequences").alias("t")) + .select("t.targetId") + .collect() + ) + + asserted_targets = [t["targetId"] for t in targets] + assert len(asserted_targets) == len( + set(asserted_targets) + ), "Duplicate ensembl transcripts in a single row." diff --git a/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue.py b/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue.py new file mode 100644 index 000000000..4e7a87cc4 --- /dev/null +++ b/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue.py @@ -0,0 +1,73 @@ +"""Tests for study index dataset from eQTL Catalogue.""" + +from __future__ import annotations + +import pytest +from pyspark.sql import DataFrame +from pyspark.sql import functions as f + +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.study_locus import StudyLocus +from gentropy.datasource.eqtl_catalogue.finemapping import EqtlCatalogueFinemapping +from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex + + +@pytest.fixture +def processed_finemapping_df( + sample_eqtl_catalogue_studies_metadata: DataFrame, + sample_eqtl_catalogue_finemapping_credible_sets: DataFrame, + sample_eqtl_catalogue_finemapping_lbf: DataFrame, +) -> DataFrame: + """Return a DataFrame after joining credible sets and LBFs.""" + return EqtlCatalogueFinemapping.parse_susie_results( + sample_eqtl_catalogue_finemapping_credible_sets, + sample_eqtl_catalogue_finemapping_lbf, + sample_eqtl_catalogue_studies_metadata, + ) + + +def test_parse_susie_results( + sample_eqtl_catalogue_finemapping_credible_sets: DataFrame, + sample_eqtl_catalogue_finemapping_lbf: DataFrame, + sample_eqtl_catalogue_studies_metadata: DataFrame, +) -> None: + """Test parsing SuSIE results.""" + assert isinstance( + EqtlCatalogueFinemapping.parse_susie_results( + sample_eqtl_catalogue_finemapping_credible_sets, + sample_eqtl_catalogue_finemapping_lbf, + sample_eqtl_catalogue_studies_metadata, + ), + DataFrame, + ) + + +class TestEqtlCatalogueStudyLocus: + """Test the correctness of the study locus dataset from eQTL Catalogue.""" + + @pytest.fixture(autouse=True) + def _setup(self, processed_finemapping_df: DataFrame) -> DataFrame: + """Set up the test.""" + self.study_locus = EqtlCatalogueFinemapping.from_susie_results( + processed_finemapping_df + ) + + def test_credsets_from_susie_results(self: TestEqtlCatalogueStudyLocus) -> None: + """Test creating a study locus from SuSIE results.""" + assert isinstance(self.study_locus, StudyLocus) + + def test_locus_uniqueness(self: TestEqtlCatalogueStudyLocus) -> None: + """Test the uniqueness of the locus.""" + find_discrepancies = self.study_locus.df.select( + f.size("locus").alias("locus_size"), + f.size(f.array_distinct("locus")).alias("locus_distinct_size"), + ).filter(f.col("locus_size") != f.col("locus_distinct_size")) + assert find_discrepancies.count() == 0 + + +def test_studies_from_susie_results(processed_finemapping_df: DataFrame) -> None: + """Test creating a study index from SuSIE results.""" + assert isinstance( + EqtlCatalogueStudyIndex.from_susie_results(processed_finemapping_df), + StudyIndex, + ) diff --git a/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py b/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py deleted file mode 100644 index d68550e07..000000000 --- a/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_study_index.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Tests for study index dataset from eQTL Catalogue.""" - -from __future__ import annotations - -from gentropy.dataset.study_index import StudyIndex -from gentropy.datasource.eqtl_catalogue.study_index import EqtlCatalogueStudyIndex -from pyspark.sql import DataFrame - - -def test_eqtl_catalogue_study_index_from_source( - sample_eqtl_catalogue_studies: DataFrame, -) -> None: - """Test study index from source.""" - assert isinstance( - EqtlCatalogueStudyIndex.from_source( - sample_eqtl_catalogue_studies, - ), - StudyIndex, - ) diff --git a/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py b/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py deleted file mode 100644 index 3661f6b41..000000000 --- a/tests/gentropy/datasource/eqtl_catalogue/test_eqtl_catalogue_summary_stats.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Tests for study index dataset from eQTL Catalogue.""" - -from __future__ import annotations - -from gentropy.dataset.summary_statistics import SummaryStatistics -from gentropy.datasource.eqtl_catalogue.summary_stats import EqtlCatalogueSummaryStats -from pyspark.sql import DataFrame - - -def test_eqtl_catalogue_summary_stats_from_source( - sample_eqtl_catalogue_summary_stats: DataFrame, -) -> None: - """Test summary statistics from source.""" - assert isinstance( - EqtlCatalogueSummaryStats.from_source(sample_eqtl_catalogue_summary_stats), - SummaryStatistics, - ) diff --git a/tests/gentropy/datasource/finngen/test_finngen_finemapping.py b/tests/gentropy/datasource/finngen/test_finngen_finemapping.py index 089b10f74..4c7e12bf5 100644 --- a/tests/gentropy/datasource/finngen/test_finngen_finemapping.py +++ b/tests/gentropy/datasource/finngen/test_finngen_finemapping.py @@ -2,21 +2,88 @@ from __future__ import annotations +from pathlib import Path + +import hail as hl +import pytest +from pyspark.sql import SparkSession + +from gentropy.common.session import Session from gentropy.dataset.study_locus import StudyLocus from gentropy.datasource.finngen.finemapping import FinnGenFinemapping -from pyspark.sql import SparkSession +from gentropy.finngen_finemapping_ingestion import FinnGenFinemappingIngestionStep +@pytest.mark.parametrize( + [ + "finngen_susie_finemapping_snp_files", + "finngen_susie_finemapping_cs_summary_files", + ], + [ + pytest.param( + "tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.gz", + "tests/gentropy/data_samples/finngen_credset_summary_sample.tsv", + id="non block compressed files", + ), + pytest.param( + "tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.bgz", + "tests/gentropy/data_samples/finngen_credset_summary_sample.tsv.bgz", + id="block compressed files", + ), + ], +) def test_finngen_finemapping_from_finngen_susie_finemapping( spark: SparkSession, + finngen_susie_finemapping_snp_files: str, + finngen_susie_finemapping_cs_summary_files: str, ) -> None: """Test finemapping results (SuSie) from source.""" + hl.init(sc=spark.sparkContext, log="/dev/null", idempotent=True) assert isinstance( FinnGenFinemapping.from_finngen_susie_finemapping( spark=spark, - finngen_finemapping_df="tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.gz", - finngen_finemapping_summaries="tests/gentropy/data_samples/finngen_credset_summary_sample.tsv", - finngen_release_prefix="FINNGEN_R10", + finngen_susie_finemapping_snp_files=finngen_susie_finemapping_snp_files, + finngen_susie_finemapping_cs_summary_files=finngen_susie_finemapping_cs_summary_files, + finngen_release_prefix="FINNGEN_R11", ), StudyLocus, ) + + +@pytest.mark.parametrize( + [ + "finngen_susie_finemapping_snp_files", + "finngen_susie_finemapping_cs_summary_files", + ], + [ + pytest.param( + "tests/gentropy/data_samples/finngen_R9_AB1_EBV.SUSIE.snp.gz", + "tests/gentropy/data_samples/finngen_credset_summary_sample.tsv", + id="non block compressed files", + ), + ], +) +@pytest.mark.step_test +def test_finngen_finemapping_ingestion_step( + session: Session, + finngen_susie_finemapping_snp_files: str, + finngen_susie_finemapping_cs_summary_files: str, + tmp_path: Path, +) -> None: + """Test finngen finemapping ingestion step.""" + output_path = tmp_path / "output" + FinnGenFinemappingIngestionStep( + session=session, + finngen_finemapping_out=str(output_path), + finngen_susie_finemapping_cs_summary_files=finngen_susie_finemapping_cs_summary_files, + finngen_susie_finemapping_snp_files=finngen_susie_finemapping_snp_files, + finngen_finemapping_lead_pvalue_threshold=1e-5, + finngen_release_prefix="FINNGEN_R11", + ) + assert output_path.is_dir() + assert (output_path / "_SUCCESS").exists() + + cs = StudyLocus.from_parquet(session=session, path=str(output_path)) + assert cs.df.count() == 1 + study_id: str = cs.df.select("studyId").collect()[0]["studyId"] + assert study_id.startswith("FINNGEN_R11_") diff --git a/tests/gentropy/datasource/finngen/test_finngen_study_index.py b/tests/gentropy/datasource/finngen/test_finngen_study_index.py index 96a24db94..0d0537413 100644 --- a/tests/gentropy/datasource/finngen/test_finngen_study_index.py +++ b/tests/gentropy/datasource/finngen/test_finngen_study_index.py @@ -2,11 +2,391 @@ from __future__ import annotations +import json +from typing import TYPE_CHECKING +from unittest.mock import MagicMock + +import pytest +from pyspark.sql import DataFrame +from pyspark.sql import types as T + from gentropy.dataset.study_index import StudyIndex -from gentropy.datasource.finngen.study_index import FinnGenStudyIndex -from pyspark.sql import SparkSession +from gentropy.datasource.finngen.study_index import ( + FinngenPrefixMatch, + FinnGenStudyIndex, +) +from gentropy.finngen_studies import FinnGenStudiesStep + +if TYPE_CHECKING: + from pathlib import Path + from typing import Callable + + from pyspark.sql import SparkSession + + from gentropy.common.session import Session + + +@pytest.fixture() +def finngen_study_index_mock(spark: SparkSession) -> StudyIndex: + """Finngen minimal example for mocking join to the efo mappings.""" + data = [ + # NOTE: Study maps to a single EFO trait + ( + "FINNGEN_R11_STUDY_1", + "Actinomycosis", + "FINNGEN_R11", + "gwas", + ), + # NOTE: Study does not map to EFO traits + ( + "FINNGEN_R11_STUDY_2", + "Some other trait", + "FINNGEN_R11", + "gwas", + ), + # NOTE: Study maps to two EFO traits + ( + "FINNGEN_R11_STUDY_3", + "Glucose", + "FINNGEN_R11", + "gwas", + ), + ] + schema = T.StructType( + [ + T.StructField("studyId", T.StringType(), nullable=False), + T.StructField("traitFromSource", T.StringType(), nullable=False), + T.StructField("projectId", T.StringType(), nullable=False), + T.StructField("studyType", T.StringType(), nullable=False), + ] + ) + df = spark.createDataFrame(data=data, schema=schema) + return StudyIndex(_df=df, _schema=StudyIndex.get_schema()) + + +@pytest.fixture() +def finngen_phenotype_table_mock() -> str: + """This is the data extracted from https://r11.finngen.fi/api/phenos.""" + data = json.dumps( + [ + # NOTE: Study maps to single EFO trait. + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_ACTINOMYCOSIS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 0.93878, + "0.01": 0.96727, + "0.1": 0.85429, + "0.5": 0.52544, + }, + "num_cases": 113, + "num_cases_prev": 101, + "num_controls": 399149, + "num_controls_prev": 363227, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_ACTINOMYCOSIS", + "phenostring": "Actinomycosis", + }, + # NOTE: Study maps to multiple EFO traits. + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/GLUCOSE.gz" + ], + "category": "Glucose", + "category_index": 28, + "gc_lambda": { + "0.001": 1.1251, + "0.01": 1.062, + "0.1": 1.0531, + "0.5": 1.0599, + }, + "num_cases": 43764, + "num_cases_prev": 39231, + "num_controls": 409969, + "num_controls_prev": 372950, + "num_gw_significant": 3, + "num_gw_significant_prev": 3, + "phenocode": "GLUCOSE", + "phenostring": "Glucose", + }, + # NOTE: Study does not map to EFO traits + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/SOME_OTHER_TRAIT.gz" + ], + "category": "SomeOtherTrait", + "category_index": 28, + "gc_lambda": { + "0.001": 1.1251, + "0.01": 1.062, + "0.1": 1.0531, + "0.5": 1.0599, + }, + "num_cases": 43764, + "num_cases_prev": 39231, + "num_controls": 409969, + "num_controls_prev": 372950, + "num_gw_significant": 3, + "num_gw_significant_prev": 3, + "phenocode": "SOME_OTHER_TRAIT", + "phenostring": "Some other trait", + }, + ] + ) + return data + + +@pytest.fixture() +def efo_mappings_mock() -> list[tuple[str, str, str]]: + """EFO mappings mock based on https://raw.githubusercontent.com/opentargets/curation/24.09.1/mappings/disease/manual_string.tsv. + + Only required fields are extracted. + """ + data = [ + ( + "STUDY", + "PROPERTY_VALUE", + "SEMANTIC_TAG", + ), + ("FinnGen r11", "Actinomycosis", "http://www.ebi.ac.uk/efo/EFO_0007128"), + # NOTE: EFO does not map, as it's missing from the StudyIndex - hypothetical example. + ("FinnGen r11", "Bleeding", "http://purl.obolibrary.org/obo/MP_0001914"), + # NOTE: Two EFO traits for one disease should be collected to array - hypothetical example: + # Glucose tolerance test & NMR Glucose + ("FinnGen r11", "Glucose", "http://www.ebi.ac.uk/efo/EFO_0002571"), + ("FinnGen r11", "Glucose", "http://www.ebi.ac.uk/efo/EFO_0004468"), + # NOTE: EFO that does not map, due to study not from Finngen - hypothetical example. + ("PheWAS 2024", "Glucose", "http://www.ebi.ac.uk/efo/EFO_0000001"), + ] + return data + + +@pytest.fixture() +def efo_mappings_df_mock( + spark: SparkSession, efo_mappings_mock: list[tuple[str, str, str]] +) -> DataFrame: + """EFO mappings dataframe mock.""" + schema = T.StructType( + [ + T.StructField("STUDY", T.StringType(), nullable=False), + T.StructField("PROPERTY_VALUE", T.StringType(), nullable=False), + T.StructField("SEMANTIC_TAG", T.StringType(), nullable=False), + ] + ) + data = spark.createDataFrame(data=efo_mappings_mock, schema=schema) + return data + + +@pytest.fixture() +def urlopen_mock( + efo_mappings_mock: list[tuple[str, str, str, str]], + finngen_phenotype_table_mock: str, +) -> Callable[[str], MagicMock]: + """Mock object for requesting urlopen objects with proper encoding. + + This mock object allows to call `read` and `readlines` methods on two endpoints: + - https://finngen_phenotypes -> finngen_phenotype_table_mock + - https://efo_mappings -> efo_mappings_mock + The return values are mocks of the source data respectively. + """ -def test_finngen_study_index_from_source(spark: SparkSession) -> None: + def mock_response(url: str) -> MagicMock: + """Mock urllib.request.urlopen.""" + match url: + case "https://finngen_phenotypes": + value = finngen_phenotype_table_mock + case "https://efo_mappings": + value = "\n".join(["\t".join(row) for row in efo_mappings_mock]) + case _: + value = "" + mock_open = MagicMock() + mock_open.read.return_value = value.encode() + mock_open.readlines.return_value = value.encode().splitlines(keepends=True) + return mock_open + + return mock_response + + +@pytest.mark.step_test +def test_finngen_study_index_step( + monkeypatch: pytest.MonkeyPatch, + session: Session, + tmp_path: Path, + urlopen_mock: Callable[[str], MagicMock], +) -> None: + """Test step that generates finngen study index. + + FIXME: Currently we miss following columns when reading from source. + 'biosampleFromSourceId' + 'publicationTitle' + 'diseaseIds' + 'publicationDate' + 'geneId' + 'backgroundDiseaseIds' + 'pubmedId' + 'publicationJournal' + 'qualityControls' + 'backgroundTraitFromSourceMappedIds' + 'publicationFirstAuthor' + 'replicationSamples' + 'analysisFlags' + 'condition' + """ + with monkeypatch.context() as m: + m.setattr("gentropy.datasource.finngen.study_index.urlopen", urlopen_mock) + output_path = str(tmp_path / "study_index") + FinnGenStudiesStep( + session=session, + finngen_study_index_out=output_path, + finngen_phenotype_table_url="https://finngen_phenotypes", + finngen_release_prefix="FINNGEN_R11", + finngen_summary_stats_url_prefix="gs://finngen_data/sumstats", + finngen_summary_stats_url_suffix=".gz", + efo_curation_mapping_url="https://efo_mappings", + sample_size=5_000_000, + ) + study_index = StudyIndex.from_parquet(session=session, path=output_path) + # fmt: off + assert study_index.df.count() == 3, "Expected 3 rows that come from the input table." + assert "traitFromSourceMappedIds" in study_index.df.columns, "Expected that EFO terms were joined to the study_index table." + # fmt: on + + +def test_finngen_study_index_read_efo_curation( + monkeypatch: pytest.MonkeyPatch, + spark: SparkSession, + urlopen_mock: Callable[[str], MagicMock], +) -> None: + """Test reading efo curation.""" + with monkeypatch.context() as m: + m.setattr("gentropy.datasource.finngen.study_index.urlopen", urlopen_mock) + efo_df = FinnGenStudyIndex.read_efo_curation(spark, "https://efo_mappings") + assert isinstance(efo_df, DataFrame) + efo_df.show() + assert efo_df.count() == 5 + + +def test_finngen_study_index_from_source( + monkeypatch: pytest.MonkeyPatch, + spark: SparkSession, + urlopen_mock: Callable[[str], MagicMock], +) -> None: """Test study index from source.""" - assert isinstance(FinnGenStudyIndex.from_source(spark), StudyIndex) + with monkeypatch.context() as m: + m.setattr("gentropy.datasource.finngen.study_index.urlopen", urlopen_mock) + expected_sample_size = 5_000_000 + expected_project_id = "FINNGEN_R11" + study_index = FinnGenStudyIndex.from_source( + spark, + finngen_phenotype_table_url="https://finngen_phenotypes", + finngen_release_prefix=expected_project_id, + finngen_summary_stats_url_prefix="gs://finngen-public-data-r11/summary_stats/finngen_R11_", + finngen_summary_stats_url_suffix=".gz", + sample_size=expected_sample_size, + ) + # fmt: off + assert isinstance(study_index, StudyIndex), "Expect that we deal with StudyIndex object." + + all_columns = StudyIndex.get_schema().fieldNames() + assert set(all_columns).issuperset(set(study_index.df.columns)), "Expect all columns can be found in the schema of StudyIndex." + assert study_index.df.count() == 3, "Expect two rows at the study_index, as in the input." + + rows = study_index.df.collect() + expected_study_ids = ["FINNGEN_R11_AB1_ACTINOMYCOSIS", "FINNGEN_R11_GLUCOSE", "FINNGEN_R11_SOME_OTHER_TRAIT"] + assert "studyId" in study_index.df.columns, "Expect that studyId column exists." + assert sorted([v["studyId"] for v in rows]) == expected_study_ids, "Expect that studyIds are populated from input." + + assert "projectId" in study_index.df.columns, "Expect that projectId column exists." + assert {v["projectId"] for v in rows} == {expected_project_id}, "Expect projectId column is correctly populated." + + expected_sumstat_locations = [ + "gs://finngen-public-data-r11/summary_stats/finngen_R11_AB1_ACTINOMYCOSIS.gz", + "gs://finngen-public-data-r11/summary_stats/finngen_R11_GLUCOSE.gz", + "gs://finngen-public-data-r11/summary_stats/finngen_R11_SOME_OTHER_TRAIT.gz", + ] + assert "summarystatsLocation" in study_index.df.columns, "Expect that summarystatsLocation column exists." + sumstat_locations = sorted([v["summarystatsLocation"] for v in rows]) + assert sumstat_locations == expected_sumstat_locations, "Expect that summarystatsLocation is populated." + assert "ldPopulationStructure" in study_index.df.columns, "Expect that ldPopulationStructure column exists." + for row in rows: + ld_struct = row["ldPopulationStructure"][0] + assert ld_struct["ldPopulation"] == "fin", "Expect fin ld population structure." + assert ld_struct["relativeSampleSize"] == pytest.approx(1.0), "Expect relative sample size if fixed to be 1.0." + + assert "discoverySamples" in study_index.df.columns, "Expect that discoverySamples column exists." + for row in rows: + ds_struct = row["discoverySamples"][0] + assert ds_struct["ancestry"] == "Finnish", "Expect Finnish ancestry." + assert ds_struct["sampleSize"] == expected_sample_size, "Expect sample size to be fixed." + # fmt: on + + +@pytest.mark.parametrize( + ["prefix", "expected_output", "xfail"], + [ + pytest.param( + "FINNGEN_R11", + FinngenPrefixMatch(prefix="FINNGEN_R11", release="R11"), + False, + id="Correct prefix passed.", + ), + pytest.param( + "FINNGEN_R11_", + FinngenPrefixMatch(prefix="FINNGEN_R11", release="R11"), + False, + id="Underscore is removed from the prefix.", + ), + pytest.param( + "R11", + FinngenPrefixMatch(prefix="FINNGEN_R11", release="R11"), + True, + id="Incorrect prefix raises ValueError.", + ), + ], +) +def test_finngen_validate_release_prefix( + prefix: str, expected_output: FinngenPrefixMatch, xfail: bool +) -> None: + """Test validate_release_prefix.""" + if not xfail: + assert ( + FinnGenStudyIndex.validate_release_prefix(prefix) == expected_output + ), "Incorrect match object" + else: + with pytest.raises(ValueError): + FinnGenStudyIndex.validate_release_prefix(prefix) + + +def test_finngen_study_index_add_efos( + finngen_study_index_mock: StudyIndex, + efo_mappings_df_mock: DataFrame, +) -> None: + """Test finngen study index add efo ids.""" + efo_column_name = "traitFromSourceMappedIds" + # Expect that EFO column is not present when study index is generated. + assert efo_column_name not in finngen_study_index_mock.df.columns + study_index = FinnGenStudyIndex.join_efo_mapping( + finngen_study_index_mock, + finngen_release="R11", + efo_curation_mapping=efo_mappings_df_mock, + ) + # fmt: off + assert isinstance(study_index, StudyIndex), "Expect we have the StudyIndex object after joining EFOs." + assert efo_column_name in study_index.df.columns, "Expect that EFO column is present after joining EFOs." + assert study_index.df.count() == 3, "Expect we do not drop any studies, even if no EFO has been found." + # fmt: on + efos = { + row["studyId"]: sorted(row[efo_column_name]) + for row in study_index.df.select(efo_column_name, "studyId").collect() + } + expected_efos = { + "FINNGEN_R11_STUDY_1": ["EFO_0007128"], + "FINNGEN_R11_STUDY_2": [], + "FINNGEN_R11_STUDY_3": ["EFO_0002571", "EFO_0004468"], + } + assert expected_efos == efos, "Expect that EFOs are correctly assigned." diff --git a/tests/gentropy/datasource/finngen/test_finngen_summary_stats.py b/tests/gentropy/datasource/finngen/test_finngen_summary_stats.py index 624f66d66..73cffdc9f 100644 --- a/tests/gentropy/datasource/finngen/test_finngen_summary_stats.py +++ b/tests/gentropy/datasource/finngen/test_finngen_summary_stats.py @@ -2,9 +2,10 @@ from __future__ import annotations +from pyspark.sql import SparkSession + from gentropy.dataset.summary_statistics import SummaryStatistics from gentropy.datasource.finngen.summary_stats import FinnGenSummaryStats -from pyspark.sql import SparkSession def test_finngen_summary_stats_from_source(spark: SparkSession) -> None: diff --git a/tests/gentropy/datasource/gnomad/test_gnomad_ld.py b/tests/gentropy/datasource/gnomad/test_gnomad_ld.py index 5fa3b00a4..78b96ad84 100644 --- a/tests/gentropy/datasource/gnomad/test_gnomad_ld.py +++ b/tests/gentropy/datasource/gnomad/test_gnomad_ld.py @@ -7,10 +7,11 @@ import hail as hl import pytest -from gentropy.datasource.gnomad.ld import GnomADLDMatrix from pyspark.sql import DataFrame, SparkSession from pyspark.sql import functions as f +from gentropy.datasource.gnomad.ld import GnomADLDMatrix + @pytest.mark.parametrize( ("observed", "expected"), diff --git a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_associations.py b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_associations.py index de70e8b63..147f6c067 100644 --- a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_associations.py +++ b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_associations.py @@ -2,14 +2,15 @@ from __future__ import annotations -from gentropy.dataset.variant_annotation import VariantAnnotation +from pyspark.sql import DataFrame +from pyspark.sql import functions as f +from pyspark.sql.types import StringType + +from gentropy.dataset.variant_index import VariantIndex from gentropy.datasource.gwas_catalog.associations import ( GWASCatalogCuratedAssociationsParser, StudyLocusGWASCatalog, ) -from pyspark.sql import DataFrame -from pyspark.sql import functions as f -from pyspark.sql.types import LongType def test_study_locus_gwas_catalog_creation( @@ -50,29 +51,38 @@ def test_qc_ambiguous_study( def test_study_locus_gwas_catalog_from_source( - mock_variant_annotation: VariantAnnotation, + mock_variant_index: VariantIndex, sample_gwas_catalog_associations: DataFrame, ) -> None: """Test study locus from gwas catalog mock data.""" assert isinstance( GWASCatalogCuratedAssociationsParser.from_source( - sample_gwas_catalog_associations, mock_variant_annotation + sample_gwas_catalog_associations, mock_variant_index ), StudyLocusGWASCatalog, ) -def test__map_to_variant_annotation_variants( +def test_map_variants_to_variant_index( sample_gwas_catalog_associations: DataFrame, - mock_variant_annotation: VariantAnnotation, + mock_variant_index: VariantIndex, ) -> None: """Test mapping to variant annotation variants.""" assert isinstance( - GWASCatalogCuratedAssociationsParser._map_to_variant_annotation_variants( + GWASCatalogCuratedAssociationsParser._map_variants_to_gnomad_variants( sample_gwas_catalog_associations.withColumn( - "studyLocusId", f.monotonically_increasing_id().cast(LongType()) + "rowId", f.monotonically_increasing_id().cast(StringType()) ), - mock_variant_annotation, + mock_variant_index, ), DataFrame, ) + + +def test_qc_flag_all_tophits( + mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, +) -> None: + """Test qc flag all top hits.""" + assert isinstance( + mock_study_locus_gwas_catalog.qc_flag_all_tophits(), StudyLocusGWASCatalog + ) diff --git a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_curation.py b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_curation.py index 764d003e8..0dd1a7363 100644 --- a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_curation.py +++ b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_curation.py @@ -7,9 +7,10 @@ import pyspark.sql.functions as f import pyspark.sql.types as t import pytest -from gentropy.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog from pyspark.sql import DataFrame +from gentropy.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog + if TYPE_CHECKING: from pyspark.sql import SparkSession @@ -142,39 +143,6 @@ def test_curation__study_type_update( assert expected == observed - # Test update qc flag - @staticmethod - def test_curation__quality_controls( - mock_gwas_study_index: StudyIndexGWASCatalog, mock_study_curation: DataFrame - ) -> None: - """Test for making sure the study type got updated.""" - curated = mock_gwas_study_index.annotate_from_study_curation( - mock_study_curation - ) - - # Expected studyIds: - expected = [ - row["studyId"] - for row in ( - mock_study_curation.filter(f.col("qualityControls").isNotNull()) - .select("studyId") - .distinct() - .collect() - ) - ] - - observed = [ - row["studyId"] - for row in ( - curated.df.filter(f.size(f.col("qualityControls")) > 0) - .select("studyId") - .distinct() - .collect() - ) - ] - - assert expected == observed - # Test updated method flag @staticmethod def test_curation__analysis_flags( diff --git a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_index.py b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_index.py index 96dccdf9d..b3ff4e486 100644 --- a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_index.py +++ b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_index.py @@ -2,11 +2,12 @@ from __future__ import annotations +from pyspark.sql import DataFrame + from gentropy.datasource.gwas_catalog.study_index import ( StudyIndexGWASCatalog, StudyIndexGWASCatalogParser, ) -from pyspark.sql import DataFrame def test_annotate_discovery_sample_sizes( @@ -30,25 +31,8 @@ def test_parse_study_table(sample_gwas_catalog_studies: DataFrame) -> None: ) -def test_annotate_sumstats( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, - sample_gwas_catalog_harmonised_sumstats_list: DataFrame, -) -> None: - """Test annotate sumstats of GWASCatalogStudyIndex.""" - mock_study_index_gwas_catalog.df = mock_study_index_gwas_catalog.df.drop( - "summarystatsLocation" - ) - assert isinstance( - mock_study_index_gwas_catalog.annotate_sumstats_info( - sample_gwas_catalog_harmonised_sumstats_list - ), - StudyIndexGWASCatalog, - ) - - def test_study_index_from_source( sample_gwas_catalog_studies: DataFrame, - sample_gwas_catalog_harmonised_sumstats_list: DataFrame, sample_gwas_catalog_ancestries_lut: DataFrame, ) -> None: """Test study index from source.""" @@ -56,7 +40,6 @@ def test_study_index_from_source( StudyIndexGWASCatalogParser.from_source( sample_gwas_catalog_studies, sample_gwas_catalog_ancestries_lut, - sample_gwas_catalog_harmonised_sumstats_list, ), StudyIndexGWASCatalog, ) diff --git a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py index 2955cee91..c6bd03054 100644 --- a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py +++ b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py @@ -1,10 +1,12 @@ """Tests GWAS Catalog study splitter.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pytest + from gentropy.datasource.gwas_catalog.associations import StudyLocusGWASCatalog from gentropy.datasource.gwas_catalog.study_index import StudyIndexGWASCatalog from gentropy.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter diff --git a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py index 4ede62f36..867345455 100644 --- a/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py +++ b/tests/gentropy/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py @@ -6,6 +6,7 @@ import pyspark.sql.functions as f import pytest + from gentropy.dataset.summary_statistics import SummaryStatistics from gentropy.datasource.gwas_catalog.summary_statistics import ( GWASCatalogSummaryStatistics, diff --git a/tests/gentropy/datasource/intervals/test_andersson.py b/tests/gentropy/datasource/intervals/test_andersson.py index b7283597b..69575b7c3 100644 --- a/tests/gentropy/datasource/intervals/test_andersson.py +++ b/tests/gentropy/datasource/intervals/test_andersson.py @@ -1,12 +1,14 @@ """Test Andersson Intervals.""" + from __future__ import annotations import pytest +from pyspark.sql import DataFrame, SparkSession + from gentropy.common.Liftover import LiftOverSpark from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.intervals import Intervals from gentropy.datasource.intervals.andersson import IntervalsAndersson -from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") diff --git a/tests/gentropy/datasource/intervals/test_javierre.py b/tests/gentropy/datasource/intervals/test_javierre.py index be8c528e2..886a28c52 100644 --- a/tests/gentropy/datasource/intervals/test_javierre.py +++ b/tests/gentropy/datasource/intervals/test_javierre.py @@ -1,12 +1,14 @@ """Test JavierreIntervals.""" + from __future__ import annotations import pytest +from pyspark.sql import DataFrame, SparkSession + from gentropy.common.Liftover import LiftOverSpark from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.intervals import Intervals from gentropy.datasource.intervals.javierre import IntervalsJavierre -from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") diff --git a/tests/gentropy/datasource/intervals/test_jung.py b/tests/gentropy/datasource/intervals/test_jung.py index 81506ae55..e391b8f96 100644 --- a/tests/gentropy/datasource/intervals/test_jung.py +++ b/tests/gentropy/datasource/intervals/test_jung.py @@ -1,12 +1,14 @@ """Test Jung Intervals.""" + from __future__ import annotations import pytest +from pyspark.sql import DataFrame, SparkSession + from gentropy.common.Liftover import LiftOverSpark from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.intervals import Intervals from gentropy.datasource.intervals.jung import IntervalsJung -from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") diff --git a/tests/gentropy/datasource/intervals/test_thurman.py b/tests/gentropy/datasource/intervals/test_thurman.py index f89c9d3da..616e1abec 100644 --- a/tests/gentropy/datasource/intervals/test_thurman.py +++ b/tests/gentropy/datasource/intervals/test_thurman.py @@ -1,12 +1,14 @@ """Test Thurman.""" + from __future__ import annotations import pytest +from pyspark.sql import DataFrame, SparkSession + from gentropy.common.Liftover import LiftOverSpark from gentropy.dataset.gene_index import GeneIndex from gentropy.dataset.intervals import Intervals from gentropy.datasource.intervals.thurman import IntervalsThurman -from pyspark.sql import DataFrame, SparkSession @pytest.fixture(scope="module") diff --git a/tests/gentropy/datasource/open_targets/test_l2g_gold_standard.py b/tests/gentropy/datasource/open_targets/test_l2g_gold_standard.py index 448e2a50c..e6afc942f 100644 --- a/tests/gentropy/datasource/open_targets/test_l2g_gold_standard.py +++ b/tests/gentropy/datasource/open_targets/test_l2g_gold_standard.py @@ -1,29 +1,46 @@ """Test Open Targets L2G gold standards data source.""" + from __future__ import annotations from typing import TYPE_CHECKING import pytest +from pyspark.sql import DataFrame +from pyspark.sql.types import ( + ArrayType, + BooleanType, + IntegerType, + LongType, + StringType, + StructField, + StructType, +) + +from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix from gentropy.dataset.l2g_gold_standard import L2GGoldStandard -from gentropy.dataset.v2g import V2G +from gentropy.dataset.study_index import StudyIndex +from gentropy.dataset.variant_index import VariantIndex from gentropy.datasource.open_targets.l2g_gold_standard import ( OpenTargetsL2GGoldStandard, ) -from pyspark.sql import DataFrame +from gentropy.method.l2g.feature_factory import L2GFeatureInputLoader if TYPE_CHECKING: from pyspark.sql.session import SparkSession + from gentropy.dataset.colocalisation import Colocalisation + from gentropy.dataset.study_locus import StudyLocus + def test_open_targets_as_l2g_gold_standard( sample_l2g_gold_standard: DataFrame, - mock_v2g: V2G, + mock_variant_index: VariantIndex, ) -> None: """Test L2G gold standard from OTG curation.""" assert isinstance( OpenTargetsL2GGoldStandard.as_l2g_gold_standard( sample_l2g_gold_standard, - mock_v2g, + mock_variant_index, ), L2GGoldStandard, ) @@ -73,19 +90,52 @@ def _setup(self: TestExpandGoldStandardWithNegatives, spark: SparkSession) -> No ["variantId", "geneId", "studyId"], ) - sample_v2g_df = spark.createDataFrame( + sample_variant_index_df = spark.createDataFrame( [ - ("variant1", "gene1", 5, "X", "X", "X"), - ("variant1", "gene3", 10, "X", "X", "X"), - ], - [ - "variantId", - "geneId", - "distance", - "chromosome", - "datatypeId", - "datasourceId", + ( + "variant1", + "chrom", + 1, + "A", + "T", + [ + { + "distanceFromTss": 5, + "targetId": "gene1", + "isEnsemblCanonical": True, + }, + { + "distanceFromTss": 10, + "targetId": "gene3", + "isEnsemblCanonical": True, + }, + ], + ), ], + StructType( + [ + StructField("variantId", StringType(), True), + StructField("chromosome", StringType(), True), + StructField("position", IntegerType(), True), + StructField("referenceAllele", StringType(), True), + StructField("alternateAllele", StringType(), True), + StructField( + "transcriptConsequences", + ArrayType( + StructType( + [ + StructField("distanceFromTss", LongType(), True), + StructField("targetId", StringType(), True), + StructField( + "isEnsemblCanonical", BooleanType(), True + ), + ] + ) + ), + True, + ), + ] + ), ) self.expected_expanded_gs = spark.createDataFrame( @@ -99,6 +149,28 @@ def _setup(self: TestExpandGoldStandardWithNegatives, spark: SparkSession) -> No self.observed_df = ( OpenTargetsL2GGoldStandard.expand_gold_standard_with_negatives( self.sample_positive_set, - V2G(_df=sample_v2g_df, _schema=V2G.get_schema()), + VariantIndex( + _df=sample_variant_index_df, _schema=VariantIndex.get_schema() + ), ) ) + + +def test_build_feature_matrix( + mock_l2g_gold_standard: L2GGoldStandard, + mock_study_locus: StudyLocus, + mock_colocalisation: Colocalisation, + mock_study_index: StudyIndex, +) -> None: + """Test building feature matrix with the eQtlColocH4Maximum feature.""" + features_list = ["eQtlColocH4Maximum"] + loader = L2GFeatureInputLoader( + colocalisation=mock_colocalisation, + study_index=mock_study_index, + study_locus=mock_study_locus, + ) + fm = mock_study_locus.build_feature_matrix(features_list, loader) + assert isinstance( + mock_l2g_gold_standard.build_feature_matrix(fm, mock_study_locus), + L2GFeatureMatrix, + ), "Feature matrix should be of type L2GFeatureMatrix" diff --git a/tests/gentropy/datasource/open_targets/test_target.py b/tests/gentropy/datasource/open_targets/test_target.py index 33bb6ddc9..091dcea53 100644 --- a/tests/gentropy/datasource/open_targets/test_target.py +++ b/tests/gentropy/datasource/open_targets/test_target.py @@ -1,9 +1,11 @@ """Test Open Targets target data source.""" + from __future__ import annotations +from pyspark.sql import DataFrame + from gentropy.dataset.gene_index import GeneIndex from gentropy.datasource.open_targets.target import OpenTargetsTarget -from pyspark.sql import DataFrame def test_open_targets_as_gene_index(sample_target_index: DataFrame) -> None: diff --git a/tests/gentropy/datasource/open_targets/test_variants.py b/tests/gentropy/datasource/open_targets/test_variants.py new file mode 100644 index 000000000..6aa22e628 --- /dev/null +++ b/tests/gentropy/datasource/open_targets/test_variants.py @@ -0,0 +1,90 @@ +"""Test suite for the variants module of Open Targets.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from gentropy.dataset.study_locus import StudyLocus +from gentropy.datasource.open_targets.variants import OpenTargetsVariant + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + from gentropy.common.session import Session + + +class TestOpenTargetsVariant: + """Test suite for the OpenTargetsVariant class.""" + + def test_as_vcf_df_credible_set( + self: TestOpenTargetsVariant, + spark: SparkSession, + session: Session, + ) -> None: + """Test the as_vcf_df method.""" + df_credible_set_df = spark.createDataFrame( + [ + { + "studyLocusId": "1", + "variantId": "1_2_C_G", + "studyId": "study1", + "locus": [ + { + "variantId": "1_3_A_T", + }, + ], + }, + ], + StudyLocus.get_schema(), + ) + observed_df = OpenTargetsVariant.as_vcf_df(session, df_credible_set_df).orderBy( + *["#CHROM", "POS", "REF", "ALT"] + ) + + vcf_cols = ["#CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO"] + df_credible_set_expected_df = spark.createDataFrame( + [ + ("1", 2, ".", "C", "G", ".", ".", "."), + ("1", 3, ".", "A", "T", ".", ".", "."), + ], + vcf_cols, + ) + assert ( + observed_df.collect() == df_credible_set_expected_df.collect() + ), "Unexpected VCF dataframe." + + def test_as_vcf_df_without_variant_id( + self: TestOpenTargetsVariant, + spark: SparkSession, + session: Session, + ) -> None: + """Test the as_vcf_df method.""" + df_without_variant_id_df = spark.createDataFrame( + [("rs75493593",)], ["variantRsId"] + ) + observed_df = OpenTargetsVariant.as_vcf_df( + session, df_without_variant_id_df + ).orderBy(*["#CHROM", "POS", "REF", "ALT"]) + + assert observed_df.count() == 0, "A variant ID should be present for VCF step." + + def test_as_vcf_df_without_rs_id( + self: TestOpenTargetsVariant, + spark: SparkSession, + session: Session, + ) -> None: + """Test the as_vcf_df method with a dataframe of variants without an annotated variantRsId.""" + df_without_rs_id_df = spark.createDataFrame([("1_2_G_GA",)], ["variantId"]) + observed_df = OpenTargetsVariant.as_vcf_df(session, df_without_rs_id_df) + + vcf_cols = ["#CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO"] + df_without_rs_id_expected_df = spark.createDataFrame( + [ + ("1", 2, ".", "G", "GA", ".", ".", "."), + ], + vcf_cols, + ) + + assert ( + observed_df.collect() == df_without_rs_id_expected_df.collect() + ), "Unexpected VCF dataframe." diff --git a/tests/gentropy/datasource/ukbiobank/test_ukbiobank_study_index.py b/tests/gentropy/datasource/ukbiobank/test_ukbiobank_study_index.py index ff07db5db..9f48ebef2 100644 --- a/tests/gentropy/datasource/ukbiobank/test_ukbiobank_study_index.py +++ b/tests/gentropy/datasource/ukbiobank/test_ukbiobank_study_index.py @@ -2,9 +2,10 @@ from __future__ import annotations +from pyspark.sql import DataFrame + from gentropy.dataset.study_index import StudyIndex from gentropy.datasource.ukbiobank.study_index import UKBiobankStudyIndex -from pyspark.sql import DataFrame def test_ukbiobank_study_index_from_source( diff --git a/tests/gentropy/docs/test_applying_methods.py b/tests/gentropy/docs/test_applying_methods.py index 255752f46..14bd70fd7 100644 --- a/tests/gentropy/docs/test_applying_methods.py +++ b/tests/gentropy/docs/test_applying_methods.py @@ -1,15 +1,16 @@ """Testing applying methods docs.""" + from typing import Any import pytest -from gentropy.dataset.study_locus import StudyLocus -from gentropy.dataset.summary_statistics import SummaryStatistics from docs.src_snippets.howto.python_api.c_applying_methods import ( apply_class_method_clumping, apply_class_method_pics, apply_instance_method, ) +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.summary_statistics import SummaryStatistics @pytest.mark.parametrize( diff --git a/tests/gentropy/docs/test_create_dataset.py b/tests/gentropy/docs/test_create_dataset.py index 663254753..256f11251 100644 --- a/tests/gentropy/docs/test_create_dataset.py +++ b/tests/gentropy/docs/test_create_dataset.py @@ -1,15 +1,16 @@ """Testing creating dataset docs.""" + from typing import Any import pytest -from gentropy.common.session import Session -from gentropy.dataset.summary_statistics import SummaryStatistics from docs.src_snippets.howto.python_api.b_create_dataset import ( create_from_pandas, create_from_parquet, create_from_source, ) +from gentropy.common.session import Session +from gentropy.dataset.summary_statistics import SummaryStatistics @pytest.mark.parametrize( diff --git a/tests/gentropy/docs/test_creating_spark_session.py b/tests/gentropy/docs/test_creating_spark_session.py index 6e1cf1ca5..088f23d38 100644 --- a/tests/gentropy/docs/test_creating_spark_session.py +++ b/tests/gentropy/docs/test_creating_spark_session.py @@ -1,10 +1,10 @@ """Testing creating spark session docs.""" -from gentropy.common.session import Session from docs.src_snippets.howto.python_api.a_creating_spark_session import ( custom_session, default_session, ) +from gentropy.common.session import Session def test_default_session() -> None: diff --git a/tests/gentropy/docs/test_inspect_dataset.py b/tests/gentropy/docs/test_inspect_dataset.py index daefa9793..ecfb6d85b 100644 --- a/tests/gentropy/docs/test_inspect_dataset.py +++ b/tests/gentropy/docs/test_inspect_dataset.py @@ -1,5 +1,5 @@ """Testing inspecting dataset docs.""" -from gentropy.dataset.summary_statistics import SummaryStatistics + from pyspark.sql.types import StructType from docs.src_snippets.howto.python_api.d_inspect_dataset import ( @@ -7,6 +7,7 @@ get_dataset_schema, interact_w_dataframe, ) +from gentropy.dataset.summary_statistics import SummaryStatistics def test_filter_dataset(mock_summary_statistics: SummaryStatistics) -> None: diff --git a/tests/gentropy/method/test_carma.py b/tests/gentropy/method/test_carma.py index c715eba47..8db2abe47 100644 --- a/tests/gentropy/method/test_carma.py +++ b/tests/gentropy/method/test_carma.py @@ -3,6 +3,7 @@ from __future__ import annotations import numpy as np + from gentropy.method.carma import CARMA @@ -54,3 +55,22 @@ def test_MCS_modified( num_causal=10, ) assert np.allclose(np.round(np.corrcoef(l1_pips, pips)[0, 1], decimals=2), 1) + + def test_time_limited_CARMA_spike_slab_noEM_pips_no_restriction( + self: TestCARMA, sample_data_for_carma: list[np.ndarray] + ) -> None: + """Test of CARMA PIPs with liberal (no) time restriction.""" + ld = sample_data_for_carma[0] + z = sample_data_for_carma[1] + pips = sample_data_for_carma[2] + _l = CARMA.time_limited_CARMA_spike_slab_noEM(z=z, ld=ld, sec_threshold=600) + assert np.allclose(np.round(np.corrcoef(_l["PIPs"], pips)[0, 1], decimals=2), 1) + + def test_time_limited_CARMA_spike_slab_noEM_pips_restriction( + self: TestCARMA, sample_data_for_carma: list[np.ndarray] + ) -> None: + """Test of CARMA PIPs with time restriction.""" + ld = sample_data_for_carma[0] + z = sample_data_for_carma[1] + _l = CARMA.time_limited_CARMA_spike_slab_noEM(z=z, ld=ld, sec_threshold=0.001) + assert _l["Outliers"] is None and _l["PIPs"] is None diff --git a/tests/gentropy/method/test_clump.py b/tests/gentropy/method/test_clump.py index af4e2d141..ed07608db 100644 --- a/tests/gentropy/method/test_clump.py +++ b/tests/gentropy/method/test_clump.py @@ -2,11 +2,12 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING import pyspark.sql.functions as f import pyspark.sql.types as t import pytest + from gentropy.dataset.study_locus import StudyLocus from gentropy.method.clump import LDclumping @@ -19,142 +20,77 @@ def test_clump(mock_study_locus: StudyLocus) -> None: assert isinstance(LDclumping.clump(mock_study_locus), StudyLocus) -@pytest.mark.parametrize( - ("observed_data", "expected_data"), - [ +class TestIsLeadLinked: + """Testing the is_lead_linked method.""" + + DATA = [ + # Linked to V2: ( - [ - ( - # Dependent locus - lead is correlated with a more significant variant - 1, - "L1", - "GCST005650_1", - 1.0, - -17, - [{"tagVariantId": "T1"}, {"tagVariantId": "L2"}], - None, - ), - ( - # Dependent locus - lead shows a stronger association than the row above - 2, - "L2", - "GCST005650_1", - 4.0, - -18, - [ - {"tagVariantId": "T2"}, - {"tagVariantId": "T3"}, - {"tagVariantId": "L1"}, - ], - None, - ), - ( - # Independent locus - 3, - "L2", - "GCST005650_1", - 4.0, - -18, - [ - {"tagVariantId": "L3"}, - {"tagVariantId": "T4"}, - {"tagVariantId": "L5"}, - ], - None, - ), - ( - # Empty credible set - 4, - "L3", - "GCST005650_1", - 4.0, - -18, - [], - None, - ), - ( - # Null credible set - 5, - "L4", - "GCST005650_1", - 4.0, - -18, - None, - None, - ), - ], - [ - ( - # Signal is linked to the next row - 1, - "L1", - "GCST005650_1", - 1.0, - -17, - [{"tagVariantId": "T1"}, {"tagVariantId": "L2"}], - True, - ), - ( - # Signal is the most significant - 2, - "L2", - "GCST005650_1", - 4.0, - -18, - [ - {"tagVariantId": "T2"}, - {"tagVariantId": "T3"}, - {"tagVariantId": "L1"}, - ], - False, - ), - ( - # Signal is not linked - 3, - "L2", - "GCST005650_1", - 4.0, - -18, - [ - {"tagVariantId": "L3"}, - {"tagVariantId": "T4"}, - {"tagVariantId": "L5"}, - ], - False, - ), - ( - # Empty credible set - signal is not linked - 4, - "L3", - "GCST005650_1", - 4.0, - -18, - [], - False, - ), - ( - # Null credible set - signal is not linked - 5, - "L4", - "GCST005650_1", - 4.0, - -18, - None, - False, - ), - ], - ) - ], -) -def test_is_lead_linked( - spark: SparkSession, observed_data: list[Any], expected_data: list[Any] -) -> None: - """Test function that annotates whether a studyLocusId is linked to a more statistically significant studyLocusId.""" - schema = t.StructType( + "s1", + 1, + "c1", + "v3", + 1.0, + -8, + [{"tagVariantId": "v3"}, {"tagVariantId": "v2"}, {"tagVariantId": "v4"}], + True, + ), + # True lead: + ( + "s1", + 2, + "c1", + "v1", + 1.0, + -10, + [{"tagVariantId": "v1"}, {"tagVariantId": "v2"}, {"tagVariantId": "v3"}], + False, + ), + # Linked to V1: + ( + "s1", + 3, + "c1", + "v2", + 1.0, + -9, + [{"tagVariantId": "v2"}, {"tagVariantId": "v1"}], + True, + ), + # Independent - No LD set: + ("s1", 4, "c1", "v10", 1.0, -10, [], False), + # Independent - No variantId: + ("s1", 5, "c1", None, 1.0, -10, [], False), + # An other independent variant on the same chromosome, but lead is not in ldSet: + ( + "s1", + 6, + "c1", + "v6", + 1.0, + -8, + [{"tagVariantId": "v7"}, {"tagVariantId": "v8"}, {"tagVariantId": "v9"}], + False, + ), + # An other independent variant on a different chromosome, but lead is not in ldSet: + ( + "s1", + 7, + "c2", + "v10", + 1.0, + -8, + [{"tagVariantId": "v2"}, {"tagVariantId": "v10"}], + False, + ), + ] + + SCHEMA = t.StructType( [ - t.StructField("studyLocusId", t.LongType(), True), - t.StructField("variantId", t.StringType(), True), t.StructField("studyId", t.StringType(), True), + t.StructField("studyLocusId", t.StringType(), True), + t.StructField("chromosome", t.StringType(), True), + t.StructField("variantId", t.StringType(), True), t.StructField("pValueMantissa", t.FloatType(), True), t.StructField("pValueExponent", t.IntegerType(), True), t.StructField( @@ -168,28 +104,49 @@ def test_is_lead_linked( ), True, ), - t.StructField("is_lead_linked", t.BooleanType(), True), + t.StructField("expected_flag", t.BooleanType(), True), ] ) - study_locus_df = spark.createDataFrame( - observed_data, - schema, - ) - observed_df = ( - study_locus_df.withColumn( + + @pytest.fixture(autouse=True) + def _setup(self: TestIsLeadLinked, spark: SparkSession) -> None: + """Setup study the mock index for testing.""" + # Store input data: + self.df = spark.createDataFrame(self.DATA, self.SCHEMA) + + def test_is_lead_correctness(self: TestIsLeadLinked) -> None: + """Test the correctness of the is_lead_linked method.""" + observed = self.df.withColumn( "is_lead_linked", LDclumping._is_lead_linked( f.col("studyId"), + f.col("chromosome"), f.col("variantId"), f.col("pValueExponent"), f.col("pValueMantissa"), f.col("ldSet"), ), - ) - .orderBy("studyLocusId") - .collect() - ) - expected_df = ( - spark.createDataFrame(expected_data, schema).orderBy("studyLocusId").collect() - ) - assert observed_df == expected_df + ).collect() + + for row in observed: + assert row["is_lead_linked"] == row["expected_flag"] + + def test_flagging(self: TestIsLeadLinked) -> None: + """Test flagging of lead variants.""" + # Create the study locus and clump: + sl_flagged = StudyLocus( + _df=self.df.drop("expected_flag").withColumn( + "qualityControls", f.array().cast("array") + ), + _schema=StudyLocus.get_schema(), + ).clump() + + # Assert that the clumped locus is a StudyLocus: + assert isinstance(sl_flagged, StudyLocus) + + # Assert that the clumped locus has the correct columns: + for row in sl_flagged.df.join(self.df, on="studylocusId").collect(): + if len(row["qualityControls"]) == 0: + assert not row["expected_flag"] + else: + assert row["expected_flag"] diff --git a/tests/gentropy/method/test_colocalisation_method.py b/tests/gentropy/method/test_colocalisation_method.py index a0e7508a4..5b05d724b 100644 --- a/tests/gentropy/method/test_colocalisation_method.py +++ b/tests/gentropy/method/test_colocalisation_method.py @@ -2,18 +2,258 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import Any + +import pytest +from pandas.testing import assert_frame_equal +from pyspark.sql import SparkSession +from pyspark.sql.types import DoubleType, StringType, StructField, StructType from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.study_locus_overlap import StudyLocusOverlap from gentropy.method.colocalisation import Coloc, ECaviar -if TYPE_CHECKING: - from gentropy.dataset.study_locus_overlap import StudyLocusOverlap - def test_coloc(mock_study_locus_overlap: StudyLocusOverlap) -> None: """Test coloc.""" assert isinstance(Coloc.colocalise(mock_study_locus_overlap), Colocalisation) + assert isinstance( + Coloc.colocalise( + mock_study_locus_overlap, priorc1=1e-4, priorc2=1e-4, priorc12=1e-5 + ), + Colocalisation, + ) + + +@pytest.mark.parametrize( + "observed_data, expected_data", + [ + # associations with a single overlapping SNP + ( + # observed overlap + [ + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + "tagVariantId": "snp", + "statistics": { + "left_logBF": 10.3, + "right_logBF": 10.5, + "left_beta": 0.1, + "right_beta": 0.2, + }, + }, + ], + # expected coloc + [ + { + "h0": 9.254841951638903e-5, + "h1": 2.7517068829182966e-4, + "h2": 3.3609423764447284e-4, + "h3": 9.254841952564387e-13, + "h4": 0.9992961866536217, + }, + ], + ), + # associations with multiple overlapping SNPs + ( + # observed overlap + [ + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + "tagVariantId": "snp1", + "statistics": { + "left_logBF": 10.3, + "right_logBF": 10.5, + "left_beta": 0.1, + "right_beta": 0.2, + }, + }, + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + "tagVariantId": "snp2", + "statistics": { + "left_logBF": 10.3, + "right_logBF": 10.5, + "left_beta": 0.3, + "right_beta": 0.5, + }, + }, + ], + # expected coloc + [ + { + "h0": 4.6230151407950416e-5, + "h1": 2.749086942648107e-4, + "h2": 3.357742374172504e-4, + "h3": 9.983447421747411e-4, + "h4": 0.9983447421747356, + }, + ], + ), + ], +) +def test_coloc_semantic( + spark: SparkSession, + observed_data: list[Any], + expected_data: list[Any], +) -> None: + """Test our COLOC with the implementation in R.""" + observed_overlap = StudyLocusOverlap( + _df=spark.createDataFrame(observed_data, schema=StudyLocusOverlap.get_schema()), + _schema=StudyLocusOverlap.get_schema(), + ) + observed_coloc_pdf = ( + Coloc.colocalise(observed_overlap) + .df.select("h0", "h1", "h2", "h3", "h4") + .toPandas() + ) + expected_coloc_pdf = ( + spark.createDataFrame(expected_data) + .select("h0", "h1", "h2", "h3", "h4") + .toPandas() + ) + + assert_frame_equal( + observed_coloc_pdf, + expected_coloc_pdf, + check_exact=False, + check_dtype=True, + ) + + +def test_coloc_no_logbf( + spark: SparkSession, + minimum_expected_h0: float = 0.99, + maximum_expected_h4: float = 1e-5, +) -> None: + """Test COLOC output when the input data has irrelevant logBF.""" + observed_overlap = StudyLocusOverlap( + ( + spark.createDataFrame( + [ + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + "tagVariantId": "snp", + "statistics": { + "left_logBF": None, + "right_logBF": None, + "left_beta": 0.1, + "right_beta": 0.2, + "left_posteriorProbability": None, + "right_posteriorProbability": None, + }, # irrelevant for COLOC + } + ], + schema=StructType( + [ + StructField("leftStudyLocusId", StringType(), False), + StructField("rightStudyLocusId", StringType(), False), + StructField("rightStudyType", StringType(), False), + StructField("chromosome", StringType(), False), + StructField("tagVariantId", StringType(), False), + StructField( + "statistics", + StructType( + [ + StructField("left_logBF", DoubleType(), True), + StructField("right_logBF", DoubleType(), True), + StructField("left_beta", DoubleType(), False), + StructField("right_beta", DoubleType(), False), + StructField( + "left_posteriorProbability", DoubleType(), True + ), + StructField( + "right_posteriorProbability", DoubleType(), True + ), + ] + ), + ), + ] + ), + ) + ), + StudyLocusOverlap.get_schema(), + ) + observed_coloc_df = Coloc.colocalise(observed_overlap).df + assert ( + observed_coloc_df.select("h0").collect()[0]["h0"] > minimum_expected_h0 + ), "COLOC should return a high h0 (no association) when the input data has irrelevant logBF." + assert ( + observed_coloc_df.select("h4").collect()[0]["h4"] < maximum_expected_h4 + ), "COLOC should return a low h4 (traits are associated) when the input data has irrelevant logBF." + + +def test_coloc_no_betas(spark: SparkSession) -> None: + """Test COLOC output when the input data has no betas.""" + observed_overlap = StudyLocusOverlap( + ( + spark.createDataFrame( + [ + { + "leftStudyLocusId": "1", + "rightStudyLocusId": "2", + "rightStudyType": "eqtl", + "chromosome": "1", + "tagVariantId": "snp", + "statistics": { + "left_logBF": 10.5, + "right_logBF": 10.3, + "left_beta": None, + "right_beta": None, + "left_posteriorProbability": None, + "right_posteriorProbability": None, + }, # irrelevant for COLOC + } + ], + schema=StructType( + [ + StructField("leftStudyLocusId", StringType(), False), + StructField("rightStudyLocusId", StringType(), False), + StructField("rightStudyType", StringType(), False), + StructField("chromosome", StringType(), False), + StructField("tagVariantId", StringType(), False), + StructField( + "statistics", + StructType( + [ + StructField("left_logBF", DoubleType(), False), + StructField("right_logBF", DoubleType(), False), + StructField("left_beta", DoubleType(), True), + StructField("right_beta", DoubleType(), True), + StructField( + "left_posteriorProbability", DoubleType(), True + ), + StructField( + "right_posteriorProbability", DoubleType(), True + ), + ] + ), + ), + ] + ), + ) + ), + StudyLocusOverlap.get_schema(), + ) + observed_coloc_df = Coloc.colocalise(observed_overlap).df + assert ( + observed_coloc_df.select("betaRatioSignAverage").collect()[0][ + "betaRatioSignAverage" + ] + is None + ), "No betas results in None type." def test_ecaviar(mock_study_locus_overlap: StudyLocusOverlap) -> None: diff --git a/tests/gentropy/method/test_ld.py b/tests/gentropy/method/test_ld.py index db0b5aba4..7e7237ac9 100644 --- a/tests/gentropy/method/test_ld.py +++ b/tests/gentropy/method/test_ld.py @@ -2,50 +2,197 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pyspark.sql.types as t import pytest +from pyspark.sql import Row + from gentropy.dataset.study_locus import StudyLocus from gentropy.method.ld import LDAnnotator -from pyspark.sql import Row if TYPE_CHECKING: + from pyspark.sql import SparkSession + from gentropy.dataset.ld_index import LDIndex from gentropy.dataset.study_index import StudyIndex - from pyspark.sql import SparkSession class TestLDAnnotator: """Test LDAnnotatorGnomad.""" - def test__add_population_size( + @pytest.mark.parametrize( + ("observed", "expected"), + [ + # no tie in relativeSampleSize + ( + # observed ldPopulationStructure + [ + Row( + ldPopulationStructure=[ + {"ldPopulation": "pop1", "relativeSampleSize": 0.5}, + {"ldPopulation": "pop2", "relativeSampleSize": 0.3}, + {"ldPopulation": "pop3", "relativeSampleSize": 0.2}, + ], + ) + ], + # expected majorPopulation + "pop1", + ), + # tie in relativeSampleSize, "nfe" is not one of the tied populations + ( + # observed ldPopulationStructure + [ + Row( + ldPopulationStructure=[ + {"ldPopulation": "pop1", "relativeSampleSize": 0.4}, + {"ldPopulation": "pop2", "relativeSampleSize": 0.4}, + {"ldPopulation": "pop3", "relativeSampleSize": 0.2}, + ], + ) + ], + # expected majorPopulation + "pop1", + ), + # tie in relativeSampleSize, "nfe" is one of the tied populations + ( + # observed ldPopulationStructure + [ + Row( + ldPopulationStructure=[ + {"ldPopulation": "pop1", "relativeSampleSize": 0.4}, + {"ldPopulation": "nfe", "relativeSampleSize": 0.4}, + {"ldPopulation": "pop3", "relativeSampleSize": 0.2}, + ], + ) + ], + # expected majorPopulation + "nfe", + ), + ], + ) + def test__get_major_population( self: TestLDAnnotator, + spark: SparkSession, + observed: list[Any], + expected: list[Any], ) -> None: - """Test _add_population_size.""" - result_df = self.observed_df.select( - LDAnnotator._add_population_size( - f.col("ldSet"), f.col("ldPopulationStructure") - ).alias("ldSet") + """Test _get_major_population.""" + schema = t.StructType( + [ + t.StructField( + "ldPopulationStructure", + t.ArrayType( + t.StructType( + [ + t.StructField("ldPopulation", t.StringType(), True), + t.StructField( + "relativeSampleSize", t.DoubleType(), True + ), + ] + ) + ), + True, + ), + ] ) - expected = [0.8, None] - for i, row in enumerate(result_df.collect()): - assert row["ldSet"][0]["rValues"][i]["relativeSampleSize"] == pytest.approx( - expected[i] - ) + observed_df = spark.createDataFrame(observed, schema) + result_df = observed_df.withColumn( + "majorPopulation", + LDAnnotator._get_major_population(f.col("ldPopulationStructure")), + ) + assert result_df.collect()[0]["majorPopulation"] == pytest.approx(expected) - def test__calculate_weighted_r_overall( + @pytest.mark.parametrize( + ("observed", "expected"), + [ + # r available for majorPopulation + ( + # observed ldSet and majorPopulation + [ + Row( + majorPopulation="pop1", + ldSet=[ + { + "tagVariantId": "tag1", + "rValues": [ + {"population": "pop1", "r": 0.5}, + {"population": "pop2", "r": 0.6}, + ], + } + ], + ) + ], + # expected r2Overall + 0.25, + ), + # r not available for majorPopulation + ( + # observed ldSet and majorPopulation + [ + Row( + majorPopulation="pop3", + ldSet=[ + { + "tagVariantId": "tag1", + "rValues": [ + {"population": "pop1", "r": 0.5}, + {"population": "pop2", "r": 0.6}, + ], + } + ], + ) + ], + # expected r2Overall + 0.0, + ), + ], + ) + def test__calculate_r2_major( self: TestLDAnnotator, + spark: SparkSession, + observed: list[Any], + expected: list[Any], ) -> None: - """Test _calculate_weighted_r_overall.""" - result_df = self.observed_df.withColumn( + """Test _calculate_r2_major.""" + schema = t.StructType( + [ + t.StructField("majorPopulation", t.StringType(), True), + t.StructField( + "ldSet", + t.ArrayType( + t.StructType( + [ + t.StructField("tagVariantId", t.StringType(), True), + t.StructField( + "rValues", + t.ArrayType( + t.StructType( + [ + t.StructField( + "population", t.StringType(), True + ), + t.StructField( + "r", t.DoubleType(), True + ), + ] + ) + ), + True, + ), + ] + ) + ), + True, + ), + ] + ) + observed_df = spark.createDataFrame(observed, schema) + result_df = observed_df.withColumn( "ldSet", - LDAnnotator._add_population_size( - f.col("ldSet"), f.col("ldPopulationStructure") - ), - ).withColumn("ldSet", LDAnnotator._calculate_weighted_r_overall(f.col("ldSet"))) - expected = 0.2 + LDAnnotator._calculate_r2_major(f.col("ldSet"), f.col("majorPopulation")), + ) assert result_df.collect()[0]["ldSet"][0]["r2Overall"] == pytest.approx( expected ) diff --git a/tests/gentropy/method/test_locus_breaker_clumping.py b/tests/gentropy/method/test_locus_breaker_clumping.py new file mode 100644 index 000000000..c2c23eca5 --- /dev/null +++ b/tests/gentropy/method/test_locus_breaker_clumping.py @@ -0,0 +1,133 @@ +"""Test locus-breaker clumping.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.summary_statistics import SummaryStatistics + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +def test_locus_breaker_return_type( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Test locus clumping.""" + assert isinstance( + mock_summary_statistics.locus_breaker_clumping(), + StudyLocus, + ) + + +class TestLocusBreakerClumping: + """Test locus breaker clumping.""" + + # Some constants for testing: + distance_cutoff = 3 + pvalue_baseline_cutoff = 0.05 + pvalue_cutoff = 1e-3 + flanking = 2 + + @pytest.fixture(scope="class") + def mock_input( + self: TestLocusBreakerClumping, + spark: SparkSession, + ) -> SummaryStatistics: + """Prepare mock summary statistics for clumping.""" + data = [ + # Block 1: Study1, chromosome 1, expected boundaries: 0-5 + ("s1", "chr1", "v1", 1, -2), + ("s1", "chr1", "v1", 2, -4), + ("s1", "chr1", "top_loci", 3, -5), + ("s1", "chr1", "v1", 4, -1), # <- will be dropped: not reaching baseline + # Block 2: Study1, chromosome 1, expected boundaries: 5-10 + ("s1", "chr1", "top_loci", 7, -4), + ("s1", "chr1", "v1", 8, -2), + # Block 3: Study1, chromosome 2, expected boundaries: 6-12 + ("s1", "chr2", "v1", 8, -2), + ("s1", "chr2", "v1", 9, -3), + ("s1", "chr2", "top_loci", 10, -5), + # Block 4: Study1, chromosome 2 + ("s1", "chr2", "v1", 14, -2), # <- will be dropped: low p-value + # Block 5: Study2, chromosome 2, expected boundaries: 6-12 + ("s2", "chr2", "v1", 8, -2), + ("s2", "chr2", "v1", 9, -3), + ("s2", "chr2", "top_loci", 10, -6), + # Block 6: Study2, chromosome 2, expected boundaries: 12-16 + ("s2", "chr2", "top_loci", 14, -5), + ] + df = spark.createDataFrame( + data, ["studyId", "chromosome", "variantId", "position", "pValueExponent"] + ).select( + "studyId", + "chromosome", + "variantId", + f.col("position").cast(t.IntegerType()), + f.col("pValueExponent").cast(t.IntegerType()), + f.lit(1.0).cast(t.FloatType()).alias("pValueMantissa"), + f.lit(1.0).cast(t.DoubleType()).alias("beta"), + ) + + return SummaryStatistics(_df=df, _schema=SummaryStatistics.get_schema()) + + @pytest.fixture(scope="class") + def clumped_data( + self: TestLocusBreakerClumping, mock_input: SummaryStatistics + ) -> StudyLocus: + """Apply method and store for clumped data.""" + return mock_input.locus_breaker_clumping( + self.pvalue_baseline_cutoff, + self.distance_cutoff, + self.pvalue_cutoff, + self.flanking, + ).persist() + + def test_return_type( + self: TestLocusBreakerClumping, clumped_data: StudyLocus + ) -> None: + """Testing return type.""" + assert isinstance( + clumped_data, StudyLocus + ), f"Unexpected return type: {type(clumped_data)}" + + def test_number_of_loci( + self: TestLocusBreakerClumping, clumped_data: StudyLocus + ) -> None: + """Testing return type.""" + assert ( + clumped_data.df.count() == 5 + ), f"Unexpected number of loci: {clumped_data.df.count()}" + + def test_top_loci(self: TestLocusBreakerClumping, clumped_data: StudyLocus) -> None: + """Testing selected top-loci.""" + top_loci_variants = clumped_data.df.select("variantId").distinct().collect() + + assert ( + len(top_loci_variants) == 1 + ), f"Unexpected number of top loci: {len(top_loci_variants)} ({top_loci_variants})" + + assert ( + top_loci_variants[0]["variantId"] == "top_loci" + ), f"Unexpected top locus: {top_loci_variants[0]['variantId']}" + + def test_locus_boundaries( + self: TestLocusBreakerClumping, clumped_data: StudyLocus + ) -> None: + """Testing locus boundaries.""" + locus_start = [ + row["locusStart"] for row in clumped_data.df.select("locusStart").collect() + ] + + locus_end = [ + row["locusEnd"] for row in clumped_data.df.select("locusEnd").collect() + ] + + assert locus_start == [0, 5, 6, 6, 12], f"Unexpected locus start: {locus_start}" + + assert locus_end == [5, 10, 12, 12, 16], f"Unexpected locus end: {locus_end}" diff --git a/tests/gentropy/method/test_locus_to_gene.py b/tests/gentropy/method/test_locus_to_gene.py deleted file mode 100644 index d97f4dc4d..000000000 --- a/tests/gentropy/method/test_locus_to_gene.py +++ /dev/null @@ -1,230 +0,0 @@ -"""Test locus-to-gene model training.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pytest -from gentropy.dataset.colocalisation import Colocalisation -from gentropy.dataset.l2g_feature import L2GFeature -from gentropy.dataset.l2g_feature_matrix import L2GFeatureMatrix -from gentropy.dataset.study_index import StudyIndex -from gentropy.dataset.study_locus import StudyLocus -from gentropy.method.l2g.feature_factory import ColocalisationFactory, StudyLocusFactory -from gentropy.method.l2g.model import LocusToGeneModel -from gentropy.method.l2g.trainer import LocusToGeneTrainer -from pyspark.ml import PipelineModel -from pyspark.ml.tuning import ParamGridBuilder -from xgboost.spark import SparkXGBClassifier - -if TYPE_CHECKING: - from gentropy.dataset.v2g import V2G - from pyspark.sql import SparkSession - - -@pytest.fixture(scope="module") -def model() -> LocusToGeneModel: - """Creates an instance of the LocusToGene class.""" - estimator = SparkXGBClassifier( - eval_metric="logloss", - features_col="features", - label_col="label", - max_depth=5, - ) - return LocusToGeneModel(estimator=estimator, features_list=["distanceTssMean"]) - - -class TestLocusToGeneTrainer: - """Test the L2GTrainer methods using a logistic regression model as estimation algorithm.""" - - def test_cross_validate( - self: TestLocusToGeneTrainer, - mock_l2g_feature_matrix: L2GFeatureMatrix, - model: LocusToGeneModel, - ) -> None: - """Test the k-fold cross-validation function.""" - param_grid = ( - ParamGridBuilder() - .addGrid(model.estimator.learning_rate, [0.1, 0.01]) - .build() - ) - best_model = LocusToGeneTrainer.cross_validate( - model, mock_l2g_feature_matrix.fill_na(), num_folds=2, param_grid=param_grid - ) - assert isinstance( - best_model, LocusToGeneModel - ), "Unexpected model type returned from cross_validate" - # Check that the best model's hyperparameters are among those in the param_grid - assert best_model.model.getOrDefault("learning_rate") in [ # type: ignore - 0.1, - 0.01, - ], "Unexpected learning rate in the best model" - - def test_train( - self: TestLocusToGeneTrainer, - mock_l2g_feature_matrix: L2GFeatureMatrix, - model: LocusToGeneModel, - ) -> None: - """Test the training function.""" - trained_model = LocusToGeneTrainer.train( - mock_l2g_feature_matrix.fill_na(), - model, - features_list=["distanceTssMean"], - evaluate=False, - ) - # Check that `model` is a PipelineModel object and not None - assert isinstance( - trained_model.model, PipelineModel - ), "Model is not a PipelineModel object." - - -class TestColocalisationFactory: - """Test the ColocalisationFactory methods.""" - - @pytest.mark.parametrize( - "colocalisation_method", - [ - "COLOC", - "eCAVIAR", - ], - ) - def test_get_max_coloc_per_study_locus( - self: TestColocalisationFactory, - mock_study_locus: StudyLocus, - mock_study_index: StudyIndex, - mock_colocalisation: Colocalisation, - colocalisation_method: str, - ) -> None: - """Test the function that extracts the maximum log likelihood ratio for each pair of overlapping study-locus returns the right data type.""" - coloc_features = ColocalisationFactory._get_max_coloc_per_study_locus( - mock_study_locus, - mock_study_index, - mock_colocalisation, - colocalisation_method, - ) - assert isinstance( - coloc_features, L2GFeature - ), "Unexpected model type returned from _get_max_coloc_per_study_locus" - - def test_get_max_coloc_per_study_locus_semantic( - self: TestColocalisationFactory, - spark: SparkSession, - ) -> None: - """Test logic of the function that extracts the maximum log likelihood ratio for each pair of overlapping study-locus.""" - # Prepare mock datasets based on 2 associations - credset = StudyLocus( - _df=spark.createDataFrame( - # 2 associations with a common variant in the locus - [ - { - "studyLocusId": 1, - "variantId": "lead1", - "studyId": "study1", # this is a GWAS - "locus": [ - {"variantId": "commonTag", "posteriorProbability": 0.9}, - ], - "chromosome": "1", - }, - { - "studyLocusId": 2, - "variantId": "lead2", - "studyId": "study2", # this is a eQTL study - "locus": [ - {"variantId": "commonTag", "posteriorProbability": 0.9}, - ], - "chromosome": "1", - }, - ], - StudyLocus.get_schema(), - ), - _schema=StudyLocus.get_schema(), - ) - - studies = StudyIndex( - _df=spark.createDataFrame( - [ - { - "studyId": "study1", - "studyType": "gwas", - "traitFromSource": "trait1", - "projectId": "project1", - }, - { - "studyId": "study2", - "studyType": "eqtl", - "geneId": "gene1", - "traitFromSource": "trait2", - "projectId": "project2", - }, - ] - ), - _schema=StudyIndex.get_schema(), - ) - coloc = Colocalisation( - _df=spark.createDataFrame( - [ - { - "leftStudyLocusId": 1, - "rightStudyLocusId": 2, - "chromosome": "1", - "colocalisationMethod": "eCAVIAR", - "numberColocalisingVariants": 1, - "clpp": 0.81, # 0.9*0.9 - } - ] - ), - _schema=Colocalisation.get_schema(), - ) - expected_coloc_features_df = spark.createDataFrame( - [ - (1, "gene1", "eqtlColocClppMaximum", 0.81), - (1, "gene1", "eqtlColocClppMaximumNeighborhood", -4.0), - ], - L2GFeature.get_schema(), - ) - # Test - coloc_features = ColocalisationFactory._get_max_coloc_per_study_locus( - credset, - studies, - coloc, - "eCAVIAR", - ) - assert coloc_features.df.collect() == expected_coloc_features_df.collect() - - def test_get_coloc_features( - self: TestColocalisationFactory, - mock_study_locus: StudyLocus, - mock_study_index: StudyIndex, - mock_colocalisation: Colocalisation, - ) -> None: - """Test the function that calls all the methods to produce colocalisation features.""" - coloc_features = ColocalisationFactory._get_coloc_features( - mock_study_locus, mock_study_index, mock_colocalisation - ) - assert isinstance( - coloc_features, L2GFeature - ), "Unexpected model type returned from _get_coloc_features" - - -class TestStudyLocusFactory: - """Test the StudyLocusFactory methods.""" - - def test_get_tss_distance_features( - self: TestStudyLocusFactory, mock_study_locus: StudyLocus, mock_v2g: V2G - ) -> None: - """Test the function that extracts the distance to the TSS.""" - tss_distance = StudyLocusFactory._get_tss_distance_features( - mock_study_locus, mock_v2g - ) - assert isinstance( - tss_distance, L2GFeature - ), "Unexpected model type returned from _get_tss_distance_features" - - def test_get_vep_features( - self: TestStudyLocusFactory, mock_study_locus: StudyLocus, mock_v2g: V2G - ) -> None: - """Test the function that extracts the VEP features.""" - vep_features = StudyLocusFactory._get_vep_features(mock_study_locus, mock_v2g) - assert isinstance( - vep_features, L2GFeature - ), "Unexpected model type returned from _get_vep_features" diff --git a/tests/gentropy/method/test_pics.py b/tests/gentropy/method/test_pics.py index ee0425b61..d5a8eb5d0 100644 --- a/tests/gentropy/method/test_pics.py +++ b/tests/gentropy/method/test_pics.py @@ -3,9 +3,12 @@ from __future__ import annotations import pyspark.sql.functions as f +import pyspark.sql.types as t +import pytest +from pyspark.sql import Row, SparkSession + from gentropy.dataset.study_locus import StudyLocus from gentropy.method.pics import PICS -from pyspark.sql import Row class TestFinemap: @@ -54,8 +57,8 @@ def test_finemap_quality_control( def test__finemap_udf() -> None: """Test the _finemap UDF with a simple case.""" ld_set = [ - Row(variantId="var1", r2Overall=0.8), - Row(variantId="var2", r2Overall=1), + Row(tagVariantId="var1", r2Overall=0.8), + Row(tagVariantId="var2", r2Overall=1), ] result = PICS._finemap(ld_set, lead_neglog_p=10.0, k=6.4) expected = [ @@ -80,3 +83,75 @@ def test__finemap_udf() -> None: def test_finemap(mock_study_locus: StudyLocus) -> None: """Test finemap function returns study-locus.""" assert isinstance(PICS.finemap(mock_study_locus), StudyLocus) + + +class TestLeadPropagation: + """This test suite is designed to test that the statistics of the lead variant are propagated correctly.""" + + DATA = [ + ("v1", "v1", 1.0), + ("v1", "v2", 0.9), + ("v1", "v3", 0.3), + ] + + @pytest.fixture(autouse=True) + def setup(self, spark: SparkSession) -> None: + """Set up the test suite. + + Args: + spark (SparkSession): The spark session. + """ + df = ( + spark.createDataFrame(self.DATA, ["variantId", "tagVariantId", "r2Overall"]) + .groupBy("variantId") + .agg( + f.collect_list( + f.struct( + f.col("tagVariantId"), + f.col("r2Overall").cast(t.DoubleType()).alias("r2Overall"), + ) + ).alias("ldSet") + ) + .withColumns( + { + "studyLocusId": f.lit("l1"), + "studyId": f.lit("s1"), + "chromosome": f.lit("1"), + "pValueMantissa": f.lit(1.0).cast(t.FloatType()), + "pValueExponent": f.lit(-4).cast(t.IntegerType()), + "beta": f.lit(0.234).cast(t.DoubleType()), + "qualityControls": f.lit(None).cast(t.ArrayType(t.StringType())), + "ldSet": f.filter( + f.col("ldSet"), lambda x: x.tagVariantId.isNotNull() + ), + } + ) + ) + + self.study_locus = StudyLocus(_df=df, _schema=StudyLocus.get_schema()) + + def test_lead_propagation(self: TestLeadPropagation) -> None: + """Testing if all the lead variant statistics are propagated to the tag variants.""" + # Explode all the tags: + finemapped = ( + PICS.finemap(self.study_locus) + .df.select( + f.col("variantId"), + f.col("pValueMantissa"), + f.col("pValueExponent"), + f.col("beta"), + f.explode("locus").alias("locus"), + ) + .collect() + ) + + # Looping through all the tags and checking if the statistics are propagated correctly: + for row in finemapped: + if row["locus"]["variantId"] == row["variantId"]: + assert row["locus"]["pValueMantissa"] == row["pValueMantissa"] + assert row["locus"]["pValueExponent"] == row["pValueExponent"] + assert row["locus"]["beta"] == row["beta"] + else: + assert row["locus"]["pValueMantissa"] is None + assert row["locus"]["pValueExponent"] is None + assert row["locus"]["beta"] is None diff --git a/tests/gentropy/method/test_qc_of_sumstats.py b/tests/gentropy/method/test_qc_of_sumstats.py new file mode 100644 index 000000000..cb8d3443e --- /dev/null +++ b/tests/gentropy/method/test_qc_of_sumstats.py @@ -0,0 +1,102 @@ +"""Test of the qc of summary statistics.""" + +from __future__ import annotations + +import numpy as np +import pyspark.sql.functions as f +import pytest +from pyspark.sql.functions import rand, when + +from gentropy.common.session import Session +from gentropy.dataset.summary_statistics import SummaryStatistics +from gentropy.method.sumstat_quality_controls import SummaryStatisticsQC + + +def test_qc_functions( + sample_summary_statistics: SummaryStatistics, +) -> None: + """Test all sumstat qc functions.""" + gwas = sample_summary_statistics.sanity_filter() + QC = SummaryStatisticsQC.get_quality_control_metrics(gwas=gwas, pval_threshold=5e-8) + QC = QC.toPandas() + + assert QC["n_variants"].iloc[0] == 1663 + assert QC["n_variants_sig"].iloc[0] == 29 + assert np.round(QC["gc_lambda"].iloc[0], 4) == 1.916 + assert np.round(QC["mean_beta"].iloc[0], 4) == 0.0013 + assert np.round(QC["mean_diff_pz"].iloc[0], 6) == 0 + assert np.round(QC["se_diff_pz"].iloc[0], 6) == 0 + + +def test_neff_check_eaf( + sample_summary_statistics: SummaryStatistics, +) -> None: + """Test N_eff check using mock EAFs.""" + gwas = sample_summary_statistics.sanity_filter() + gwas_df = gwas._df + gwas_df = gwas_df.withColumn("effectAlleleFrequencyFromSource", f.lit(0.5)) + gwas._df = gwas_df + + QC = SummaryStatisticsQC.sumstat_n_eff_check( + gwas_for_qc=gwas, limit=100000, min_count=100, n_total=100000 + ) + QC = QC.toPandas() + assert np.round(QC["se_N"].iloc[0], 4) == 0.5586 + + +def test_several_studyid( + sample_summary_statistics: SummaryStatistics, +) -> None: + """Test stability when several studyIds are present.""" + gwas = sample_summary_statistics.sanity_filter() + gwas_df = gwas._df + gwas_df = gwas_df.withColumn( + "studyId", when(rand() < 0.5, "new_value").otherwise(gwas_df["studyId"]) + ) + gwas._df = gwas_df + + QC = SummaryStatisticsQC.get_quality_control_metrics(gwas=gwas) + QC = QC.toPandas() + assert QC.shape == (2, 7) + + +def test_sanity_filter_remove_inf_values( + session: Session, +) -> None: + """Sanity filter remove inf value from standardError field.""" + data = [ + ( + "GCST012234", + "10_73856419_C_A", + 10, + 73856419, + np.Infinity, + 1, + 3.1324, + -650, + None, + 0.4671, + ), + ( + "GCST012234", + "14_98074714_G_C", + 14, + 98074714, + 6.697, + 2, + 5.4275, + -2890, + None, + 0.4671, + ), + ] + input_df = session.spark.createDataFrame( + data=data, schema=SummaryStatistics.get_schema() + ) + summary_stats = SummaryStatistics( + _df=input_df, _schema=SummaryStatistics.get_schema() + ) + stats_after_filter = summary_stats.sanity_filter().df.collect() + assert input_df.count() == 2 + assert len(stats_after_filter) == 1 + assert stats_after_filter[0]["beta"] - 6.697 == pytest.approx(0) diff --git a/tests/gentropy/method/test_sumstat_imputation.py b/tests/gentropy/method/test_sumstat_imputation.py new file mode 100644 index 000000000..93df23abc --- /dev/null +++ b/tests/gentropy/method/test_sumstat_imputation.py @@ -0,0 +1,32 @@ +"""Test of sumstat imputation functions.""" + +from __future__ import annotations + +import numpy as np + +from gentropy.method.sumstat_imputation import SummaryStatisticsImputation + + +class TestSSImp: + """Test of RAISS sumstat imputation main function.""" + + def test_sumstat_imputation( + self: TestSSImp, sample_data_for_carma: list[np.ndarray] + ) -> None: + """Test of RAISS.""" + ld = sample_data_for_carma[0] + z = sample_data_for_carma[1] + + unknowns = [5] + known = [index for index in list(range(21)) if index not in unknowns] + sig_t = ld[known, :][:, known] + sig_i_t = ld[unknowns, :][:, known] + zt = z[known] + + _l = SummaryStatisticsImputation.raiss_model( + zt, sig_t, sig_i_t, lamb=0.01, rtol=0.01 + ) + assert ( + np.round(_l["imputation_r2"][0], decimals=4) == 0.9304 + and np.round(_l["mu"][0], decimals=4) == 9.7215 + ) diff --git a/tests/gentropy/method/test_susie_inf.py b/tests/gentropy/method/test_susie_inf.py index d8e855a5b..4885a3d8a 100644 --- a/tests/gentropy/method/test_susie_inf.py +++ b/tests/gentropy/method/test_susie_inf.py @@ -3,7 +3,13 @@ from __future__ import annotations import numpy as np +import pyspark.sql.functions as f + +from gentropy.common.session import Session +from gentropy.dataset.study_locus import StudyLocus +from gentropy.dataset.summary_statistics import SummaryStatistics from gentropy.method.susie_inf import SUSIE_inf +from gentropy.susie_finemapper import SusieFineMapperStep class TestSUSIE_inf: @@ -16,7 +22,7 @@ def test_SUSIE_inf_lbf_moments( ld = sample_data_for_susie_inf[0] z = sample_data_for_susie_inf[1] lbf_moments = sample_data_for_susie_inf[2] - susie_output = SUSIE_inf.susie_inf(z=z, LD=ld, method="moments") + susie_output = SUSIE_inf.susie_inf(z=z, LD=ld, est_tausq=True, method="moments") lbf_calc = susie_output["lbf_variable"][:, 0] assert np.allclose( lbf_calc, lbf_moments @@ -29,7 +35,7 @@ def test_SUSIE_inf_lbf_mle( ld = sample_data_for_susie_inf[0] z = sample_data_for_susie_inf[1] lbf_mle = sample_data_for_susie_inf[3] - susie_output = SUSIE_inf.susie_inf(z=z, LD=ld, method="MLE") + susie_output = SUSIE_inf.susie_inf(z=z, LD=ld, est_tausq=True, method="MLE") lbf_calc = susie_output["lbf_variable"][:, 0] assert np.allclose( lbf_calc, lbf_mle, atol=1e-1 @@ -41,6 +47,47 @@ def test_SUSIE_inf_cred( """Test of SuSiE-inf credible set generator.""" ld = sample_data_for_susie_inf[0] z = sample_data_for_susie_inf[1] - susie_output = SUSIE_inf.susie_inf(z=z, LD=ld) + susie_output = SUSIE_inf.susie_inf( + z=z, + LD=ld, + est_tausq=True, + ) cred = SUSIE_inf.cred_inf(susie_output["PIP"], LD=ld) assert cred[0] == [5] + + def test_SUSIE_inf_convert_to_study_locus( + self: TestSUSIE_inf, + sample_data_for_susie_inf: list[np.ndarray], + sample_summary_statistics: SummaryStatistics, + session: Session, + ) -> None: + """Test of SuSiE-inf credible set generator.""" + ld = sample_data_for_susie_inf[0] + z = sample_data_for_susie_inf[1] + susie_output = SUSIE_inf.susie_inf( + z=z, + LD=ld, + est_tausq=False, + ) + gwas_df = sample_summary_statistics._df.withColumn( + "z", f.col("beta") / f.col("standardError") + ).filter(f.col("z").isNotNull()) + gwas_df = gwas_df.limit(21) + + L1 = SusieFineMapperStep.susie_inf_to_studylocus( + susie_output=susie_output, + session=session, + studyId="sample_id", + region="sample_region", + variant_index=gwas_df, + cs_lbf_thr=2, + ld_matrix=ld, + lead_pval_threshold=1, + purity_mean_r2_threshold=0, + purity_min_r2_threshold=0, + sum_pips=0.99, + ld_min_r2=1, + locusStart=1, + locusEnd=2, + ) + assert isinstance(L1, StudyLocus), "L1 is not an instance of StudyLocus" diff --git a/tests/gentropy/method/test_window_based_clumping.py b/tests/gentropy/method/test_window_based_clumping.py index 59bf0277a..382dce1e9 100644 --- a/tests/gentropy/method/test_window_based_clumping.py +++ b/tests/gentropy/method/test_window_based_clumping.py @@ -1,18 +1,20 @@ """Test window-based clumping.""" + from __future__ import annotations from typing import TYPE_CHECKING -from gentropy.dataset.study_locus import StudyLocus -from gentropy.method.window_based_clumping import WindowBasedClumping from pyspark.ml import functions as fml from pyspark.ml.linalg import VectorUDT +from pyspark.sql import SparkSession from pyspark.sql import functions as f from pyspark.sql.window import Window +from gentropy.dataset.study_locus import StudyLocus +from gentropy.method.window_based_clumping import WindowBasedClumping + if TYPE_CHECKING: from gentropy.dataset.summary_statistics import SummaryStatistics - from pyspark.sql import SparkSession def test_window_based_clump__return_type( @@ -20,7 +22,14 @@ def test_window_based_clump__return_type( ) -> None: """Test window-based clumping.""" assert isinstance( - WindowBasedClumping.clump_with_locus(mock_summary_statistics, 250_000), + WindowBasedClumping.clump(mock_summary_statistics, distance=250_000), + StudyLocus, + ) + assert isinstance( + WindowBasedClumping.clump( + mock_summary_statistics, + distance=250_000, + ), StudyLocus, ) @@ -43,7 +52,10 @@ def test_window_based_clump_with_locus__correctness( ) -> None: """Test window-based clumping.""" clumped = sample_summary_statistics.window_based_clumping( - distance=250_000, locus_collect_distance=250_000 + distance=250_000, + ) + clumped = clumped.annotate_locus_statistics( + sample_summary_statistics, collect_locus_distance=250_000 ) # Asserting the presence of locus key: @@ -56,7 +68,7 @@ def test_window_based_clump_with_locus__correctness( assert (clumped.df.filter(f.col("variantId") == "18_12843138_T_C").count()) == 1 # Assert the number of variants in the locus: - assert (clumped.df.select(f.explode_outer("locus").alias("loci")).count()) == 132 + assert (clumped.df.select(f.explode_outer("locus").alias("loci")).count()) == 218 def test_prune_peak(spark: SparkSession) -> None: diff --git a/tests/gentropy/step/test_clump_step.py b/tests/gentropy/step/test_clump_step.py index 701afc950..ab40de901 100644 --- a/tests/gentropy/step/test_clump_step.py +++ b/tests/gentropy/step/test_clump_step.py @@ -1,4 +1,5 @@ """Test clump step.""" + from __future__ import annotations import tempfile diff --git a/tests/gentropy/step/test_colocalisation_step.py b/tests/gentropy/step/test_colocalisation_step.py new file mode 100644 index 000000000..e74dee234 --- /dev/null +++ b/tests/gentropy/step/test_colocalisation_step.py @@ -0,0 +1,293 @@ +"""Test colocalisation step.""" + +from pathlib import Path +from typing import Type + +import pytest + +from gentropy.colocalisation import ColocalisationStep +from gentropy.common.session import Session +from gentropy.dataset.colocalisation import Colocalisation +from gentropy.dataset.study_locus import StudyLocus +from gentropy.method.colocalisation import Coloc, ColocalisationMethodInterface, ECaviar + + +@pytest.mark.step_test +class TestColocalisationStep: + """Test colocalisation steps.""" + + @pytest.fixture(autouse=True) + def _setup(self, session: Session, tmp_path: Path) -> None: + """Setup StudyLocus for testing.""" + credible_set_data = [ + ( + "-1299941111165481046", + "gwas", + "1_62634374_G_GA", + "1", + 62634374, + "1:62116600-63176657", + "GCST90269661", + None, + -18.026562155233105, + 8.294741, + -72, + None, + None, + None, + [ + "Variant not found in LD reference, Study locus finemapped without in-sample LD reference" + ], + "SuSiE-inf", + 2, + 128.08235878972883, + 1.0, + 1.0, + 62116600, + 63176657, + None, + [("1_62634374_G_GA", 1.0)], + [ + ( + True, + True, + 303.2017476882394, + 1.0, + "1_62634374_G_GA", + None, + None, + -0.07779708137213309, + None, + None, + ) + ], + "SuSiE fine-mapped credible set with out-of-sample LD", + ), + ( + "-1245591334543437941", + "gwas", + "1_62725906_C_A", + "1", + 62725906, + "1:62275115-62861709", + "GCST90024601", + None, + 6.818181818181818, + 1.0845997, + -12, + None, + None, + None, + [ + "Variant not found in LD reference, Study locus finemapped without in-sample LD reference" + ], + "SuSiE-inf", + 3, + 903.4374513916813, + 1.0, + 1.0, + 62275115, + 62861709, + None, + [("1_62725906_C_A", 1.0)], + [ + ( + True, + True, + 2087.4457573345685, + 0.9999999999381545, + "1_62725906_C_A", + None, + None, + 0.20241232721094407, + None, + None, + ) + ], + "SuSiE fine-mapped credible set with out-of-sample LD", + ), + ( + "-0.20241232721094407", + "gwas", + "1_62725906_C_A", + "1", + 62725906, + "1:62335572-62883302", + "GCST90025461", + None, + 6.363636363636364, + 5.0753098, + -10, + None, + None, + None, + [ + "Variant not found in LD reference, Study locus finemapped without in-sample LD reference" + ], + "SuSiE-inf", + 2, + 912.1598183692258, + 1.0, + 1.0, + 62335572, + 62883302, + None, + [("1_62725906_C_A", 1.0)], + [ + ( + True, + True, + 2107.38950418228, + 0.9999999999454303, + "1_62725906_C_A", + None, + None, + 0.20330391077149534, + None, + None, + ) + ], + "SuSiE fine-mapped credible set with out-of-sample LD", + ), + ( + "-2271857845883525223", + "gwas", + "1_62634374_G_GA", + "1", + 62634374, + "1:62192511-63034021", + "GCST90269580", + None, + -15.43232373355239, + 1.0077391, + -54, + None, + None, + None, + [ + "Variant not found in LD reference, Study locus finemapped without in-sample LD reference" + ], + "SuSiE-inf", + 2, + 104.77639852123883, + 1.0, + 1.0, + 62192511, + 63034021, + None, + [("1_62634374_G_GA", 1.0)], + [ + ( + True, + True, + 249.20354469210795, + 1.0, + "1_62634374_G_GA", + None, + None, + -0.07071263272378725, + None, + None, + ) + ], + "SuSiE fine-mapped credible set with out-of-sample LD", + ), + ] + self.credible_set_path = str(tmp_path / "credible_set_datasets") + session.spark.createDataFrame( + credible_set_data, schema=StudyLocus.get_schema() + ).write.parquet(self.credible_set_path) + self.coloc_path = str(tmp_path / "colocalisation") + + @pytest.mark.parametrize( + ["label", "expected_method"], + [ + pytest.param("coloc", Coloc, id="coloc method"), + pytest.param("ecaviar", ECaviar, id="ecaviar method"), + pytest.param("ECaviar", ECaviar, id="uppercase label"), + ], + ) + def test_get_colocalisation_class( + self, label: str, expected_method: Type[ColocalisationMethodInterface] + ) -> None: + """Test _get_colocalisation_class method on ColocalisationStep.""" + method = ColocalisationStep._get_colocalisation_class(label) + assert ( + method is expected_method + ), "Incorrect colocalisation class returned by ColocalisationStep._get_colocalisation_class(label)" + + def test_label_with_invalid_method(self) -> None: + """Test what happens when invalid method_label is passed to the _get_colocalisation_class.""" + with pytest.raises(ValueError): + ColocalisationStep._get_colocalisation_class("NewMethod") + + @pytest.mark.parametrize( + ["coloc_method", "expected_data"], + [ + pytest.param( + "ecaviar", + { + "clpp": [1.0, 1.0], + "colocalisationMethod": ["eCAVIAR", "eCAVIAR"], + "leftStudyLocusId": [ + "-1245591334543437941", + "-2271857845883525223", + ], + "rightStudyLocusId": [ + "-0.20241232721094407", + "-1299941111165481046", + ], + }, + id="ecaviar", + ), + pytest.param( + "coloc", + { + "h4": [1.0, 1.0], + "h3": [0.0, 0.0], + "h2": [0.0, 0.0], + "h1": [0.0, 0.0], + "h0": [0.0, 0.0], + "colocalisationMethod": ["COLOC", "COLOC"], + "leftStudyLocusId": [ + "-1245591334543437941", + "-2271857845883525223", + ], + "rightStudyLocusId": [ + "-0.20241232721094407", + "-1299941111165481046", + ], + }, + id="coloc", + ), + ], + ) + def test_colocalise( + self, + coloc_method: str, + expected_data: dict[str, list[float] | list[str]], + session: Session, + ) -> None: + """Test colocalise method.""" + ColocalisationStep( + session=session, + credible_set_path=self.credible_set_path, + coloc_path=self.coloc_path, + colocalisation_method=coloc_method, + ) + + coloc_dataset = Colocalisation.from_parquet( + session, self.coloc_path, recursiveFileLookup=True + ) + for column in expected_data: + values = [c[column] for c in coloc_dataset.df.collect()] + expected_values = expected_data[column] + for v, e in zip(values, expected_values): + if isinstance(e, float): + assert ( + e == pytest.approx(v, 1e-1) + ), f"Incorrect value {v} at {column} found in {coloc_method}, expected {e}" + else: + assert ( + e == v + ), f"Incorrect value {v} at {column} found in {coloc_method}, expected {e}" diff --git a/tests/gentropy/step/test_convert_to_vcf_step.py b/tests/gentropy/step/test_convert_to_vcf_step.py new file mode 100644 index 000000000..cc4ec800d --- /dev/null +++ b/tests/gentropy/step/test_convert_to_vcf_step.py @@ -0,0 +1,157 @@ +"""Test convert to vcf step.""" + +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING + +import pandas as pd +import pytest + +from gentropy.common.session import Session +from gentropy.variant_index import ConvertToVcfStep + +if TYPE_CHECKING: + from typing import Any, Literal + + +@pytest.mark.step_test +class TestConvertToVcfStep: + """Test ConvertToVcfStep. + + Test if the step correctly read multiple variant sources and extracts + non duplicated variants and collects to sorted vcf partitions. + """ + + @pytest.mark.parametrize( + ["sources", "partition_size", "expected_partition_number"], + [ + pytest.param( + [ + { + "path": "tests/gentropy/data_samples/variant_sources/uniprot-test.jsonl", + "format": "json", + "n_variants": 50, # 2 variants per chromosome + }, + { + "path": "tests/gentropy/data_samples/variant_sources/eva-test.jsonl", + "format": "json", + "n_variants": 50, # 2 variants per chromosome + }, + { + "path": "tests/gentropy/data_samples/variant_sources/pharmacogenomics-test.jsonl", + "format": "json", + "n_variants": 44, # missing Y and MT, input contains two duplicated variants 22_19963748_G_A and 12_21178615_T_C and + }, + { + "path": "tests/gentropy/data_samples/variant_sources/credible-sets", + "format": "parquet", + "n_variants": 42, # after loci explosion + }, + ], + 10, + 19, # 186 variants / 10 size ~ 19 partitions + id="Multiple OT datasets", + ), + pytest.param( + [ + { + "path": "tests/gentropy/data_samples/variant_sources/credible-sets-extended", + "format": "parquet", + "n_variants": 1187, # after deduplication of locus object + } + ], + 2000, + 1, # 1199 variants / 2000 size ~ 1 partition + id="More variants than spark default partition size", + ), + ], + ) + def test_step( + self, + session: Session, + tmp_path: Path, + sources: list[dict[Literal["path", "format", "n_variants"], Any]], + partition_size: int, + expected_partition_number: int, + ) -> None: + """Test step. + + Expect that step outputs asserted number of partitions, where each partition + contains expected number of variants. + """ + source_paths = [s["path"] for s in sources] + source_formats = [s["format"] for s in sources] + output_path = str(tmp_path / "variants") + ConvertToVcfStep( + session, source_paths, source_formats, output_path, partition_size + ) + + variants_df = session.spark.read.csv(output_path, sep="\t", header=True) + # 40 variants (10 variants from each source) + expected_variant_count = sum(c["n_variants"] for c in sources) + assert ( + variants_df.count() == expected_variant_count + ), "Found incorrect number of variants" + partitions = [ + str(p) for p in Path(output_path).iterdir() if str(p).endswith("csv") + ] + assert ( + len(partitions) == expected_partition_number + ), "Found incorrect number of partitions" + + def test_sorting( + self, + session: Session, + tmp_path: Path, + ) -> None: + """Test sorting in partitions. + + Test if variants within single partition are sorted correctly. + The partition should be naturally sorted by #CHROM and POS fields. + """ + source_path = ( + "tests/gentropy/data_samples/variant_sources/uniprot-test-sort.jsonl" + ) + output_path = str(tmp_path / "variants") + ConvertToVcfStep(session, [source_path], ["json"], output_path, 10) + partitions = [ + str(p) for p in Path(output_path).iterdir() if str(p).endswith("csv") + ] + assert len(partitions) == 1, "Must be one partition to test variant sorting" + df = pd.read_csv( + partitions[0], + usecols=[0, 1], # just read #CHROM and POS + sep="\t", + ) + # values comes from input file tests/gentropy/data_samples/variant_sources/uniprot-test-sorting.jsonl + # NOTE: Natural ordering in CHROM (str) and POS (int) + with open(partitions[0]) as fp: + assert fp.readline().startswith("CHROM\tPOS") + + expected_df = pd.DataFrame( + [ + ("1", 1525242), + ("1", 161306863), + ("11", 108345818), + ("2", 98396018), + ("21", 44286656), + ("3", 38585800), + ("MT", 6277), + ("X", 129562612), + ("Y", 2787426), + ], + columns=["CHROM", "POS"], + ) + + assert list(df.columns) == list(expected_df.columns) + assert df.equals(expected_df), "Variant sorting does not match expectations." + + def test_raises_assertion_imbalanced_arg_ratios(self, session: Session) -> None: + """Test imbalanced argument ratio exception. + + Test if passing uneven number of sources to paths, not 1:1 ratio should result in assertion + """ + with pytest.raises(AssertionError) as e: + ConvertToVcfStep(session, ["dummy_path"], ["json", "json"], "output", 10) + assert e.value[0] == "Must provide format for each source path." diff --git a/tests/gentropy/step/test_credible_set_qc.py b/tests/gentropy/step/test_credible_set_qc.py new file mode 100644 index 000000000..c7fb58c8c --- /dev/null +++ b/tests/gentropy/step/test_credible_set_qc.py @@ -0,0 +1,151 @@ +"""Test credible set qc step.""" + +from pathlib import Path + +import pytest +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from gentropy.common.session import Session +from gentropy.credible_set_qc import CredibleSetQCStep +from gentropy.dataset.study_locus import StudyLocus + + +@pytest.mark.step_test +class TestCredibleSetQCStep: + """Test credible set qc.""" + + @pytest.fixture(autouse=True) + def _setup(self, session: Session, tmp_path: Path) -> None: + """Setup StudyLocus for testing.""" + # NOTE: About the input dataset for tests + # Entry dataset contains 6 loci (3 of them contains duplicated studyLocusId, 2 contains the same studyId) + # The step is expected to remove the duplicates of the studyLocus (1 row) + # THe step is expected to remove rows which pValue <= p_val_threshold (1 row) + # The step is expected to remove rows which purityMinR2 >= to purity_min_r2 (1 row) + # at the end we should end up with 2 non duplicated loci + self.purity_min_r2 = 0.01 + self.p_value_threshold = 1e-5 + self.n_partitions = 1 + credible_set_data = [ + ( + "A", # duplicated credibleSetId + "1_100_G_GA", # variantId + "GCST1", # duplicated studyId + 1.0, # pValMantissa + -6, # pValExponent + 1.0, # credibleSetlog10BF -> should be skipped due to the lowest Log10BF + 1.0, # purityMinR2 + ), + ( + "A", # duplicated credibleSetId + "1_100_G_GA", # variantId + "GCST1", # duplicated studyId + 1.0, # pValMantissa + -6, # pValExponent + 2.0, # credibleSetlog10BF -> highest log10BF within duplicates considering single study + 1.0, # purityMinR2 + ), + ( + "A", # duplicated credibleSetId + "1_100_G_GA", # variantId + "GCST2", # studyId + 1.0, # pValMantissa + -6, # pValExponent + 3.0, # credibleSetlog10BF -> highest log10BF within duplicates + 1.0, # purityMinR2 + ), + ( + "B", # credibleSetId + "1_200_G_GA", # variantId + "GCST3", # studyId + 1.0, # pValMantissa + -4, # too high pValExponent => pVal = 1.0e-4 < p_val_threshold + 1.0, # credibleSetlog10BF + 1.0, # purityMinR2 + ), + ( + "C", # credibleSetId + "1_300_G_GA", # variantId + "GCST3", # studyId + 1.0, # pValMantissa + -6, # pValExponent + 1.0, # credibleSetlog10BF + 0.001, # purityMinR2 < purity_min_r2 + ), + ( + # full row OK! + "D", # credibleSetId + "1_400_G_GA", # variantId + "GCST3", # studyId + 1.0, # pValMantissa + -6, # pValExponent + 1.0, # credibleSetlog10BF + 1.0, # purityMinR2 + ), + ] + cs_schema = t.StructType( + [ + t.StructField("studyLocusId", t.StringType(), True), + t.StructField("variantId", t.StringType(), True), + t.StructField("studyId", t.StringType(), True), + t.StructField("pValueMantissa", t.FloatType(), True), + t.StructField("pValueExponent", t.IntegerType(), True), + t.StructField("credibleSetlog10BF", t.DoubleType(), True), + t.StructField("purityMinR2", t.DoubleType(), True), + ] + ) + + # NOTE: Use proper input! + # Ensure the input dataset is saved per studyLocusId in recursive manner. + # This mimics the dataset with multiple loci evaluated separately. + self.credible_set_path = str(tmp_path / "credible_set_datasets") + cs_df = session.spark.createDataFrame(credible_set_data, schema=cs_schema) + cs_path = tmp_path / "credible_set_dataset" + loci_ids = {row["studyLocusId"] for row in cs_df.collect()} + for loci_id in loci_ids: + loci_path = str(cs_path / loci_id) + cs_df.filter(f.col("studyLocusId") == loci_id).write.parquet(loci_path) + self.input_cs_df = cs_df + self.cs_path = str(cs_path) + self.output_path = str(tmp_path / "clean_credible_sets") + + def test_step(self, session: Session) -> None: + """Invoke the step to check if it works correctly.""" + assert not Path(self.output_path).exists(), "Input for qc does not exists." + assert Path(self.cs_path).exists(), "Output of qc is not emptied before test." + assert self.input_cs_df.count() == 6, "Incorrect number of rows." + CredibleSetQCStep( + session=session, + credible_sets_path=self.cs_path, + output_path=self.output_path, + p_value_threshold=self.p_value_threshold, + purity_min_r2=self.purity_min_r2, + clump=False, + ld_index_path=None, + study_index_path=None, + ld_min_r2=None, + n_partitions=self.n_partitions, + ) + + assert Path(self.output_path).exists(), "Output of qc does not exists." + # check the number of partitions + partitions = [ + str(p) + for p in Path(self.output_path).iterdir() + if str(p).endswith(".parquet") + ] + assert ( + len(partitions) == self.n_partitions + ), "Incorrect number of partitions in the output." + cs = StudyLocus.from_parquet( + session, self.output_path, recursiveFileLookup=True + ) + assert cs.df.count() == 2 # Row A where LogBF == 3.0 and row D + assert cs.df.rdd.getNumPartitions() == self.n_partitions + data = { + row["studyLocusId"]: row["credibleSetlog10BF"] for row in cs.df.collect() + } + assert sorted(data.keys()) == ["A", "D"] + # ensure the Locus A with highest credibleSetlog10BF was chosen + assert data["A"] == 3.0 diff --git a/tests/gentropy/test_cli.py b/tests/gentropy/test_cli.py index 92effa840..dbb5a8cac 100644 --- a/tests/gentropy/test_cli.py +++ b/tests/gentropy/test_cli.py @@ -1,11 +1,13 @@ """Test the command-line interface (CLI).""" + from unittest.mock import patch import pytest -from gentropy.cli import main from hydra.errors import ConfigCompositionException from omegaconf.errors import MissingMandatoryValue +from gentropy.cli import main + def test_main_no_step() -> None: """Test the main function of the CLI without a valid step.""" diff --git a/tests/gentropy/test_schemas.py b/tests/gentropy/test_schemas.py index 768a3d4df..1b06076d0 100644 --- a/tests/gentropy/test_schemas.py +++ b/tests/gentropy/test_schemas.py @@ -1,4 +1,5 @@ """Tests on spark schemas.""" + from __future__ import annotations import json @@ -11,10 +12,13 @@ import pytest from pyspark.sql.types import StructType +from gentropy.common.schemas import SchemaValidationError + if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest + from gentropy.dataset.gene_index import GeneIndex - from gentropy.dataset.v2g import V2G + from gentropy.dataset.l2g_prediction import L2GPrediction SCHEMA_DIR = "src/gentropy/assets/schemas" @@ -56,6 +60,9 @@ def test_schema_columns_camelcase(schema_json: str) -> None: Args: schema_json (str): schema filename """ + if schema_json == "vep_json_output.json": + pytest.skip("VEP schema is exempt from camelCase check.") + core_schema = json.loads(Path(SCHEMA_DIR, schema_json).read_text(encoding="utf-8")) schema = StructType.fromJson(core_schema) # Use a regular expression to check if the identifier is in camelCase @@ -68,61 +75,69 @@ def test_schema_columns_camelcase(schema_json: str) -> None: class TestValidateSchema: - """Test validate_schema method using V2G (unnested) and GeneIndex (nested) as a testing dataset.""" + """Test validate_schema method using L2GPrediction (unnested) and GeneIndex (nested) as a testing dataset.""" @pytest.fixture() def mock_dataset_instance( self: TestValidateSchema, request: FixtureRequest - ) -> V2G | GeneIndex: + ) -> L2GPrediction | GeneIndex: """Meta fixture to return the value of any requested fixture.""" return request.getfixturevalue(request.param) @pytest.mark.parametrize( - "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + "mock_dataset_instance", + ["mock_l2g_predictions", "mock_gene_index"], + indirect=True, ) def test_validate_schema_extra_field( self: TestValidateSchema, - mock_dataset_instance: V2G | GeneIndex, + mock_dataset_instance: L2GPrediction | GeneIndex, ) -> None: """Test that validate_schema raises an error if the observed schema has an extra field.""" - with pytest.raises(ValueError, match="extraField"): + with pytest.raises(SchemaValidationError, match="extraField"): mock_dataset_instance.df = mock_dataset_instance.df.withColumn( "extraField", f.lit("extra") ) @pytest.mark.parametrize( - "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + "mock_dataset_instance", + ["mock_l2g_predictions", "mock_gene_index"], + indirect=True, ) def test_validate_schema_missing_field( self: TestValidateSchema, - mock_dataset_instance: V2G | GeneIndex, + mock_dataset_instance: L2GPrediction | GeneIndex, ) -> None: """Test that validate_schema raises an error if the observed schema is missing a required field, geneId in this case.""" - with pytest.raises(ValueError, match="geneId"): + with pytest.raises(SchemaValidationError, match="geneId"): mock_dataset_instance.df = mock_dataset_instance.df.drop("geneId") @pytest.mark.parametrize( - "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + "mock_dataset_instance", + ["mock_l2g_predictions", "mock_gene_index"], + indirect=True, ) def test_validate_schema_duplicated_field( self: TestValidateSchema, - mock_dataset_instance: V2G | GeneIndex, + mock_dataset_instance: L2GPrediction | GeneIndex, ) -> None: """Test that validate_schema raises an error if the observed schema has a duplicated field, geneId in this case.""" - with pytest.raises(ValueError, match="geneId"): + with pytest.raises(SchemaValidationError, match="geneId"): mock_dataset_instance.df = mock_dataset_instance.df.select( "*", f.lit("A").alias("geneId") ) @pytest.mark.parametrize( - "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + "mock_dataset_instance", + ["mock_l2g_predictions", "mock_gene_index"], + indirect=True, ) def test_validate_schema_different_datatype( self: TestValidateSchema, - mock_dataset_instance: V2G | GeneIndex, + mock_dataset_instance: L2GPrediction | GeneIndex, ) -> None: """Test that validate_schema raises an error if any field in the observed schema has a different type than expected.""" - with pytest.raises(ValueError, match="geneId"): + with pytest.raises(SchemaValidationError, match="geneId"): mock_dataset_instance.df = mock_dataset_instance.df.withColumn( "geneId", f.lit(1) ) diff --git a/tests/gentropy/test_spark_helpers.py b/tests/gentropy/test_spark_helpers.py index 76abcbe56..1adb686cd 100644 --- a/tests/gentropy/test_spark_helpers.py +++ b/tests/gentropy/test_spark_helpers.py @@ -1,16 +1,18 @@ """Tests on helper spark functions.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any import pyspark.sql.functions as f import pytest +from pyspark.sql.types import ArrayType, DoubleType, StructField, StructType + from gentropy.common.spark_helpers import ( get_record_with_maximum_value, get_record_with_minimum_value, order_array_of_structs_by_field, ) -from pyspark.sql.types import ArrayType, DoubleType, StructField, StructType if TYPE_CHECKING: from pyspark.sql import DataFrame, SparkSession diff --git a/utils/install_dependencies.sh b/utils/install_dependencies.sh index e17290f1f..33c5cf8b1 100644 --- a/utils/install_dependencies.sh +++ b/utils/install_dependencies.sh @@ -30,7 +30,6 @@ poetry install --sync echo "Setting up pre-commit..." poetry run pre-commit install -poetry run pre-commit autoupdate poetry run pre-commit install --hook-type commit-msg echo "Activating the Poetry environment..." diff --git a/utils/install_dependencies_on_cluster.sh b/utils/install_dependencies_on_cluster.sh index 9f26b9f17..849dee0c3 100644 --- a/utils/install_dependencies_on_cluster.sh +++ b/utils/install_dependencies_on_cluster.sh @@ -3,7 +3,6 @@ set -exo pipefail readonly PACKAGE=$(/usr/share/google/get_metadata_value attributes/PACKAGE || true) -readonly CONFIGTAR=$(/usr/share/google/get_metadata_value attributes/CONFIGTAR || true) function err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2 @@ -61,11 +60,10 @@ function main() { echo "Uninstalling previous version if it exists" pip uninstall -y gentropy echo "Install package..." - run_with_retry pip install --upgrade ${PACKAGENAME} + # NOTE: ensure the gentropy is reinstalled each time without version cache + # see https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-force-reinstall + run_with_retry pip install --force-reinstall --ignore-installed ${PACKAGENAME} - echo "Downloading and uncompressing config..." - gsutil cp ${CONFIGTAR} . || err "Failed to download CONFIGTAR" - tar -xvf $(basename ${CONFIGTAR}) || err "Failed to extract CONFIGTAR" } main diff --git a/utils/update_GWAS_Catalog_data.sh b/utils/update_GWAS_Catalog_data.sh index 1e380d30c..00ee44d8f 100755 --- a/utils/update_GWAS_Catalog_data.sh +++ b/utils/update_GWAS_Catalog_data.sh @@ -15,7 +15,7 @@ get_release_url(){ # Function to get the Ensembl and EFO version which used to ground GWAS data: get_release_info(){ - curl -s https://www.ebi.ac.uk/gwas/api/search/stats | jq -r '"\(.ensemblbuild) \(.efoversion)"' + curl -s "${1}" | jq -r '"\(.ensemblbuild) \(.efoversion)"' } logging(){ @@ -41,6 +41,18 @@ upload_file_to_gcp(){ fi } +fetch_from_ftp(){ + URL=${1} + TARGET=${2} + wget -q ${URL} -O ${TARGET} + if [ $? -ne 0 ]; then + logging "Failed to fetch ${URL}" + return + else + logging "File ${TARGET} saved." + fi +} + # Resources: export BASE_URL=ftp://ftp.ebi.ac.uk/pub/databases/gwas export RELEASE_INFO_URL=https://www.ebi.ac.uk/gwas/api/search/stats @@ -71,7 +83,7 @@ read YEAR MONTH DAY < <(get_release_url) logging "Most recent GWAS Catalog release: ${YEAR}/${MONTH}/${DAY}" # Capturing release metadata: -read ENSEMBL EFO < <(get_release_info) +read ENSEMBL EFO < <(get_release_info ${RELEASE_INFO_URL}) logging "Genes were mapped to v${ENSEMBL} Ensembl release." logging "Diseases were mapped to ${EFO} EFO release." @@ -80,26 +92,19 @@ RELEASE_URL=${BASE_URL}/releases/${YEAR}/${MONTH}/${DAY} logging "Datafiles are fetching from ${RELEASE_URL}" # Fetching files while assigning properly dated and annotated names: -wget -q ${RELEASE_URL}/gwas-catalog-associations_ontology-annotated.tsv -O ${ASSOCIATION_FILE} -logging "File ${ASSOCIATION_FILE} saved." +fetch_from_ftp ${RELEASE_URL}/gwas-catalog-associations_ontology-annotated.tsv ${ASSOCIATION_FILE} -wget -q ${RELEASE_URL}/gwas-catalog-download-studies-v1.0.3.txt -O ${PUBLISHED_STUDIES_FILE} -logging "File ${PUBLISHED_STUDIES_FILE} saved." +fetch_from_ftp ${RELEASE_URL}/gwas-catalog-download-studies-v1.0.3.1.txt ${PUBLISHED_STUDIES_FILE} -wget -q ${RELEASE_URL}/gwas-catalog-unpublished-studies-v1.0.3.tsv -O ${UNPUBLISHED_STUDIES_FILE} -logging "File ${UNPUBLISHED_STUDIES_FILE} saved." +fetch_from_ftp ${RELEASE_URL}/gwas-catalog-unpublished-studies-v1.0.3.1.tsv ${UNPUBLISHED_STUDIES_FILE} -wget -q ${RELEASE_URL}/gwas-catalog-download-ancestries-v1.0.3.txt -O ${PUBLISHED_ANCESTRIES_FILE} -logging "File ${PUBLISHED_ANCESTRIES_FILE} saved." +fetch_from_ftp ${RELEASE_URL}/gwas-catalog-download-ancestries-v1.0.3.1.txt ${PUBLISHED_ANCESTRIES_FILE} -wget -q ${RELEASE_URL}/gwas-catalog-unpublished-ancestries-v1.0.3.tsv -O ${UNPUBLISHED_ANCESTRIES_FILE} -logging "File ${UNPUBLISHED_ANCESTRIES_FILE} saved." +fetch_from_ftp ${RELEASE_URL}/gwas-catalog-unpublished-ancestries-v1.0.3.1.tsv ${UNPUBLISHED_ANCESTRIES_FILE} -wget -q ${BASE_URL}/summary_statistics/harmonised_list.txt -O ${HARMONISED_LIST_FILE} -logging "File ${HARMONISED_LIST_FILE} saved." +fetch_from_ftp ${BASE_URL}/summary_statistics/harmonised_list.txt ${HARMONISED_LIST_FILE} -wget -q ${GWAS_CATALOG_STUDY_CURATION_URL} -O ${GWAS_CATALOG_STUDY_CURATION_FILE} -logging "In-house GWAS Catalog study curation file fetched from GitHub." +fetch_from_ftp ${GWAS_CATALOG_STUDY_CURATION_URL} ${GWAS_CATALOG_STUDY_CURATION_FILE} logging "Copying files to GCP..."