diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..abbc82607 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,20 @@ +name: CI + +on: + # run on pushed commits to master and on new commits on pull requests + push: + pull_request: + types: [opened, synchronize] + +jobs: + Security: + name: Security Pipeline + uses: uc-cdis/.github/.github/workflows/securitypipeline.yaml@master + with: + python-poetry: 'false' + secrets: inherit # pragma: allowlist secret + UnitTest: + name: Python Unit Test + uses: uc-cdis/.github/.github/workflows/python_unit_test.yaml@master + with: + python-version: '3.9' \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yaml similarity index 77% rename from .github/workflows/docs.yml rename to .github/workflows/docs.yaml index 5b89a4576..e57632f58 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yaml @@ -1,8 +1,9 @@ -name: Build docs +name: Docs on: + # DON'T run on pushed commits to master, ONLY on new commits on pull requests pull_request: - branches: [ master ] + types: [opened, synchronize] jobs: build_docs: @@ -11,7 +12,8 @@ jobs: steps: - uses: actions/checkout@v2 with: - ref: ${{ github.head_ref }} + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - name: Set up Python 3.9 uses: actions/setup-python@v1 with: @@ -24,19 +26,20 @@ jobs: ${{ runner.os }}-poetry- - name: Install dependencies run: | - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - - source $HOME/.poetry/env + pip install poetry poetry config virtualenvs.create false - poetry install -vv + poetry install -vv --all-extras --no-interaction + poetry show -vv + # install sphinx from PyPI (as of 03/16/21 python3-sphinx is broken) # sudo apt-get install python3-sphinx pip install sphinx pip uninstall -y asyncio + pip list cd - name: Build docs run: | sphinx-build --version - source $HOME/.poetry/env export PYTHONPATH="${PYTHONPATH}:${{ env.pythonLocation }}/lib/python3.9/site-packages" cd docs poetry run make html diff --git a/.github/workflows/main.yml b/.github/workflows/lint.yaml similarity index 73% rename from .github/workflows/main.yml rename to .github/workflows/lint.yaml index 59e96ae2f..8cc810099 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/lint.yaml @@ -1,5 +1,6 @@ on: pull_request: + types: [opened, synchronize] issue_comment: types: [created, edited] @@ -11,7 +12,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - - uses: uc-cdis/wool@master env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3532039cc..e530d0750 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,11 @@ indexing-output-manifest.csv object-manifest.csv output_manifest.csv +.dccache +.idea +# Files generated during pytest +input.csv +test_combined_discovery_metadata.tsv +test_combined_discovery_metadata_exact_match.tsv +tmp_output_file.csv +tmp_output_file_info.csv diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b52c89394..352da81e4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,17 +1,17 @@ repos: - repo: git@github.com:Yelp/detect-secrets - rev: v0.13.1 + rev: v1.4.0 hooks: - id: detect-secrets args: ['--baseline', '.secrets.baseline'] exclude: '(docs\/_build|poetry.lock)' - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.5.0 + rev: v4.4.0 hooks: - id: no-commit-to-branch args: [--branch, develop, --branch, master, --pattern, release/.*] - repo: https://github.com/psf/black - rev: 22.3.0 + rev: 23.1.0 hooks: - id: black additional_dependencies: ['click==8.0.4'] diff --git a/.secexclude b/.secexclude deleted file mode 100644 index 8c2dbe13f..000000000 --- a/.secexclude +++ /dev/null @@ -1,52 +0,0 @@ -*.cfg -*.crt -*.css -*.cwl -*.eot -*.gif -*.gpg -*.ico -*.ini -*.ipynb -*.jpg -*.json -*.md -*.min.js -*.njk -*.png -*.rst -*.sh -*.sls -*.sql -*.svg -*.tif -*.tsv -*.ttf -*.txt -*.woff -*.woff2 -*.xml -*.yaml -*.yml -*.zip -.DS_Store -.DS_Store? -.Spotlight-V100 -.Trashes -._* -.dockerignore -.githooks/* -.github/* -.gitignore -.travis.yml -Dockerfile -Jenkinsfile -LICENSE -NOTICE -Thumbs.db -docker-compose.yml -ehthumbs.db -migrations/* -nginx.conf -test/* -tests/* \ No newline at end of file diff --git a/.secrets.baseline b/.secrets.baseline index df9ea536d..87ffb76a6 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -1,19 +1,18 @@ { - "exclude": { - "files": "(docs\\/_build|poetry.lock)|^.secrets.baseline$", - "lines": null - }, - "generated_at": "2022-07-12T20:56:54Z", + "version": "1.4.0", "plugins_used": [ + { + "name": "ArtifactoryDetector" + }, { "name": "AWSKeyDetector" }, { - "name": "ArtifactoryDetector" + "name": "AzureStorageKeyDetector" }, { - "base64_limit": 4.5, - "name": "Base64HighEntropyString" + "name": "Base64HighEntropyString", + "limit": 4.5 }, { "name": "BasicAuthDetector" @@ -22,8 +21,14 @@ "name": "CloudantDetector" }, { - "hex_limit": 3, - "name": "HexHighEntropyString" + "name": "DiscordBotTokenDetector" + }, + { + "name": "GitHubTokenDetector" + }, + { + "name": "HexHighEntropyString", + "limit": 3.0 }, { "name": "IbmCloudIamDetector" @@ -35,21 +40,30 @@ "name": "JwtTokenDetector" }, { - "keyword_exclude": null, - "name": "KeywordDetector" + "name": "KeywordDetector", + "keyword_exclude": "" }, { "name": "MailchimpDetector" }, + { + "name": "NpmDetector" + }, { "name": "PrivateKeyDetector" }, + { + "name": "SendGridDetector" + }, { "name": "SlackDetector" }, { "name": "SoftlayerDetector" }, + { + "name": "SquareOAuthDetector" + }, { "name": "StripeDetector" }, @@ -57,357 +71,590 @@ "name": "TwilioKeyDetector" } ], + "filters_used": [ + { + "path": "detect_secrets.filters.allowlist.is_line_allowlisted" + }, + { + "path": "detect_secrets.filters.common.is_baseline_file", + "filename": ".secrets.baseline" + }, + { + "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies", + "min_level": 2 + }, + { + "path": "detect_secrets.filters.heuristic.is_indirect_reference" + }, + { + "path": "detect_secrets.filters.heuristic.is_likely_id_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_lock_file" + }, + { + "path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_potential_uuid" + }, + { + "path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign" + }, + { + "path": "detect_secrets.filters.heuristic.is_sequential_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_swagger_file" + }, + { + "path": "detect_secrets.filters.heuristic.is_templated_secret" + } + ], "results": { - "docs/howto/metadataTools.md": [ + ".travis.yml": [ { - "hashed_secret": "7c35c215b326b9463b669b657c1ff9873ff53d9a", + "type": "Base64 High Entropy String", + "filename": ".travis.yml", + "hashed_secret": "2b450d45e8b520a9b25727d563d1d7e036497655", "is_verified": false, - "line_number": 203, - "type": "Hex High Entropy String" + "line_number": 47 }, { + "type": "Base64 High Entropy String", + "filename": ".travis.yml", + "hashed_secret": "8dbd93a5374b178c4c142aa603c6daf3edd8413e", + "is_verified": false, + "line_number": 48 + } + ], + "docs/_build/html/.buildinfo": [ + { + "type": "Hex High Entropy String", + "filename": "docs/_build/html/.buildinfo", + "hashed_secret": "52acb5a7ffb1bfafa0e4f02cfbbfc70c59e7906d", + "is_verified": false, + "line_number": 3 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/_build/html/.buildinfo", + "hashed_secret": "63256a38625700f409b7ec5db8fa05ffd2cb88b2", + "is_verified": false, + "line_number": 4 + } + ], + "docs/howto/metadataTools.md": [ + { + "type": "Hex High Entropy String", + "filename": "docs/howto/metadataTools.md", "hashed_secret": "0d515eaf06062d52e8c80abb4d3b713a65396d30", "is_verified": false, - "line_number": 208, - "type": "Hex High Entropy String" + "line_number": 189 }, { + "type": "Hex High Entropy String", + "filename": "docs/howto/metadataTools.md", "hashed_secret": "b4cff7c2af45cdfe66195ec574a7b8832f8621ea", "is_verified": false, - "line_number": 215, - "type": "Hex High Entropy String" + "line_number": 189 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/howto/metadataTools.md", + "hashed_secret": "7c35c215b326b9463b669b657c1ff9873ff53d9a", + "is_verified": false, + "line_number": 202 + }, + { + "type": "Secret Keyword", + "filename": "docs/howto/metadataTools.md", + "hashed_secret": "749dcc9e92f723c96ed4a3a908ded1bc559c66a9", + "is_verified": false, + "line_number": 540 + } + ], + "docs/reference/sdkClasses.md": [ + { + "type": "Secret Keyword", + "filename": "docs/reference/sdkClasses.md", + "hashed_secret": "749dcc9e92f723c96ed4a3a908ded1bc559c66a9", + "is_verified": false, + "line_number": 58 } ], "docs/tutorial/quickStart.md": [ { + "type": "Hex High Entropy String", + "filename": "docs/tutorial/quickStart.md", "hashed_secret": "301918c8b904630da85e75ee32e9ba68ff925b73", "is_verified": false, - "line_number": 74, - "type": "Hex High Entropy String" + "line_number": 75 } ], "tests/bundle_tests/test_bundle_ingestion.py": [ { - "hashed_secret": "bbe496b7ae06cf635b221afedd43098f4172d7cb", + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/test_bundle_ingestion.py", + "hashed_secret": "e1da93616713812cb50e0ac845b1e9e305d949f1", "is_verified": false, - "line_number": 104, - "type": "Hex High Entropy String" + "line_number": 44 }, { - "hashed_secret": "968d57fa495dde77707437e3c94f8da2d4074c84", + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/test_bundle_ingestion.py", + "hashed_secret": "47f42f4c34fddab383b817e689dc0fb75af81266", "is_verified": false, - "line_number": 107, - "type": "Hex High Entropy String" + "line_number": 52 }, { - "hashed_secret": "e1da93616713812cb50e0ac845b1e9e305d949f1", + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/test_bundle_ingestion.py", + "hashed_secret": "300d95dd5d30ab6928ffda6c08c6a129a23e5b39", "is_verified": false, - "line_number": 119, - "type": "Hex High Entropy String" + "line_number": 61 }, { - "hashed_secret": "47f42f4c34fddab383b817e689dc0fb75af81266", + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/test_bundle_ingestion.py", + "hashed_secret": "bbe496b7ae06cf635b221afedd43098f4172d7cb", "is_verified": false, - "line_number": 127, - "type": "Hex High Entropy String" + "line_number": 93 }, { - "hashed_secret": "300d95dd5d30ab6928ffda6c08c6a129a23e5b39", + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/test_bundle_ingestion.py", + "hashed_secret": "968d57fa495dde77707437e3c94f8da2d4074c84", "is_verified": false, - "line_number": 136, - "type": "Hex High Entropy String" + "line_number": 96 } ], "tests/bundle_tests/valid_manifest.csv": [ { + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/valid_manifest.csv", "hashed_secret": "968d57fa495dde77707437e3c94f8da2d4074c84", "is_verified": false, - "line_number": 6, - "type": "Hex High Entropy String" + "line_number": 6 }, { + "type": "Hex High Entropy String", + "filename": "tests/bundle_tests/valid_manifest.csv", "hashed_secret": "bbe496b7ae06cf635b221afedd43098f4172d7cb", "is_verified": false, - "line_number": 6, - "type": "Hex High Entropy String" + "line_number": 6 } ], "tests/download_tests/resources/dataguids_commons1.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/dataguids_commons1.json", "hashed_secret": "8c9a1166eab2cb85ccc7f3ab1d0c972a222c8fde", "is_verified": false, - "line_number": 16, - "type": "Hex High Entropy String" + "line_number": 16 } ], "tests/download_tests/resources/drs_object_commons3.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_object_commons3.json", "hashed_secret": "8c9a1166eab2cb85ccc7f3ab1d0c972a222c8fde", "is_verified": false, - "line_number": 15, - "type": "Hex High Entropy String" + "line_number": 15 } ], "tests/download_tests/resources/drs_objects.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "8c9a1166eab2cb85ccc7f3ab1d0c972a222c8fde", "is_verified": false, - "line_number": 17, - "type": "Hex High Entropy String" + "line_number": 17 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "08d7c960f61ee9654cce7d3e553f96db617a044d", "is_verified": false, - "line_number": 47, - "type": "Hex High Entropy String" + "line_number": 47 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "97a21a900edf0e7f0697664e64bca030ac07b0f7", "is_verified": false, - "line_number": 76, - "type": "Hex High Entropy String" + "line_number": 76 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "a8f24876ffd6cc7576b6f0f8f20580f2aabdf9b6", "is_verified": false, - "line_number": 136, - "type": "Hex High Entropy String" + "line_number": 106 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "c59c7c1a234691b797e9d47ef2769e4edc4a9bc6", "is_verified": false, - "line_number": 170, - "type": "Hex High Entropy String" + "line_number": 170 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "f755b5b416e81d4c768bca49d8951ebba3f4666d", "is_verified": false, - "line_number": 174, - "type": "Hex High Entropy String" + "line_number": 174 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "195760416def756cf48aabe259bc97dcad599979", "is_verified": false, - "line_number": 178, - "type": "Hex High Entropy String" + "line_number": 178 }, { - "hashed_secret": "d162413fa99c56914e2f4502359a135d07b6c4c2", + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", + "hashed_secret": "1fee40bfa56e1899cf5363f57a8dc491ef8dd02e", "is_verified": false, - "line_number": 296, - "type": "Hex High Entropy String" + "line_number": 182 }, { - "hashed_secret": "1fee40bfa56e1899cf5363f57a8dc491ef8dd02e", + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", + "hashed_secret": "d162413fa99c56914e2f4502359a135d07b6c4c2", "is_verified": false, - "line_number": 331, - "type": "Hex High Entropy String" + "line_number": 270 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/drs_objects.json", "hashed_secret": "bcbf966945c7e3f7592a7e067382afd71dcdc107", "is_verified": false, - "line_number": 510, - "type": "Hex High Entropy String" + "line_number": 360 } ], "tests/download_tests/resources/manifest_test_1.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/manifest_test_1.json", "hashed_secret": "8c9a1166eab2cb85ccc7f3ab1d0c972a222c8fde", "is_verified": false, - "line_number": 3, - "type": "Hex High Entropy String" + "line_number": 3 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/manifest_test_1.json", "hashed_secret": "54a2e9ce63b1cc74558348c0aea7304e1a389766", "is_verified": false, - "line_number": 10, - "type": "Hex High Entropy String" + "line_number": 10 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/manifest_test_1.json", "hashed_secret": "97a21a900edf0e7f0697664e64bca030ac07b0f7", "is_verified": false, - "line_number": 17, - "type": "Hex High Entropy String" + "line_number": 17 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/manifest_test_1.json", "hashed_secret": "a8f24876ffd6cc7576b6f0f8f20580f2aabdf9b6", "is_verified": false, - "line_number": 24, - "type": "Hex High Entropy String" + "line_number": 24 } ], "tests/download_tests/resources/manifest_test_hostname_not_in_wts.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/manifest_test_hostname_not_in_wts.json", "hashed_secret": "8c9a1166eab2cb85ccc7f3ab1d0c972a222c8fde", "is_verified": false, - "line_number": 3, - "type": "Hex High Entropy String" + "line_number": 3 } ], "tests/download_tests/resources/mds_package.json": [ { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/mds_package.json", "hashed_secret": "0d515eaf06062d52e8c80abb4d3b713a65396d30", "is_verified": false, - "line_number": 173, - "type": "Hex High Entropy String" + "line_number": 17 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/mds_package.json", "hashed_secret": "b4cff7c2af45cdfe66195ec574a7b8832f8621ea", "is_verified": false, - "line_number": 181, - "type": "Hex High Entropy String" + "line_number": 25 }, { + "type": "Hex High Entropy String", + "filename": "tests/download_tests/resources/mds_package.json", "hashed_secret": "bcbf966945c7e3f7592a7e067382afd71dcdc107", "is_verified": false, - "line_number": 190, - "type": "Hex High Entropy String" + "line_number": 34 + } + ], + "tests/download_tests/test_async_download.py": [ + { + "type": "Secret Keyword", + "filename": "tests/download_tests/test_async_download.py", + "hashed_secret": "f0243b023d0551febbeac98dab37b0780328cb99", + "is_verified": false, + "line_number": 220 + } + ], + "tests/merge_manifests/discovery_combine/discovery.tsv": [ + { + "type": "Hex High Entropy String", + "filename": "tests/merge_manifests/discovery_combine/discovery.tsv", + "hashed_secret": "e8a4e965bc8809f251c3a87e02293a6a1cd74c97", + "is_verified": false, + "line_number": 160 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/merge_manifests/discovery_combine/discovery.tsv", + "hashed_secret": "15152af7feace3f6d1b5f800c8c6d2c1db9e240e", + "is_verified": false, + "line_number": 161 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/merge_manifests/discovery_combine/discovery.tsv", + "hashed_secret": "fb73d4c4b811c7e2f781b1a3dabc281fb9f6868b", + "is_verified": false, + "line_number": 162 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/merge_manifests/discovery_combine/discovery.tsv", + "hashed_secret": "b6bb1128fca99567fb54d64d76630a9223f4c394", + "is_verified": false, + "line_number": 163 } ], "tests/test_auth.py": [ { + "type": "Secret Keyword", + "filename": "tests/test_auth.py", "hashed_secret": "5354c5456431f0267f85dde6eaa69f666af0afb1", "is_verified": false, - "line_number": 12, - "type": "Secret Keyword" + "line_number": 13 + }, + { + "type": "Secret Keyword", + "filename": "tests/test_auth.py", + "hashed_secret": "f82f808abc6f0b7b559449988f1900a38214090f", + "is_verified": false, + "line_number": 33 + }, + { + "type": "Secret Keyword", + "filename": "tests/test_auth.py", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 527 } ], "tests/test_data/packages_manifest_ok.tsv": [ { + "type": "Hex High Entropy String", + "filename": "tests/test_data/packages_manifest_ok.tsv", "hashed_secret": "0d515eaf06062d52e8c80abb4d3b713a65396d30", "is_verified": false, - "line_number": 6, - "type": "Hex High Entropy String" + "line_number": 3 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_data/packages_manifest_ok.tsv", "hashed_secret": "b4cff7c2af45cdfe66195ec574a7b8832f8621ea", "is_verified": false, - "line_number": 6, - "type": "Hex High Entropy String" + "line_number": 3 + } + ], + "tests/test_diff.py": [ + { + "type": "Hex High Entropy String", + "filename": "tests/test_diff.py", + "hashed_secret": "f9e664db75c7f23a299b0b055c10e08d47073e93", + "is_verified": false, + "line_number": 25 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_diff.py", + "hashed_secret": "7d35b46eef5870d91fcf4d3f43fd2790a7008161", + "is_verified": false, + "line_number": 55 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_diff.py", + "hashed_secret": "13fa17e621a69c7e6433f4180efc7e25538ac59c", + "is_verified": false, + "line_number": 61 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_diff.py", + "hashed_secret": "871ea9e2dc980ce7fc547cd091da1d3796bbb8aa", + "is_verified": false, + "line_number": 67 } ], "tests/test_file.py": [ { + "type": "Secret Keyword", + "filename": "tests/test_file.py", "hashed_secret": "bc5494e9e5c7bd002f295376f6130e2eced73a4a", "is_verified": false, - "line_number": 386, - "type": "Secret Keyword" + "line_number": 84 } ], "tests/test_index.py": [ { - "hashed_secret": "995018d248e5bf0c4ca4fb44c52e2eb9be4876a7", + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", + "hashed_secret": "0b1691078688badae57b2078ae6b00c7eec78972", "is_verified": false, - "line_number": 62, - "type": "Hex High Entropy String" + "line_number": 28 }, { - "hashed_secret": "0b1691078688badae57b2078ae6b00c7eec78972", + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", + "hashed_secret": "995018d248e5bf0c4ca4fb44c52e2eb9be4876a7", "is_verified": false, - "line_number": 93, - "type": "Hex High Entropy String" + "line_number": 32 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", "hashed_secret": "50d0a1cf4bf47b1625d4a8e4b0afad02012eb3da", "is_verified": false, - "line_number": 97, - "type": "Hex High Entropy String" + "line_number": 36 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", "hashed_secret": "98f0a724b4285da1d5dced7c16d8a546f08c297d", "is_verified": false, - "line_number": 124, - "type": "Hex High Entropy String" + "line_number": 124 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", "hashed_secret": "190506946c18c0b0b2dd270e8de76ebc8d5ad672", "is_verified": false, - "line_number": 174, - "type": "Hex High Entropy String" + "line_number": 165 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_index.py", "hashed_secret": "0fdd976872ec302887d854f6b1452bd8fcdf76dc", "is_verified": false, - "line_number": 226, - "type": "Hex High Entropy String" + "line_number": 219 } ], "tests/test_jobs.py": [ { + "type": "Hex High Entropy String", + "filename": "tests/test_jobs.py", "hashed_secret": "16ac780c5e695ed5f79a4300ac498e07200c9865", "is_verified": false, - "line_number": 153, - "type": "Hex High Entropy String" + "line_number": 153 } ], "tests/test_manifests.py": [ { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "6487fa7aea293dfde99cda9c6ccb9161219331c7", "is_verified": false, - "line_number": 110, - "type": "Hex High Entropy String" - }, - { - "hashed_secret": "96c9184fb19c9c1618ccf44d141f8029a739891c", - "is_verified": false, - "line_number": 424, - "type": "Hex High Entropy String" + "line_number": 110 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "e1da93616713812cb50e0ac845b1e9e305d949f1", "is_verified": false, - "line_number": 559, - "type": "Hex High Entropy String" + "line_number": 133 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "47f42f4c34fddab383b817e689dc0fb75af81266", "is_verified": false, - "line_number": 583, - "type": "Hex High Entropy String" + "line_number": 141 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "300d95dd5d30ab6928ffda6c08c6a129a23e5b39", "is_verified": false, - "line_number": 607, - "type": "Hex High Entropy String" + "line_number": 150 }, { - "hashed_secret": "f9e664db75c7f23a299b0b055c10e08d47073e93", + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", + "hashed_secret": "96c9184fb19c9c1618ccf44d141f8029a739891c", "is_verified": false, - "line_number": 675, - "type": "Hex High Entropy String" + "line_number": 159 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "7c35c215b326b9463b669b657c1ff9873ff53d9a", "is_verified": false, - "line_number": 889, - "type": "Hex High Entropy String" + "line_number": 641 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", + "hashed_secret": "f9e664db75c7f23a299b0b055c10e08d47073e93", + "is_verified": false, + "line_number": 675 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", + "hashed_secret": "14bafb268df75cc8f8d8f87f61468d249de936ba", + "is_verified": false, + "line_number": 803 + }, + { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", + "hashed_secret": "bce350451d95a06da0423916d228575c633008ef", + "is_verified": false, + "line_number": 811 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "0d515eaf06062d52e8c80abb4d3b713a65396d30", "is_verified": false, - "line_number": 893, - "type": "Hex High Entropy String" + "line_number": 893 }, { + "type": "Hex High Entropy String", + "filename": "tests/test_manifests.py", "hashed_secret": "b4cff7c2af45cdfe66195ec574a7b8832f8621ea", "is_verified": false, - "line_number": 898, - "type": "Hex High Entropy String" + "line_number": 898 } ], "tests/test_submission.py": [ { + "type": "Secret Keyword", + "filename": "tests/test_submission.py", "hashed_secret": "4d48c6376ebfec3af94c3d9a1b33f4c045e361f7", "is_verified": false, - "line_number": 164, - "type": "Secret Keyword" + "line_number": 164 } ] }, - "version": "0.13.1", - "word_list": { - "file": null, - "hash": null - } + "generated_at": "2023-10-09T18:58:28Z" } diff --git a/.travis.yml b/.travis.yml index b8eac3683..20d9257b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,27 +1,23 @@ +dist: jammy language: python python: -- 3.6 -- 3.7 - 3.8 - 3.9 - 3.10 jobs: allow_failures: - - python: 3.6 - - python: 3.7 - python: 3.8 - python: 3.10 before_install: - pip install --upgrade pip -- 'curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -' -- source $HOME/.poetry/env +- curl -sSL https://install.python-poetry.org | python - - which poetry - poetry --version install: -- poetry install -vv -- poetry show +- poetry install -vv --all-extras --no-interaction --no-cache +- poetry show -vv script: -- poetry run pytest -vv ./tests +- echo Unit testing is now done in GH Actions, this just pushing to pypi as necessary before_deploy: - poetry config repositories.testpypi https://test.pypi.org/legacy/ - poetry config pypi-token.testpypi $PYPI_API_TOKEN @@ -50,6 +46,3 @@ env: global: - secure: jCslhsRF+cpozrC75nmYkBizmdBL/01StonnarwaWmCFBEzX22i6XklpUyROYRpvHTQ7SHJlFh+kmvptT4UmRxFCqKq/RNFq2We0rRhnfWNRsQOok5ENU5MDMgD0kl3RUeEElpVk36aQ8cUyybNyuel0ZFC1F+C5GOUKaCtiDrcX9RVu5jYbydi1W1RfsCNkmyJND8efdqBXD81BueXqP7xYxdyqz+f3du/1qIx5GR/X+jv6WE2Oum6EMq5tbiWf3qc6OnxNdNd0p/O7seBIZyvOZvFvX8Cx3PsCfSbWyeX0hcZCDIhnG5YTah944MplvVR70lOx0GvzmxHZCpxffUfliXLJCrBQy9RZbomXcXI6c1h88DMt6odYNDlZJpcV12sQypbWBr7FJb1En93FcSqpdoPKEU9eR+WzQ0/GNFL5KibZ95yQdwT31gnlnz7NLQz8ubdkrKMpZTbDM1HCAgLN326jMwYpn/RxRtXFcrxvA6sTxpsCQhWssIBRHv5sY0c5vlDkLADNAeA1s9+SOKWAKHJh5NzFby+vt59vi5QSkdWRsKwZsk01NNrBUFcJuDxsp9wTEO3NigzoYrnZXk2ews9+WRaiTmsEWa4/LSfY0afQA4ezbGVT4yY/tje2XFhsaYCT/JsJpHBgyNDadX6FaAraKw4oqsQDu76/KjU= - secure: cFv/73omvtKB7/3OYuIodzNwSLUlqJuGgtyTf0W6pN5oJSpcE9U4Ti/ub2aUABaH15e0Fdp+MxaL+j4x5/TmzGwrmpP8Ts2nueJNh1XeC2aO2S+YevRuV+8L4rwbFvZzYe/rL9hbKx9Ghiatc/fk147j4Svf/ZNWPBHgBloZaXWGR2kRxrRrjnogXceTR6K2mPUMUr0+azYDH0Zwuu3Y5HF/CT5DpxWGs657VjM6EiGsZ6UUq4sqj4XZKKjTtp/I8zPH1z6NliBDqVtASX3UsZewbiDaa1DIs4NBN5QDSR3/vQfVoouPFy7M/oIqIpvDFOWfHahA8ac3/CdlMAT64KknRodpm/s2uUxJOtrDOSBMtdREEc+yMuBPf85+s+Vk6B8upkIYnpI2d7vDaHSFBIlQk/IbaoUsRUVeacQ6b20JhPyYMrKnvG9/aW7KfYJr23SpRwjwvh6D4ejbmFtePrU/uk1Js81lCUkYHBBqDvRXW/BNMKxyXTyMlCL4om4gIlQpBmru+vpDGoHHLzO+I9axmBBKWq1HgR5nF89Nd6AMoSTzAwt+7xmMsgaDaMewZczBnLyeGiKNKATkQ66qdhqUB+6dmKpTyDCFOwRaDUOaH71f3wVamOQpoHUdCPNnIh1B6RuZaXylGyO2qtsr65bC2uZCHVw9dk3eeqL2TUU= -after_deploy: -- pip install gen3git -- gen3git release diff --git a/Jenkinsfile.security b/Jenkinsfile.security deleted file mode 100644 index 0a5c52179..000000000 --- a/Jenkinsfile.security +++ /dev/null @@ -1,6 +0,0 @@ -#!groovy - -@Library('cdis-jenkins-lib@master') _ - -securityPipeline { -} \ No newline at end of file diff --git a/README.md b/README.md index 6a05b6ae9..7d8eb0588 100755 --- a/README.md +++ b/README.md @@ -19,9 +19,11 @@ The docs here contain general descriptions of the different pieces of the SDK an - [Available Classes](docs/reference/sdkClasses.md) - [Indexing Tools](docs/howto/diirmIndexing.md) - [Metadata Tools](docs/howto/metadataTools.md) - - [Metadata Crosswalk Tools](docs/howto/crosswalk.md) + - [Gen3 Discovery Page Metadata Tools](docs/howto/discoveryMetadataTools.md) + - [Gen3 Subject-level Crosswalk Metadata Tools](docs/howto/crosswalk.md) - [Bundle Tools](docs/howto/bundleTools.md) - [Development](docs/howto/devTest.md) + - [CLI](docs/howto/cli.md) --- diff --git a/docs/_build/doctrees/auth.doctree b/docs/_build/doctrees/auth.doctree index d6671d05b..20f592f88 100644 Binary files a/docs/_build/doctrees/auth.doctree and b/docs/_build/doctrees/auth.doctree differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 710573656..fd6a32ce4 100644 Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ diff --git a/docs/_build/doctrees/file.doctree b/docs/_build/doctrees/file.doctree index cf42a17bd..4c3eb53b5 100644 Binary files a/docs/_build/doctrees/file.doctree and b/docs/_build/doctrees/file.doctree differ diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index 22e59941f..8179ccf0b 100644 Binary files a/docs/_build/doctrees/index.doctree and b/docs/_build/doctrees/index.doctree differ diff --git a/docs/_build/doctrees/indexing.doctree b/docs/_build/doctrees/indexing.doctree index dfe66c058..380d7c7b0 100644 Binary files a/docs/_build/doctrees/indexing.doctree and b/docs/_build/doctrees/indexing.doctree differ diff --git a/docs/_build/doctrees/jobs.doctree b/docs/_build/doctrees/jobs.doctree index 378cd9b39..050b3b31d 100644 Binary files a/docs/_build/doctrees/jobs.doctree and b/docs/_build/doctrees/jobs.doctree differ diff --git a/docs/_build/doctrees/metadata.doctree b/docs/_build/doctrees/metadata.doctree index cfa721c4d..75b1f4694 100644 Binary files a/docs/_build/doctrees/metadata.doctree and b/docs/_build/doctrees/metadata.doctree differ diff --git a/docs/_build/doctrees/object.doctree b/docs/_build/doctrees/object.doctree index 4dff4cb75..8b3d30b62 100644 Binary files a/docs/_build/doctrees/object.doctree and b/docs/_build/doctrees/object.doctree differ diff --git a/docs/_build/doctrees/query.doctree b/docs/_build/doctrees/query.doctree index 0b78e4493..218c50e4c 100644 Binary files a/docs/_build/doctrees/query.doctree and b/docs/_build/doctrees/query.doctree differ diff --git a/docs/_build/doctrees/submission.doctree b/docs/_build/doctrees/submission.doctree index 132fbe96f..8ed54272a 100644 Binary files a/docs/_build/doctrees/submission.doctree and b/docs/_build/doctrees/submission.doctree differ diff --git a/docs/_build/doctrees/tools.doctree b/docs/_build/doctrees/tools.doctree index 9f6259a53..2f3e2df38 100644 Binary files a/docs/_build/doctrees/tools.doctree and b/docs/_build/doctrees/tools.doctree differ diff --git a/docs/_build/doctrees/tools/drs_pull.doctree b/docs/_build/doctrees/tools/drs_pull.doctree index 7f346d734..6b3e2107f 100644 Binary files a/docs/_build/doctrees/tools/drs_pull.doctree and b/docs/_build/doctrees/tools/drs_pull.doctree differ diff --git a/docs/_build/doctrees/tools/indexing.doctree b/docs/_build/doctrees/tools/indexing.doctree index b73838368..1984d47ce 100644 Binary files a/docs/_build/doctrees/tools/indexing.doctree and b/docs/_build/doctrees/tools/indexing.doctree differ diff --git a/docs/_build/doctrees/tools/metadata.doctree b/docs/_build/doctrees/tools/metadata.doctree index 24f8e699b..3b74e55ad 100644 Binary files a/docs/_build/doctrees/tools/metadata.doctree and b/docs/_build/doctrees/tools/metadata.doctree differ diff --git a/docs/_build/doctrees/wss.doctree b/docs/_build/doctrees/wss.doctree index 0964a0c68..81babe9ab 100644 Binary files a/docs/_build/doctrees/wss.doctree and b/docs/_build/doctrees/wss.doctree differ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index cfb0b13d7..c1d984323 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c204aa2869f9bc5f949a2abce63f0f44 +config: 5f84980db6ce51f04ab25ae1f011fb32 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_modules/gen3/auth.html b/docs/_build/html/_modules/gen3/auth.html index 1ee5bc0ac..221a1a0d2 100644 --- a/docs/_build/html/_modules/gen3/auth.html +++ b/docs/_build/html/_modules/gen3/auth.html @@ -1,18 +1,15 @@ - - + gen3.auth — Gen3 SDK documentation - - - - - - - + + + + + @@ -59,7 +56,7 @@

Source code for gen3.auth

 
 
 def decode_token(token_str):
-    """
+    """
     jq -r '.api_key' < ~/.gen3/qa-covid19.planx-pla.net.json | awk -F . '{ print $2 }' | base64 --decode | jq -r .
     """
     tokenParts = token_str.split(".")
@@ -72,7 +69,7 @@ 

Source code for gen3.auth

 
 
 def endpoint_from_token(token_str):
-    """
+    """
     Extract the endpoint from a JWT issue ("iss" property)
     """
     info = decode_token(token_str)
@@ -80,11 +77,11 @@ 

Source code for gen3.auth

     endpoint = urlparts.scheme + "://" + urlparts.hostname
     if urlparts.port:
         endpoint += ":" + str(urlparts.port)
-    return endpoint
+    return remove_trailing_whitespace_and_slashes_in_url(endpoint)
 
 
 def _handle_access_token_response(resp, token_key):
-    """
+    """
     Shared helper for both get_access_token_with_key and get_access_token_from_wts
     """
     err_msg = "Failed to get an access token from {}:\n{}"
@@ -100,7 +97,7 @@ 

Source code for gen3.auth

 
 
 def get_access_token_with_key(api_key):
-    """
+    """
     Try to fetch an access token given the api key
     """
     endpoint = endpoint_from_token(api_key["api_key"])
@@ -111,6 +108,22 @@ 

Source code for gen3.auth

     return _handle_access_token_response(resp, token_key)
 
 
+def get_access_token_with_client_credentials(endpoint, client_credentials, scopes):
+    """
+    Try to get an access token from Fence using client credentials
+
+    Args:
+        endpoint (str): URL of the Gen3 instance to get an access token for
+        client_credentials ((str, str) tuple): (client ID, client secret) tuple
+        scopes (str): space-delimited list of scopes to request
+    """
+    if not endpoint:
+        raise ValueError("'endpoint' must be specified when using client credentials")
+    url = f"{endpoint}/user/oauth2/token?grant_type=client_credentials&scope={scopes}"
+    resp = requests.post(url, auth=client_credentials)
+    return _handle_access_token_response(resp, "access_token")
+
+
 def get_wts_endpoint(namespace=os.getenv("NAMESPACE", "default")):
     return "http://workspace-token-service.{}.svc.cluster.local".format(namespace)
 
@@ -128,7 +141,7 @@ 

Source code for gen3.auth

 
 
 def get_token_cache_file_name(key):
-    """Compute the path to the access-token cache file"""
+    """Compute the path to the access-token cache file"""
     cache_folder = "{}/.cache/gen3/".format(os.path.expanduser("~"))
     if not os.path.isdir(cache_folder):
         os.makedirs(cache_folder)
@@ -139,8 +152,10 @@ 

Source code for gen3.auth

     return cache_prefix + m.hexdigest()
 
 
-
[docs]class Gen3Auth(AuthBase): - """Gen3 auth helper class for use with requests auth. +
+[docs] +class Gen3Auth(AuthBase): + """Gen3 auth helper class for use with requests auth. Implements requests.auth.AuthBase in order to support JWT authentication. Generates access tokens from the provided refresh token file or string. @@ -155,6 +170,10 @@

Source code for gen3.auth

         refresh_token (str, opt): The JSON web token. Optional if working in a Gen3 Workspace.
         idp (str, opt): If working in a Gen3 Workspace, the IDP to use can be specified -
                 "local" indicates the local environment fence idp
+        client_credentials (tuple, opt): The (client_id, client_secret) credentials for an OIDC client
+                that has the 'client_credentials' grant, allowing it to obtain access tokens.
+        client_scopes (str, opt): Space-separated list of scopes requested for access tokens obtained from client
+                credentials. Default: "user data openid"
 
     Examples:
         This generates the Gen3Auth class pointed at the sandbox commons while
@@ -175,13 +194,33 @@ 

Source code for gen3.auth

         than pass the refresh_file argument to the Gen3Auth
         constructor.
 
+        If working with an OIDC client that has the 'client_credentials' grant, allowing it to obtain
+        access tokens, provide the client ID and secret:
+
+        Note: client secrets should never be hardcoded!
+
+        >>> auth = Gen3Auth(
+            endpoint="https://datacommons.example",
+            client_credentials=("client ID", os.environ["GEN3_OIDC_CLIENT_CREDS_SECRET"])
+        )
+
         If working in a Gen3 Workspace, initialize as follows:
 
         >>> auth = Gen3Auth()
     """
 
-    def __init__(self, endpoint=None, refresh_file=None, refresh_token=None, idp=None):
-        # note - this is not actually a JWT refresh token - it's a
+    def __init__(
+        self,
+        endpoint=None,
+        refresh_file=None,
+        refresh_token=None,
+        idp=None,
+        client_credentials=None,
+        client_scopes=None,
+    ):
+        logging.debug("Initializing auth..")
+        self.endpoint = remove_trailing_whitespace_and_slashes_in_url(endpoint)
+        # note - `_refresh_token` is not actually a JWT refresh token - it's a
         #  gen3 api key with a token as the "api_key" property
         self._refresh_token = refresh_token
         self._access_token = None
@@ -191,6 +230,13 @@ 

Source code for gen3.auth

         self._use_wts = False
         self._external_wts_host = None
         self._refresh_file = refresh_file
+        self._client_credentials = client_credentials
+        if self._client_credentials:
+            self._client_scopes = client_scopes or "user data openid"
+        elif client_scopes:
+            raise ValueError(
+                "'client_scopes' cannot be specified without 'client_credentials'"
+            )
 
         if refresh_file and refresh_token:
             raise ValueError(
@@ -227,6 +273,15 @@ 

Source code for gen3.auth

                     logging.warning("Unable to find refresh_file")
                     refresh_file = None
 
+        if self._client_credentials:
+            if not endpoint:
+                raise ValueError(
+                    "'endpoint' must be specified when '_client_credentials' is specified"
+                )
+            self._access_token = get_access_token_with_client_credentials(
+                endpoint, self._client_credentials, self._client_scopes
+            )
+
         if not self._access_token:
             # at this point - refresh_file either exists or is None
             if not refresh_file and not refresh_token:
@@ -254,32 +309,35 @@ 

Source code for gen3.auth

                 if idp or (
                     endpoint
                     and (
-                        not endpoint
+                        not endpoint.rstrip("/")
                         == endpoint_from_token(self._refresh_token["api_key"])
                     )
                 ):
                     try:
+                        logging.debug(
+                            "Switch to using WTS and set external WTS host url.."
+                        )
                         self._use_wts = True
                         self._external_wts_host = (
                             endpoint_from_token(self._refresh_token["api_key"])
                             + "/wts/"
                         )
-                        self.get_access_token(
-                            remove_trailing_whitespace_and_slashes_in_url(endpoint)
-                        )
+                        self.get_access_token()
                     except Gen3AuthError as g:
                         logging.warning(
                             "Could not obtain access token from WTS service."
                         )
                         raise g
-        if self._access_token:
-            self.endpoint = endpoint_from_token(self._access_token)
-        else:
-            self.endpoint = endpoint_from_token(self._refresh_token["api_key"])
+
+        if not self.endpoint:
+            if self._access_token:
+                self.endpoint = endpoint_from_token(self._access_token)
+            else:
+                self.endpoint = endpoint_from_token(self._refresh_token["api_key"])
 
     @property
     def _token_info(self):
-        """
+        """
         Wrapper to fix intermittent errors when the token is being refreshed
         and `_access_token_info` == None
         """
@@ -288,7 +346,7 @@ 

Source code for gen3.auth

         return self._access_token_info
 
     def __call__(self, request):
-        """Adds authorization header to the request
+        """Adds authorization header to the request
 
         This gets called by the python.requests package on outbound requests
         so that authentication can be added.
@@ -302,7 +360,7 @@ 

Source code for gen3.auth

         return request
 
     def _handle_401(self, response, **kwargs):
-        """Handles failed requests when authorization failed.
+        """Handles failed requests when authorization failed.
 
         This gets called after a failed request when an HTTP 401 error
         occurs. This then tries to refresh the access token in the event
@@ -330,28 +388,38 @@ 

Source code for gen3.auth

 
         return _response
 
-
[docs] def refresh_access_token(self, endpoint=None): - """Get a new access token""" +
+[docs] + def refresh_access_token(self, endpoint=None): + """Get a new access token""" if self._use_wts: self._access_token = self.get_access_token_from_wts(endpoint) + elif self._client_credentials: + self._access_token = get_access_token_with_client_credentials( + endpoint, self._client_credentials, self._client_scopes + ) else: self._access_token = get_access_token_with_key(self._refresh_token) + self._access_token_info = decode_token(self._access_token) + + cache_file = None if self._use_wts: cache_file = get_token_cache_file_name(self._wts_idp) - else: - if self._refresh_file: - cache_file = get_token_cache_file_name(self._refresh_token["api_key"]) - - try: - self._write_to_file(cache_file, self._access_token) - except Exception as e: - logging.warning( - f"Unable to write access token to cache file. Exceeded number of retries." - ) + elif self._refresh_file: + cache_file = get_token_cache_file_name(self._refresh_token["api_key"]) + + if cache_file: + try: + self._write_to_file(cache_file, self._access_token) + except Exception as e: + logging.warning( + f"Unable to write access token to cache file. Exceeded number of retries. Details: {e}" + ) return self._access_token
+ @backoff.on_exception( wait_gen=backoff.expo, exception=Exception, **DEFAULT_BACKOFF_SETTINGS ) @@ -371,8 +439,10 @@

Source code for gen3.auth

             logging.warning(str(e))
             raise e
 
-
[docs] def get_access_token(self, endpoint=None): - """Get the access token - auto refresh if within 5 minutes of expiration""" +
+[docs] + def get_access_token(self): + """Get the access token - auto refresh if within 5 minutes of expiration""" if not self._access_token: if self._use_wts == True: cache_file = get_token_cache_file_name(self._wts_idp) @@ -398,12 +468,15 @@

Source code for gen3.auth

             or time.time() + 300 > self._access_token_info["exp"]
         )
         if need_new_token:
-            return self.refresh_access_token(endpoint)
+            return self.refresh_access_token(
+                self.endpoint if hasattr(self, "endpoint") else None
+            )
         # use cache
         return self._access_token
+ def _get_auth_value(self): - """Returns the Authorization header value for the request + """Returns the Authorization header value for the request This gets called when added the Authorization header to the request. This fetches the access token from the refresh token if the access token is missing. @@ -411,8 +484,10 @@

Source code for gen3.auth

         """
         return "bearer " + self.get_access_token()
 
-
[docs] def curl(self, path, request=None, data=None): - """ +
+[docs] + def curl(self, path, request=None, data=None): + """ Curl the given endpoint - ex: gen3 curl /user/user. Return requests.Response Args: @@ -443,29 +518,81 @@

Source code for gen3.auth

             raise Exception("Invalid request type: " + request)
         return output
-
[docs] def get_access_token_from_wts(self, endpoint=None): - """ + +
+[docs] + def get_access_token_from_wts(self, endpoint=None): + """ Try to fetch an access token for the given idp from the wts in the given namespace. If idp is not set, then default to "local" """ # attempt to get a token from the workspace-token-service + logging.debug("getting access token from wts..") auth_url = get_wts_endpoint(self._wts_namespace) + "/token/" - if self._wts_idp and self._wts_idp != "local": - auth_url += "?idp={}".format(self._wts_idp) - try: - resp = requests.get(auth_url) - if (resp and resp.status_code == 200) or (not self._external_wts_host): - return _handle_access_token_response(resp, "token") - except Exception as e: - if not self._external_wts_host: - raise e - else: - # Try to obtain token from external wts - pass + # If non "local" idp value exists, append to auth url + # If user specified endpoint value, then first attempt to determine idp value. + if self.endpoint or (self._wts_idp and self._wts_idp != "local"): + # If user supplied endpoint value and not idp, figure out the idp value + if self.endpoint: + logging.debug( + "First try to use the local WTS to figure out idp name for the supplied endpoint.." + ) + try: + provider_List = get_wts_idps(self._wts_namespace) + matchProviders = list( + filter( + lambda provider: provider["base_url"] == endpoint, + provider_List["providers"], + ) + ) + if len(matchProviders) == 1: + logging.debug("Found matching idp from local WTS.") + self._wts_idp = matchProviders[0]["idp"] + elif len(matchProviders) > 1: + raise ValueError( + "Multiple idps matched with endpoint value provided." + ) + else: + logging.debug("Could not find matching idp from local WTS.") + except Exception as e: + logging.debug( + "Exception occured when making network call to local WTS." + ) + if not self._external_wts_host: + raise e + else: + logging.debug("Since external WTS host exists, continuing on..") + pass + + if self._wts_idp and self._wts_idp != "local": + auth_url += "?idp={}".format(self._wts_idp) + + # If endpoint value exists, only get WTS token if idp value has been successfully determined + # Otherwise skip to querying external WTS + # This is to prevent local WTS from supplying an incorrect token to user + if ( + not self._external_wts_host + or not self.endpoint + or (self.endpoint and self._wts_idp != "local") + ): + try: + logging.debug("Try to get access token from local WTS..") + logging.debug(f"{auth_url=}") + resp = requests.get(auth_url) + if (resp and resp.status_code == 200) or (not self._external_wts_host): + return _handle_access_token_response(resp, "token") + except Exception as e: + if not self._external_wts_host: + raise e + else: + # Try to obtain token from external wts + logging.debug("Could get obtain token from Local WTS.") + pass # local workspace wts call failed, try using a network call # First get access token with WTS host + logging.debug("Trying to get access token from external WTS Host..") wts_token = get_access_token_with_key(self._refresh_token) auth_url = self._external_wts_host + "token/" @@ -486,9 +613,14 @@

Source code for gen3.auth

                     provider_List["providers"],
                 )
             )
+        else:
+            raise Exception(
+                "Unable to generate matching identity providers (no IdP or endpoint provided)"
+            )
 
         if len(matchProviders) == 1:
             self._wts_idp = matchProviders[0]["idp"]
+            logging.debug("Succesfully determined idp value: {}".format(self._wts_idp))
         else:
             idp_list = "\n "
 
@@ -525,14 +657,16 @@ 

Source code for gen3.auth

                     + idp_list
                     + "Query /wts/external_oidc/ for more information."
                 )
-
+        logging.debug("Finally getting access token..")
         auth_url += "?idp={}".format(self._wts_idp)
         header = {"Authorization": "Bearer " + wts_token}
         resp = requests.get(auth_url, headers=header)
         err_msg = "Please make sure the target commons is connected on your profile page and that connection has not expired."
         if resp.status_code != 200:
             logging.warning(err_msg)
-        return _handle_access_token_response(resp, "token")
+ return _handle_access_token_response(resp, "token")
+
+
diff --git a/docs/_build/html/_modules/gen3/file.html b/docs/_build/html/_modules/gen3/file.html index 315807954..5189947bd 100644 --- a/docs/_build/html/_modules/gen3/file.html +++ b/docs/_build/html/_modules/gen3/file.html @@ -1,18 +1,15 @@ - - + gen3.file — Gen3 SDK documentation - - - - - - - + + + + + @@ -34,14 +31,33 @@

Source code for gen3.file

 import json
 import requests
+import json
+import asyncio
+import aiohttp
+import aiofiles
+import time
+from tqdm import tqdm
+from types import SimpleNamespace as Namespace
+import os
+import requests
+from pathlib import Path
+
+from cdislogging import get_logger
+
+from gen3.index import Gen3Index
+from gen3.utils import DEFAULT_BACKOFF_SETTINGS, raise_for_status_and_print_error
+from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
+
+logging = get_logger("__name__")
 
 
-class Gen3FileError(Exception):
-    pass
+MAX_RETRIES = 3
 
 
-
[docs]class Gen3File: - """For interacting with Gen3 file management features. +
+[docs] +class Gen3File: + """For interacting with Gen3 file management features. A class for interacting with the Gen3 file download services. Supports getting presigned urls right now. @@ -62,9 +78,12 @@

Source code for gen3.file

         # auth_provider legacy interface required endpoint as 1st arg
         self._auth_provider = auth_provider or endpoint
         self._endpoint = self._auth_provider.endpoint
+        self.unsuccessful_downloads = []
 
-
[docs] def get_presigned_url(self, guid, protocol=None): - """Generates a presigned URL for a file. +
+[docs] + def get_presigned_url(self, guid, protocol=None): + """Generates a presigned URL for a file. Retrieves a presigned url for a file giving access to a file for a limited time. @@ -80,16 +99,19 @@

Source code for gen3.file

         api_url = "{}/user/data/download/{}".format(self._endpoint, guid)
         if protocol:
             api_url += "?protocol={}".format(protocol)
-        output = requests.get(api_url, auth=self._auth_provider).text
+        resp = requests.get(api_url, auth=self._auth_provider)
+        raise_for_status_and_print_error(resp)
 
         try:
-            data = json.loads(output)
+            return resp.json()
         except:
-            return output
-        return data
+ return resp.text
+ -
[docs] def delete_file(self, guid): - """ +
+[docs] + def delete_file(self, guid): + """ This method is DEPRECATED. Use delete_file_locations() instead. Delete all locations of a stored data file and remove its record from indexd @@ -104,8 +126,11 @@

Source code for gen3.file

 
         return output
-
[docs] def delete_file_locations(self, guid): - """ + +
+[docs] + def delete_file_locations(self, guid): + """ Delete all locations of a stored data file and remove its record from indexd Args: @@ -118,8 +143,13 @@

Source code for gen3.file

 
         return output
-
[docs] def upload_file(self, file_name, authz=None, protocol=None, expires_in=None): - """ + +
+[docs] + def upload_file( + self, file_name, authz=None, protocol=None, expires_in=None, bucket=None + ): + """ Get a presigned url for a file to upload Args: @@ -130,6 +160,9 @@

Source code for gen3.file

             expires_in (int): Amount in seconds that the signed url will expire from datetime.utcnow().
                 Be sure to use a positive integer.
                 This value will also be treated as <= MAX_PRESIGNED_URL_TTL in the fence configuration.
+            bucket (str): Bucket to upload to. The bucket must be configured in the Fence instance's
+                `ALLOWED_DATA_UPLOAD_BUCKETS` setting. If not specified, Fence defaults to the
+                `DATA_UPLOAD_BUCKET` setting.
         Returns:
             Document: json representation for the file upload
         """
@@ -143,17 +176,141 @@ 

Source code for gen3.file

             body["expires_in"] = expires_in
         if file_name:
             body["file_name"] = file_name
+        if bucket:
+            body["bucket"] = bucket
 
         headers = {"Content-Type": "application/json"}
-        output = requests.post(
+        resp = requests.post(
             api_url, auth=self._auth_provider, json=body, headers=headers
-        ).text
+        )
+        raise_for_status_and_print_error(resp)
         try:
-            data = json.loads(output)
+            data = json.loads(resp.text)
         except:
-            return output
+            return resp.text
+
+        return data
+ + + def _ensure_dirpath_exists(path: Path) -> Path: + """Utility to create a directory if missing. + Returns the path so that the call can be inlined in another call + Args: + path (Path): path to create + Returns + path of created directory + """ + assert path + out_path: Path = path + + if not out_path.exists(): + out_path.mkdir(parents=True, exist_ok=True) + + return out_path + +
+[docs] + def download_single(self, object_id, path): + """ + Download a single file using its GUID. + + Args: + object_id (str): The file's unique ID + path (str): Path to store the downloaded file at + """ + try: + url = self.get_presigned_url(object_id) + except Exception as e: + logging.critical(f"Unable to get a presigned URL for download: {e}") + return False + + response = requests.get(url["url"], stream=True) + if response.status_code != 200: + logging.error(f"Response code: {response.status_code}") + if response.status_code >= 500: + for _ in range(MAX_RETRIES): + logging.info("Retrying now...") + # NOTE could be updated with exponential backoff + time.sleep(1) + response = requests.get(url["url"], stream=True) + if response.status == 200: + break + if response.status != 200: + logging.critical("Response status not 200, try again later") + return False + else: + return False + + response.raise_for_status() + + total_size_in_bytes = int(response.headers.get("content-length")) + total_downloaded = 0 + + index = Gen3Index(self._auth_provider) + record = index.get_record(object_id) + + filename = record["file_name"] + + out_path = Gen3File._ensure_dirpath_exists(Path(path)) + + with open(os.path.join(out_path, filename), "wb") as f: + for data in response.iter_content(4096): + total_downloaded += len(data) + f.write(data) + + if total_size_in_bytes == total_downloaded: + logging.info(f"File {filename} downloaded successfully") + + else: + logging.error(f"File {filename} not downloaded successfully") + return False + + return True
+ + +
+[docs] + def upload_file_to_guid( + self, guid, file_name, protocol=None, expires_in=None, bucket=None + ): + """ + Get a presigned url for a file to upload to the specified existing GUID + + Args: + file_name (str): file_name to use for upload + protocol (str): Storage protocol to use for upload: "s3", "az". + If this isn't set, the default will be "s3" + expires_in (int): Amount in seconds that the signed url will expire from datetime.utcnow(). + Be sure to use a positive integer. + This value will also be treated as <= MAX_PRESIGNED_URL_TTL in the fence configuration. + bucket (str): Bucket to upload to. The bucket must be configured in the Fence instance's + `ALLOWED_DATA_UPLOAD_BUCKETS` setting. If not specified, Fence defaults to the + `DATA_UPLOAD_BUCKET` setting. + Returns: + Document: json representation for the file upload + """ + url = f"{self._endpoint}/user/data/upload/{guid}" + params = {} + if protocol: + params["protocol"] = protocol + if expires_in: + params["expires_in"] = expires_in + if file_name: + params["file_name"] = file_name + if bucket: + params["bucket"] = bucket + + url_parts = list(urlparse(url)) + query = dict(parse_qsl(url_parts[4])) + query.update(params) + url_parts[4] = urlencode(query) + url = urlunparse(url_parts) + + resp = requests.get(url, auth=self._auth_provider) + raise_for_status_and_print_error(resp) + return resp.json()
+
- return data
diff --git a/docs/_build/html/_modules/gen3/index.html b/docs/_build/html/_modules/gen3/index.html index 60fda2cae..7c4d5da98 100644 --- a/docs/_build/html/_modules/gen3/index.html +++ b/docs/_build/html/_modules/gen3/index.html @@ -1,18 +1,15 @@ - - + gen3.index — Gen3 SDK documentation - - - - - - - + + + + + @@ -48,8 +45,10 @@

Source code for gen3.index

 logging = get_logger("__name__")
 
 
-
[docs]class Gen3Index: - """ +
+[docs] +class Gen3Index: + """ A class for interacting with the Gen3 Index services. @@ -85,8 +84,10 @@

Source code for gen3.index

         self.client = client.IndexClient(endpoint, auth=auth_provider)
 
     ### Get Requests
-
[docs] def is_healthy(self): - """ +
+[docs] + def is_healthy(self): + """ Return if indexd is healthy or not @@ -98,9 +99,12 @@

Source code for gen3.index

             return False
         return response.text == "Healthy"
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_version(self): - """ + """ Return the version of indexd @@ -109,9 +113,12 @@

Source code for gen3.index

         raise_for_status_and_print_error(response)
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_stats(self): - """ + """ Return basic info about the records in indexd @@ -120,9 +127,12 @@

Source code for gen3.index

         raise_for_status_and_print_error(response)
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_all_records(self, limit=None, paginate=False, start=None): - """ + """ Get a list of all records @@ -165,9 +175,12 @@

Source code for gen3.index

 
         return all_records
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_records_on_page(self, limit=None, page=None): - """ + """ Get a list of all records given the page and page size limit @@ -188,9 +201,12 @@

Source code for gen3.index

 
         return response.json().get("records")
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_record(self, guid=None, _ssl=None): - """ + """ Asynchronous function to request a record from indexd. Args: @@ -207,9 +223,12 @@

Source code for gen3.index

 
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_records_on_page(self, limit=None, page=None, _ssl=None): - """ + """ Asynchronous function to request a page from indexd. Args: @@ -236,11 +255,14 @@

Source code for gen3.index

 
         return response.get("records")
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_records_from_checksum( self, checksum, checksum_type="md5", _ssl=None ): - """ + """ Asynchronous function to request records from indexd matching checksum. Args: @@ -264,9 +286,12 @@

Source code for gen3.index

 
         return response.get("records")
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get(self, guid, dist_resolution=True): - """ + """ Get the metadata associated with the given id, alias, or distributed identifier @@ -285,9 +310,12 @@

Source code for gen3.index

 
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_urls(self, size=None, hashes=None, guids=None): - """ + """ Get a list of urls that match query params @@ -306,9 +334,12 @@

Source code for gen3.index

         urls = self.client._get("urls", params=p).json()
         return [url for _, url in urls.items()]
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_record(self, guid): - """ + """ Get the metadata associated with a given id @@ -320,18 +351,24 @@

Source code for gen3.index

 
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_record_doc(self, guid): - """ + """ Get the metadata associated with a given id """ return self.client.get(guid)
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_with_params(self, params=None): - """ + """ Return a document object corresponding to the supplied parameters, such as ``{'hashes': {'md5': '...'}, 'size': '...', 'metadata': {'file_state': '...'}}``. @@ -348,9 +385,12 @@

Source code for gen3.index

 
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_with_params(self, params, _ssl=None): - """ + """ Return a document object corresponding to the supplied parameter @@ -374,9 +414,12 @@

Source code for gen3.index

 
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_latest_version(self, guid, has_version=False): - """ + """ Get the metadata of the latest index record version associated with the given id @@ -395,9 +438,12 @@

Source code for gen3.index

 
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_versions(self, guid): - """ + """ Get the metadata of index record version associated with the given id @@ -413,9 +459,12 @@

Source code for gen3.index

 
         return [r for _, r in versions.items()]
+ ### Post Requests -
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def create_record( self, hashes, @@ -430,7 +479,7 @@

Source code for gen3.index

         version=None,
         authz=None,
     ):
-        """
+        """
 
         Create a new record and add it to the index
 
@@ -466,7 +515,10 @@ 

Source code for gen3.index

         )
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_create_record( self, hashes, @@ -482,7 +534,7 @@

Source code for gen3.index

         authz=None,
         _ssl=None,
     ):
-        """
+        """
         Asynchronous function to create a record in indexd.
 
         Args:
@@ -507,37 +559,49 @@ 

Source code for gen3.index

                 urls = []
 
             json = {
-                "urls": urls,
                 "form": "object",
                 "hashes": hashes,
                 "size": size,
-                "file_name": file_name,
-                "metadata": metadata,
-                "urls_metadata": urls_metadata,
-                "baseid": baseid,
-                "acl": acl,
-                "authz": authz,
-                "version": version,
+                "urls": urls or [],
             }
-
             if did:
                 json["did"] = did
+            if file_name:
+                json["file_name"] = file_name
+            if metadata:
+                json["metadata"] = metadata
+            if baseid:
+                json["baseid"] = baseid
+            if acl:
+                json["acl"] = acl
+            if urls_metadata:
+                json["urls_metadata"] = urls_metadata
+            if version:
+                json["version"] = version
+            if authz:
+                json["authz"] = authz
+
+            # aiohttp only allows basic auth with their built in auth, so we
+            # need to manually add JWT auth header
+            headers = {"Authorization": self.client.auth._get_auth_value()}
 
             async with session.post(
                 f"{self.client.url}/index/",
                 json=json,
-                headers={"content-type": "application/json"},
+                headers=headers,
                 ssl=_ssl,
-                auth=self.client.auth,
             ) as response:
-                raise_for_status_and_print_error(response)
+                assert response.status == 200, await response.json()
                 response = await response.json()
 
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def create_blank(self, uploader, file_name=None): - """ + """ Create a blank record @@ -561,7 +625,10 @@

Source code for gen3.index

 
         return self.get_record(rec["did"])
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def create_new_version( self, guid, @@ -576,7 +643,7 @@

Source code for gen3.index

         version=None,
         authz=None,
     ):
-        """
+        """
 
         Add new version for the document associated to the provided uuid
 
@@ -636,9 +703,12 @@ 

Source code for gen3.index

             return self.get_record(rec["did"])
         return None
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_records(self, dids): - """ + """ Get a list of documents given a list of dids @@ -662,11 +732,14 @@

Source code for gen3.index

 
         return response.json()
+ ### Put Requests -
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def update_blank(self, guid, rev, hashes, size, urls=None, authz=None): - """ + """ Update only hashes and size for a blank index @@ -698,7 +771,10 @@

Source code for gen3.index

 
         return self.get_record(rec["did"])
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def update_record( self, guid, @@ -710,7 +786,7 @@

Source code for gen3.index

         authz=None,
         urls_metadata=None,
     ):
-        """
+        """
 
         Update an existing entry in the index
 
@@ -738,7 +814,10 @@ 

Source code for gen3.index

         rec.patch()
         return rec.to_json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_update_record( self, guid, @@ -749,8 +828,10 @@

Source code for gen3.index

         acl=None,
         authz=None,
         urls_metadata=None,
+        _ssl=None,
+        **kwargs,
     ):
-        """
+        """
         Asynchronous function to update a record in indexd.
 
         Args:
@@ -770,30 +851,50 @@ 

Source code for gen3.index

                 "authz": authz,
                 "urls_metadata": urls_metadata,
             }
-            record = await async_get_record(guid)
+            record = await self.async_get_record(guid)
             revision = record.get("rev")
 
             for key, value in updatable_attrs.items():
                 if value is not None:
                     record[key] = value
 
+            del record["created_date"]
+            del record["rev"]
+            del record["updated_date"]
+            del record["version"]
+            del record["uploader"]
+            del record["form"]
+            del record["urls_metadata"]
+            del record["baseid"]
+            del record["size"]
+            del record["hashes"]
+            del record["did"]
+
+            logging.info(f"PUT-ing record: {record}")
+
+            # aiohttp only allows basic auth with their built in auth, so we
+            # need to manually add JWT auth header
+            headers = {"Authorization": self.client.auth._get_auth_value()}
+
             async with session.put(
-                f"{self.client.url}/index/{guid}/rev={revision}",
+                f"{self.client.url}/index/{guid}?rev={revision}",
                 json=record,
-                headers={"content-type": "application/json"},
+                headers=headers,
                 ssl=_ssl,
-                auth=self.client.auth,
             ) as response:
-                raise_for_status_and_print_error(response)
+                assert response.status == 200, await response.json()
                 response = await response.json()
 
         return response
+ ### Delete Requests -
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def delete_record(self, guid): - """ + """ Delete an entry from the index @@ -809,11 +910,14 @@

Source code for gen3.index

             rec.delete()
         return rec
+ ### Query Requests -
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def query_urls(self, pattern): - """ + """ Query all record URLs for given pattern @@ -827,9 +931,12 @@

Source code for gen3.index

         raise_for_status_and_print_error(response)
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_query_urls(self, pattern, _ssl=None): - """ + """ Asynchronous function to query urls from indexd. Args: @@ -847,11 +954,14 @@

Source code for gen3.index

 
         return response
+ ## Mint GUID Requests -
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_valid_guids(self, count=None): - """ + """ Get a list of valid GUIDs without indexing Args: count (int): number of GUIDs to request @@ -866,16 +976,21 @@

Source code for gen3.index

         response.raise_for_status()
         return response.json().get("guids", [])
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_guids_prefix(self): - """ + """ Get the prefix for GUIDs if there is one Returns: str: prefix for this instance """ response = self.client._get("/guid/prefix") response.raise_for_status() - return response.json().get("prefix")
+ return response.json().get("prefix")
+
+ def _print_func_name(function): diff --git a/docs/_build/html/_modules/gen3/jobs.html b/docs/_build/html/_modules/gen3/jobs.html index 0e0d45791..167c0f35c 100644 --- a/docs/_build/html/_modules/gen3/jobs.html +++ b/docs/_build/html/_modules/gen3/jobs.html @@ -1,18 +1,15 @@ - - + gen3.jobs — Gen3 SDK documentation - - - - - - - + + + + + @@ -62,8 +59,10 @@

Source code for gen3.jobs

 logging = get_logger("__name__")
 
 
-
[docs]class Gen3Jobs: - """ +
+[docs] +class Gen3Jobs: + """ A class for interacting with the Gen3's Job Dispatching Service(s). Examples: @@ -75,7 +74,7 @@

Source code for gen3.jobs

     """
 
     def __init__(self, endpoint=None, auth_provider=None, service_location="job"):
-        """
+        """
         Initialization for instance of the class to setup basic endpoint info.
 
         Args:
@@ -98,8 +97,10 @@ 

Source code for gen3.jobs

         self.endpoint = endpoint.rstrip("/")
         self._auth_provider = auth_provider
 
-
[docs] async def async_run_job_and_wait(self, job_name, job_input, _ssl=None, **kwargs): - """ +
+[docs] + async def async_run_job_and_wait(self, job_name, job_input, _ssl=None, **kwargs): + """ Asynchronous function to create a job, wait for output, and return. Will sleep in a linear delay until the job is done, starting with 1 second. @@ -130,8 +131,11 @@

Source code for gen3.jobs

         response = await self.async_get_output(job_create_response.get("uid"))
         return response
-
[docs] def is_healthy(self): - """ + +
+[docs] + def is_healthy(self): + """ Return if is healthy or not Returns: @@ -148,9 +152,12 @@

Source code for gen3.jobs

 
         return response.text == "Healthy"
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_version(self): - """ + """ Return the version Returns: @@ -160,18 +167,24 @@

Source code for gen3.jobs

         raise_for_status_and_print_error(response)
         return response.json().get("version")
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def list_jobs(self): - """ + """ List all jobs """ response = requests.get(self.endpoint + "/list", auth=self._auth_provider) raise_for_status_and_print_error(response) return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def create_job(self, job_name, job_input): - """ + """ Create a job with given name and input Args: @@ -188,6 +201,7 @@

Source code for gen3.jobs

         raise_for_status_and_print_error(response)
         return response.json()
+ @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_create_job(self, job_name, job_input, _ssl=None, **kwargs): async with aiohttp.ClientSession() as session: @@ -207,9 +221,11 @@

Source code for gen3.jobs

                 response = await response.json(content_type=None)
                 return response
 
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_status(self, job_id): - """ + """ Get the status of a previously created job """ response = requests.get( @@ -218,6 +234,7 @@

Source code for gen3.jobs

         raise_for_status_and_print_error(response)
         return response.json()
+ @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_status(self, job_id, _ssl=None, **kwargs): async with aiohttp.ClientSession() as session: @@ -235,9 +252,11 @@

Source code for gen3.jobs

                 response = await response.json(content_type=None)
                 return response
 
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_output(self, job_id): - """ + """ Get the output of a previously completed job """ response = requests.get( @@ -246,6 +265,7 @@

Source code for gen3.jobs

         raise_for_status_and_print_error(response)
         return response.json()
+ @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_get_output(self, job_id, _ssl=None, **kwargs): async with aiohttp.ClientSession() as session: @@ -262,6 +282,7 @@

Source code for gen3.jobs

                 raise_for_status_and_print_error(response)
                 response = await response.json(content_type=None)
                 return response
+
diff --git a/docs/_build/html/_modules/gen3/metadata.html b/docs/_build/html/_modules/gen3/metadata.html index d78515824..0de1a5985 100644 --- a/docs/_build/html/_modules/gen3/metadata.html +++ b/docs/_build/html/_modules/gen3/metadata.html @@ -1,18 +1,15 @@ - - + gen3.metadata — Gen3 SDK documentation - - - - - - - + + + + + @@ -89,8 +86,10 @@

Source code for gen3.metadata

 }
 
 
-
[docs]class Gen3Metadata: - """ +
+[docs] +class Gen3Metadata: + """ A class for interacting with the Gen3 Metadata services. Examples: @@ -112,7 +111,7 @@

Source code for gen3.metadata

         service_location="mds",
         admin_endpoint_suffix="-admin",
     ):
-        """
+        """
         Initialization for instance of the class to setup basic endpoint info.
 
         Args:
@@ -142,8 +141,10 @@ 

Source code for gen3.metadata

         self.admin_endpoint = endpoint.rstrip("/") + admin_endpoint_suffix
         self._auth_provider = auth_provider
 
-
[docs] def is_healthy(self): - """ +
+[docs] + def is_healthy(self): + """ Return if is healthy or not Returns: @@ -160,9 +161,12 @@

Source code for gen3.metadata

 
         return response.json().get("status") == "OK"
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_version(self): - """ + """ Return the version Returns: @@ -172,9 +176,12 @@

Source code for gen3.metadata

         response.raise_for_status()
         return response.text
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def get_index_key_paths(self): - """ + """ List all the metadata key paths indexed in the database. Returns: @@ -186,9 +193,12 @@

Source code for gen3.metadata

         response.raise_for_status()
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def create_index_key_path(self, path): - """ + """ Create a metadata key path indexed in the database. Args: @@ -200,9 +210,12 @@

Source code for gen3.metadata

         response.raise_for_status()
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def delete_index_key_path(self, path): - """ + """ List all the metadata key paths indexed in the database. Args: @@ -214,7 +227,10 @@

Source code for gen3.metadata

         response.raise_for_status()
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def query( self, query, @@ -224,7 +240,7 @@

Source code for gen3.metadata

         use_agg_mds=False,
         **kwargs,
     ):
-        """
+        """
         Query the metadata given a query.
 
         Query format is based off the logic used in the service:
@@ -281,9 +297,12 @@ 

Source code for gen3.metadata

 
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) async def async_get(self, guid, _ssl=None, **kwargs): - """ + """ Asynchronous function to get metadata Args: @@ -305,9 +324,12 @@

Source code for gen3.metadata

 
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) def get(self, guid, **kwargs): - """ + """ Get the metadata associated with the guid Args: guid (str): guid to use @@ -323,9 +345,12 @@

Source code for gen3.metadata

 
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def batch_create(self, metadata_list, overwrite=True, **kwargs): - """ + """ Create the list of metadata associated with the list of guids Args: @@ -356,9 +381,12 @@

Source code for gen3.metadata

 
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) - def create(self, guid, metadata, overwrite=False, **kwargs): - """ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def create(self, guid, metadata, aliases=None, overwrite=False, **kwargs): + """ Create the metadata associated with the guid Args: @@ -367,6 +395,8 @@

Source code for gen3.metadata

                 attached to the provided GUID as metadata
             overwrite (bool, optional): whether or not to overwrite existing data
         """
+        aliases = aliases or []
+
         url = self.admin_endpoint + f"/metadata/{guid}"
 
         url_with_params = append_query_params(url, overwrite=overwrite, **kwargs)
@@ -377,9 +407,23 @@ 

Source code for gen3.metadata

         )
         response.raise_for_status()
 
+        if aliases:
+            try:
+                self.create_aliases(guid=guid, aliases=aliases, merge=overwrite)
+            except Exception:
+                logging.error(
+                    "Error while attempting to create aliases: "
+                    f"'{aliases}' to GUID: '{guid}' with merge={overwrite}. "
+                    "GUID metadata record was created successfully and "
+                    "will NOT be deleted."
+                )
+
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) async def async_create( self, guid, @@ -389,7 +433,7 @@

Source code for gen3.metadata

         _ssl=None,
         **kwargs,
     ):
-        """
+        """
         Asynchronous function to create metadata
 
         Args:
@@ -400,7 +444,7 @@ 

Source code for gen3.metadata

             _ssl (None, optional): whether or not to use ssl
         """
         aliases = aliases or []
-        # todo handle aliases
+
         async with aiohttp.ClientSession() as session:
             url = self.admin_endpoint + f"/metadata/{guid}"
             url_with_params = append_query_params(url, overwrite=overwrite, **kwargs)
@@ -417,11 +461,28 @@ 

Source code for gen3.metadata

                 response.raise_for_status()
                 response = await response.json()
 
+            if aliases:
+                logging.info(f"creating aliases: {aliases}")
+                try:
+                    await self.async_create_aliases(
+                        guid=guid, aliases=aliases, _ssl=_ssl
+                    )
+                except Exception:
+                    logging.error(
+                        "Error while attempting to create aliases: "
+                        f"'{aliases}' to GUID: '{guid}'. "
+                        "GUID metadata record was created successfully and "
+                        "will NOT be deleted."
+                    )
+
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) - def update(self, guid, metadata, **kwargs): - """ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + def update(self, guid, metadata, aliases=None, merge=False, **kwargs): + """ Update the metadata associated with the guid Args: @@ -429,6 +490,8 @@

Source code for gen3.metadata

             metadata (Dict): dictionary representing what will end up a JSON blob
                 attached to the provided GUID as metadata
         """
+        aliases = aliases or []
+
         url = self.admin_endpoint + f"/metadata/{guid}"
 
         url_with_params = append_query_params(url, **kwargs)
@@ -439,27 +502,44 @@ 

Source code for gen3.metadata

         )
         response.raise_for_status()
 
+        if aliases:
+            try:
+                self.update_aliases(guid=guid, aliases=aliases, merge=merge)
+            except Exception:
+                logging.error(
+                    "Error while attempting to update aliases: "
+                    f"'{aliases}' to GUID: '{guid}'. "
+                    "GUID metadata record was created successfully and "
+                    "will NOT be deleted."
+                )
+
         return response.json()
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) async def async_update( self, guid, metadata, aliases=None, merge=False, _ssl=None, **kwargs ): - """ + """ Asynchronous function to update metadata Args: guid (str): guid to use metadata (Dict): dictionary representing what will end up a JSON blob attached to the provided GUID as metadata + aliases (list[str], optional): List of aliases to update the GUID with + merge (bool, optional): Whether or not to merge metadata AND aliases + with existing values _ssl (None, optional): whether or not to use ssl + **kwargs: Description """ - # TODO handle aliases + aliases = aliases or [] + async with aiohttp.ClientSession() as session: url = self.admin_endpoint + f"/metadata/{guid}" - if merge: - url += "?merge=True" - url_with_params = append_query_params(url, **kwargs) + url_with_params = append_query_params(url, merge=merge, **kwargs) # aiohttp only allows basic auth with their built in auth, so we # need to manually add JWT auth header @@ -471,11 +551,27 @@

Source code for gen3.metadata

                 response.raise_for_status()
                 response = await response.json()
 
+            if aliases:
+                try:
+                    await self.async_update_aliases(
+                        guid=guid, aliases=aliases, merge=merge, _ssl=_ssl
+                    )
+                except Exception:
+                    logging.error(
+                        "Error while attempting to update aliases: "
+                        f"'{aliases}' to GUID: '{guid}' with merge={merge}. "
+                        "GUID metadata record was created successfully and "
+                        "will NOT be deleted."
+                    )
+
         return response
-
[docs] @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) def delete(self, guid, **kwargs): - """ + """ Delete the metadata associated with the guid Args: @@ -490,10 +586,366 @@

Source code for gen3.metadata

 
         return response.json()
+ + # + # Alias Support + # + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def get_aliases(self, guid, **kwargs): + """ + Get Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to get aliases + """ + url = self.endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.get(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.json()
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_get_aliases(self, guid, _ssl=None, **kwargs): + """ + Asyncronously get Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to get aliases + """ + async with aiohttp.ClientSession() as session: + url = self.endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.get( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json()
+ + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_alias(self, guid, alias, **kwargs): + """ + Delete single Alias for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_alias(self, guid, alias, _ssl=None, **kwargs): + """ + Asyncronously delete single Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json() + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def create_aliases(self, guid, aliases, **kwargs): + """ + Create Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + **kwargs: additional query params + + Returns: + requests.Response: response from the request to create aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + response = requests.post(url_with_params, json=data, auth=self._auth_provider) + response.raise_for_status() + + return response.json()
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_create_aliases(self, guid, aliases, _ssl=None, **kwargs): + """ + Asyncronously create Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to create aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + async with session.post( + url_with_params, json=data, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + return await response.json()
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def update_aliases(self, guid, aliases, merge=False, **kwargs): + """ + Update Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + merge (bool, optional): Whether or not to aliases with existing values + **kwargs: additional query params + + Returns: + requests.Response: response from the request to update aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, merge=merge, **kwargs) + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + response = requests.put(url_with_params, json=data, auth=self._auth_provider) + response.raise_for_status() + + return response.json()
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_update_aliases( + self, guid, aliases, merge=False, _ssl=None, **kwargs + ): + """ + Asyncronously update Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + merge (bool, optional): Whether or not to aliases with existing values + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to update aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, merge=merge, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + async with session.put( + url_with_params, json=data, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json()
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_aliases(self, guid, **kwargs): + """ + Delete all Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.text
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_aliases(self, guid, _ssl=None, **kwargs): + """ + Asyncronously delete all Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.text
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_alias(self, guid, alias, **kwargs): + """ + Delete single Alias for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + alias (str): alternative identifier (alias) to delete + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.text
+ + +
+[docs] + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_alias(self, guid, alias, _ssl=None, **kwargs): + """ + Asyncronously delete single Aliases for the given guid + + Args: + guid (str): Globally unique ID for the metadata blob + alias (str): alternative identifier (alias) to delete + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.text
+ + def _prepare_metadata( self, metadata, indexd_doc, force_metadata_columns_even_if_empty ): - """ + """ Validate and generate the provided metadata for submission to the metadata service. @@ -509,7 +961,7 @@

Source code for gen3.metadata

         """
 
         def _extract_non_indexd_metadata(metadata):
-            """
+            """
             Get the "additional metadata": metadata that was provided but is
             not stored in indexd, so should be stored in the metadata service.
             """
@@ -575,7 +1027,7 @@ 

Source code for gen3.metadata

     def _get_package_metadata(
         self, submitted_metadata, file_name, file_size, hashes, urls, contents
     ):
-        """
+        """
         The MDS Objects API currently expects files that have not been
         uploaded yet. For files we only needs to index, not upload, create
         object records manually by generating the expected object fields.
@@ -617,6 +1069,7 @@ 

Source code for gen3.metadata

             "_upload_status": "uploaded",
         }
         return metadata
+
diff --git a/docs/_build/html/_modules/gen3/object.html b/docs/_build/html/_modules/gen3/object.html index 3a354f674..d2bc41529 100644 --- a/docs/_build/html/_modules/gen3/object.html +++ b/docs/_build/html/_modules/gen3/object.html @@ -1,18 +1,15 @@ - - + gen3.object — Gen3 SDK documentation - - - - - - - + + + + + @@ -40,8 +37,10 @@

Source code for gen3.object

     pass
 
 
-
[docs]class Gen3Object: - """For interacting with Gen3 object level features. +
+[docs] +class Gen3Object: + """For interacting with Gen3 object level features. A class for interacting with the Gen3 object services. Currently allows creating and deleting of an object from the Gen3 System. @@ -79,8 +78,10 @@

Source code for gen3.object

         data = response.json()
         return data["guid"], data["upload_url"]
 
-
[docs] def delete_object(self, guid, delete_file_locations=False): - """ +
+[docs] + def delete_object(self, guid, delete_file_locations=False): + """ Delete the object from indexd, metadata service and optionally all storage locations Args: @@ -98,7 +99,9 @@

Source code for gen3.object

             + delete_param
         )
         response = requests.delete(url, auth=self._auth_provider)
-        raise_for_status_and_print_error(response)
+ raise_for_status_and_print_error(response)
+
+
diff --git a/docs/_build/html/_modules/gen3/query.html b/docs/_build/html/_modules/gen3/query.html index 59180c1fe..9079f45d7 100644 --- a/docs/_build/html/_modules/gen3/query.html +++ b/docs/_build/html/_modules/gen3/query.html @@ -1,18 +1,15 @@ - - + gen3.query — Gen3 SDK documentation - - - - - - - + + + + + @@ -37,8 +34,10 @@

Source code for gen3.query

 from gen3.utils import raise_for_status_and_print_error
 
 
-
[docs]class Gen3Query: - """ +
+[docs] +class Gen3Query: + """ Query ElasticSearch data from a Gen3 system. Args: @@ -55,7 +54,9 @@

Source code for gen3.query

     def __init__(self, auth_provider):
         self._auth_provider = auth_provider
 
-
[docs] def query( +
+[docs] + def query( self, data_type, fields, @@ -67,7 +68,7 @@

Source code for gen3.query

         accessibility=None,
         verbose=True,
     ):
-        """
+        """
         Execute a query against a Data Commons.
 
         Args:
@@ -129,22 +130,25 @@ 

Source code for gen3.query

         sorts = [f'{{{field}: "{val}"}}' for field, val in sort_object.items()]
         sort_string = f'[{", ".join(sorts)}]'
 
-        query_string = f"""query($filter: JSON) {{
+        query_string = f"""query($filter: JSON) {{
             {data_type}(
                 first: {first},
                 offset: {offset},
                 sort: {sort_string},
                 accessibility: {accessibility},
                 filter: $filter
-            ) {{
-                {" ".join(fields)}
-            }}
+            ) {{
+                {" ".join(fields)}
+            }}
         }}"""
         variables = {"filter": filter_object}
         return self.graphql_query(query_string=query_string, variables=variables)
-
[docs] def graphql_query(self, query_string, variables=None): - """ + +
+[docs] + def graphql_query(self, query_string, variables=None): + """ Execute a GraphQL query against a Data Commons. Args: @@ -177,7 +181,10 @@

Source code for gen3.query

             print(f"Did not receive JSON: {response.text}")
             raise
-
[docs] def raw_data_download( + +
+[docs] + def raw_data_download( self, data_type, fields, @@ -187,7 +194,7 @@

Source code for gen3.query

         first=None,
         offset=None,
     ):
-        """
+        """
         Execute a raw data download against a Data Commons.
 
         Args:
@@ -248,7 +255,9 @@ 

Source code for gen3.query

         if first:
             data = data[:first]
 
-        return data
+ return data
+
+
diff --git a/docs/_build/html/_modules/gen3/submission.html b/docs/_build/html/_modules/gen3/submission.html index 0e3743175..fcebb439a 100644 --- a/docs/_build/html/_modules/gen3/submission.html +++ b/docs/_build/html/_modules/gen3/submission.html @@ -1,18 +1,15 @@ - - + gen3.submission — Gen3 SDK documentation - - - - - - - + + + + + @@ -56,8 +53,10 @@

Source code for gen3.submission

     pass
 
 
-
[docs]class Gen3Submission: - """Submit/Export/Query data from a Gen3 Submission system. +
+[docs] +class Gen3Submission: + """Submit/Export/Query data from a Gen3 Submission system. A class for interacting with the Gen3 submission services. Supports submitting and exporting from Sheepdog. @@ -81,22 +80,27 @@

Source code for gen3.submission

         self._endpoint = self._auth_provider.endpoint
 
     def __export_file(self, filename, output):
-        """Writes an API response to a file."""
+        """Writes an API response to a file."""
         with open(filename, "w") as outfile:
             outfile.write(output)
         print("\nOutput written to file: " + filename)
 
     ### Program functions
 
-
[docs] def get_programs(self): - """List registered programs""" +
+[docs] + def get_programs(self): + """List registered programs""" api_url = f"{self._endpoint}/api/v0/submission/" output = requests.get(api_url, auth=self._auth_provider) raise_for_status_and_print_error(output) return output.json()
-
[docs] def create_program(self, json): - """Create a program. + +
+[docs] + def create_program(self, json): + """Create a program. Args: json (object): The json of the program to create @@ -110,8 +114,11 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output.json()
-
[docs] def delete_program(self, program): - """Delete a program. + +
+[docs] + def delete_program(self, program): + """Delete a program. This deletes an empty program from the commons. @@ -129,10 +136,13 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output
+ ### Project functions -
[docs] def get_projects(self, program): - """List registered projects for a given program +
+[docs] + def get_projects(self, program): + """List registered projects for a given program Args: program: the name of the program you want the projects from @@ -148,8 +158,11 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output.json()
-
[docs] def create_project(self, program, json): - """Create a project. + +
+[docs] + def create_project(self, program, json): + """Create a project. Args: program (str): The program to create a project on json (object): The json of the project to create @@ -164,8 +177,11 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output.json()
-
[docs] def delete_project(self, program, project): - """Delete a project. + +
+[docs] + def delete_project(self, program, project): + """Delete a project. This deletes an empty project from the commons. @@ -184,8 +200,11 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output
-
[docs] def get_project_dictionary(self, program, project): - """Get dictionary schema for a given project + +
+[docs] + def get_project_dictionary(self, program, project): + """Get dictionary schema for a given project Args: program: the name of the program the project is from @@ -201,8 +220,11 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output.json()
-
[docs] def open_project(self, program, project): - """Mark a project ``open``. Opening a project means uploads, deletions, etc. are allowed. + +
+[docs] + def open_project(self, program, project): + """Mark a project ``open``. Opening a project means uploads, deletions, etc. are allowed. Args: program: the name of the program the project is from @@ -218,10 +240,13 @@

Source code for gen3.submission

         raise_for_status_and_print_error(output)
         return output.json()
+ ### Record functions -
[docs] def submit_record(self, program, project, json): - """Submit record(s) to a project as json. +
+[docs] + def submit_record(self, program, project, json): + """Submit record(s) to a project as json. Args: program (str): The program to submit to. @@ -241,8 +266,11 @@

Source code for gen3.submission

         output.raise_for_status()
         return output.json()
-
[docs] def delete_record(self, program, project, uuid): - """ + +
+[docs] + def delete_record(self, program, project, uuid): + """ Delete a record from a project. Args: @@ -257,8 +285,11 @@

Source code for gen3.submission

         """
         return self.delete_records(program, project, [uuid])
-
[docs] def delete_records(self, program, project, uuids, batch_size=100): - """ + +
+[docs] + def delete_records(self, program, project, uuids, batch_size=100): + """ Delete a list of records from a project. Args: @@ -294,8 +325,11 @@

Source code for gen3.submission

                 raise
         return output
-
[docs] def delete_node(self, program, project, node_name, batch_size=100, verbose=True): - """ + +
+[docs] + def delete_node(self, program, project, node_name, batch_size=100, verbose=True): + """ Delete all records for a node from a project. Args: @@ -314,10 +348,13 @@

Source code for gen3.submission

             program, project, [node_name], batch_size, verbose=verbose
         )
-
[docs] def delete_nodes( + +
+[docs] + def delete_nodes( self, program, project, ordered_node_list, batch_size=100, verbose=True ): - """ + """ Delete all records for a list of nodes from a project. Args: @@ -338,10 +375,10 @@

Source code for gen3.submission

                 print(node, end="", flush=True)
             first_uuid = ""
             while True:
-                query_string = f"""{{
-                    {node} (first: {batch_size}, project_id: "{project_id}") {{
+                query_string = f"""{{
+                    {node} (first: {batch_size}, project_id: "{project_id}") {{
                         id
-                    }}
+                    }}
                 }}"""
                 res = self.query(query_string)
                 uuids = [x["id"] for x in res["data"][node]]
@@ -356,8 +393,11 @@ 

Source code for gen3.submission

             if verbose:
                 print()
-
[docs] def export_record(self, program, project, uuid, fileformat, filename=None): - """Export a single record into json. + +
+[docs] + def export_record(self, program, project, uuid, fileformat, filename=None): + """Export a single record into json. Args: program (str): The program the record is under. @@ -392,8 +432,11 @@

Source code for gen3.submission

             self.__export_file(filename, output)
             return output
-
[docs] def export_node(self, program, project, node_type, fileformat, filename=None): - """Export all records in a single node type of a project. + +
+[docs] + def export_node(self, program, project, node_type, fileformat, filename=None): + """Export all records in a single node type of a project. Args: program (str): The program to which records belong. @@ -428,10 +471,13 @@

Source code for gen3.submission

             self.__export_file(filename, output)
             return output
+ ### Query functions -
[docs] def query(self, query_txt, variables=None, max_tries=1): - """Execute a GraphQL query against a Data Commons. +
+[docs] + def query(self, query_txt, variables=None, max_tries=1): + """Execute a GraphQL query against a Data Commons. Args: query_txt (str): Query text. @@ -468,8 +514,11 @@

Source code for gen3.submission

 
         return data
-
[docs] def get_graphql_schema(self): - """Returns the GraphQL schema for a commons. + +
+[docs] + def get_graphql_schema(self): + """Returns the GraphQL schema for a commons. This runs the GraphQL introspection query against a commons and returns the results. @@ -484,10 +533,13 @@

Source code for gen3.submission

         data = json.loads(output)
         return data
+ ### Dictionary functions -
[docs] def get_dictionary_node(self, node_type): - """Returns the dictionary schema for a specific node. +
+[docs] + def get_dictionary_node(self, node_type): + """Returns the dictionary schema for a specific node. This gets the current json dictionary schema for a specific node type in a commons. @@ -507,8 +559,11 @@

Source code for gen3.submission

         data = json.loads(output)
         return data
-
[docs] def get_dictionary_all(self): - """Returns the entire dictionary object for a commons. + +
+[docs] + def get_dictionary_all(self): + """Returns the entire dictionary object for a commons. This gets a json of the current dictionary schema for a commons. @@ -520,10 +575,13 @@

Source code for gen3.submission

         """
         return self.get_dictionary_node("_all")
+ ### File functions -
[docs] def get_project_manifest(self, program, project): - """Get a projects file manifest +
+[docs] + def get_project_manifest(self, program, project): + """Get a projects file manifest Args: program: the name of the program the project is from @@ -538,8 +596,11 @@

Source code for gen3.submission

         output = requests.get(api_url, auth=self._auth_provider)
         return output
-
[docs] def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): - """Submit data in a spreadsheet file containing multiple records in rows to a Gen3 Data Commons. + +
+[docs] + def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): + """Submit data in a spreadsheet file containing multiple records in rows to a Gen3 Data Commons. Args: project_id (str): The project_id to submit to. @@ -601,7 +662,6 @@

Source code for gen3.submission

 
         # Start the chunking loop:
         while (start + len(chunk)) <= len(df):
-
             timeout = False
             valid_but_failed = []
             invalid = []
@@ -633,7 +693,6 @@ 

Source code for gen3.submission

                 or "Connection aborted." in response
                 or "service failure - try again later" in response
             ):  # time-out, response is not valid JSON at the moment
-
                 print("\t Reducing Chunk Size: {}".format(response))
                 results["responses"].append("Reducing Chunk Size: {}".format(response))
                 timeout = True
@@ -665,7 +724,6 @@ 

Source code for gen3.submission

                     )
 
                 elif json_res["code"] == 200:  # success
-
                     entities = json_res.get("entities", [])
                     print("\t Succeeded: {} entities.".format(len(entities)))
                     results["responses"].append(
@@ -677,14 +735,12 @@ 

Source code for gen3.submission

                         results["succeeded"].append(sid)
 
                 elif json_res["code"] == 500:  # internal server error
-
                     print("\t Internal Server Error: {}".format(response))
                     results["responses"].append(
                         "Internal Server Error: {}".format(response)
                     )
 
                 else:  # failure (400, 401, 403, 404...)
-
                     entities = json_res.get("entities", [])
                     print(
                         "\tChunk Failed (status code {}): {} entities.".format(
@@ -748,7 +804,9 @@ 

Source code for gen3.submission

         print("Successful records: {}".format(len(set(results["succeeded"]))))
         print("Failed invalid records: {}".format(len(results["invalid"])))
 
-        return results
+ return results
+
+
diff --git a/docs/_build/html/_modules/gen3/tools/download/drs_download.html b/docs/_build/html/_modules/gen3/tools/download/drs_download.html index dbf52dd29..a9e86bb29 100644 --- a/docs/_build/html/_modules/gen3/tools/download/drs_download.html +++ b/docs/_build/html/_modules/gen3/tools/download/drs_download.html @@ -1,18 +1,15 @@ - - + gen3.tools.download.drs_download — Gen3 SDK documentation - - - - - - - + + + + + @@ -81,13 +78,15 @@

Source code for gen3.tools.download.drs_download

# package formats we handle for unpacking PACKAGE_EXTENSIONS = [".zip"] -logger = get_logger("drs-pull", log_level="warning") +logger = get_logger("__name__") -
[docs]@dataclass_json(letter_case=LetterCase.SNAKE) +
+[docs] +@dataclass_json(letter_case=LetterCase.SNAKE) @dataclass class Manifest: - """Data class representing a Gen3 JSON manifest typically exported from a Gen3 discovery page. + """Data class representing a Gen3 JSON manifest typically exported from a Gen3 discovery page. The class is passed to the DownloadManager to download or list all of the files in the manifest. The Download manager will cache additional information (if available) @@ -106,16 +105,21 @@

Source code for gen3.tools.download.drs_download

md5sum: Optional[str] = None commons_url: Optional[str] = None -
[docs] @staticmethod +
+[docs] + @staticmethod def load_manifest(path: Path): - """Loads a json manifest""" + """Loads a json manifest""" with open(path, "rt") as fin: data = json_load(fin) return Manifest.schema().load(data, many=True)
-
[docs] @staticmethod + +
+[docs] + @staticmethod def create_object_list(manifest) -> List["Downloadable"]: - """Create a list of Downloadable instances from the manifest + """Create a list of Downloadable instances from the manifest Args: manifest(list): list of manifest objects @@ -134,9 +138,12 @@

Source code for gen3.tools.download.drs_download

) return results
-
[docs] @staticmethod + +
+[docs] + @staticmethod def load(filename: Path) -> Optional[List["Downloadable"]]: - """ + """ Method to load a json manifest and return a list of Bownloadable object. This list is passed to the DownloadManager methods of download, and list @@ -153,12 +160,14 @@

Source code for gen3.tools.download.drs_download

except JSONDecodeError as ex: logger.critical(f"format of manifest file is valid JSON: {ex.msg}") - return None
+ return None
+
+ @dataclass class KnownDRSEndpoint: - """ + """ Dataclass used internally by the DownloadManager class to cache hostnames and tokens for Gen3 commons possibly accessed using the Workspace Token Service (WTS). The endpoint is assumed to support DRS and therefore caches additional DRS information. @@ -182,11 +191,11 @@

Source code for gen3.tools.download.drs_download

@property def available(self): - """If endpoint has access token it is available""" + """If endpoint has access token it is available""" return self.access_token is not None def expired(self) -> bool: - """check if WTS token is older than the default expiration date + """check if WTS token is older than the default expiration date If not using the WTS return false and use standard Gen3 Auth """ @@ -196,7 +205,7 @@

Source code for gen3.tools.download.drs_download

return datetime.now() > self.expire def renew_token(self, wts_server_name: str, server_access_token): - """Gets a new token from the WTS and updates the token and refresh time + """Gets a new token from the WTS and updates the token and refresh time Args: wts_server_name (str): hostname of WTS server @@ -216,16 +225,18 @@

Source code for gen3.tools.download.drs_download

class DRSObjectType(str, Enum): - """Enum defining the 3 possible DRS object types.""" + """Enum defining the 3 possible DRS object types.""" unknown = "unknown" object = "object" bundle = "bundle" -
[docs]@dataclass +
+[docs] +@dataclass class Downloadable: - """ + """ Class handling the information for a DRS object. The information is populated from the manifest or by retrieving the information from a DRS server. @@ -255,26 +266,31 @@

Source code for gen3.tools.download.drs_download

def __str__(self): return ( - f'{self.file_name if self.file_name is not None else "not available" : >45}; ' - f"{humanfriendly.format_size(self.file_size) :>12}; " - f'{self.hostname if self.hostname is not None else "not resolved"}; ' - f'{self.created_time.strftime("%m/%d/%Y, %H:%M:%S") if self.created_time is not None else "not available"}' + f'{self.file_name if self.file_name is not None else "not available" : >45}; ' + f"{humanfriendly.format_size(self.file_size) :>12}; " + f'{self.hostname if self.hostname is not None else "not resolved"}; ' + f'{self.created_time.strftime("%m/%d/%Y, %H:%M:%S") if self.created_time is not None else "not available"}' ) def __repr__(self): return ( - f'(Downloadable: {self.file_name if self.file_name is not None else "not available"}; ' + f'(Downloadable: {self.file_name if self.file_name is not None else "not available"}; ' f"{humanfriendly.format_size(self.file_size)}; " - f'{self.hostname if self.hostname is not None else "not resolved"}; ' - f'{self.created_time.strftime("%m/%d/%Y, %H:%M:%S") if self.created_time is not None else "not available"})' + f'{self.hostname if self.hostname is not None else "not resolved"}; ' + f'{self.created_time.strftime("%m/%d/%Y, %H:%M:%S") if self.created_time is not None else "not available"})' ) -
[docs] def download(self): - """calls the manager to download this object. Allows Downloadables to be self downloading""" +
+[docs] + def download(self): + """calls the manager to download this object. Allows Downloadables to be self downloading""" self._manager.download([self])
-
[docs] def pprint(self, indent: str = ""): - """ + +
+[docs] + def pprint(self, indent: str = ""): + """ Pretty prints the object information. This is used for listing an object. In the case of a DRS bundle the child objects are listed similar to the linux tree command """ @@ -291,12 +307,16 @@

Source code for gen3.tools.download.drs_download

res += f"{child_indent}└── {x.pprint(child_indent)}" else: res += f"{child_indent}├── {x.pprint(child_indent)}" - return res
+ return res
+
-
[docs]@dataclass + +
+[docs] +@dataclass class DownloadStatus: - """Stores the download status of objectIDs. + """Stores the download status of objectIDs. The DataManager will return a list of DownloadStatus as a result of calling the download method @@ -315,18 +335,19 @@

Source code for gen3.tools.download.drs_download

def __str__(self): return ( - f'filename: {self.filename if self.filename is not None else "not available"}; ' + f'filename: {self.filename if self.filename is not None else "not available"}; ' f"status: {self.status}; " - f'start_time: {self.start_time.strftime("%m/%d/%Y, %H:%M:%S") if self.start_time is not None else "n/a"}; ' - f'end_time: {self.end_time.strftime("%m/%d/%Y, %H:%M:%S") if self.start_time is not None else "n/a"}' + f'start_time: {self.start_time.strftime("%m/%d/%Y, %H:%M:%S") if self.start_time is not None else "n/a"}; ' + f'end_time: {self.end_time.strftime("%m/%d/%Y, %H:%M:%S") if self.start_time is not None else "n/a"}' ) def __repr__(self): return self.__str__()
+ def wts_external_oidc(hostname: str) -> Dict[str, Any]: - """ + """ Get the external_oidc from a connected WTS. Will report if WTS service is missing. Note that in some cases this can be considered a warning not a error. @@ -351,7 +372,7 @@

Source code for gen3.tools.download.drs_download

except requests.exceptions.HTTPError as exc: logger.critical( - f'HTTP Error ({exc.response.status_code}): {json_loads(exc.response.text).get("message", "")}' + f'HTTP Error ({exc.response.status_code}): {json_loads(exc.response.text).get("message", "")}' ) except JSONDecodeError as ex: logger.warning( @@ -363,7 +384,7 @@

Source code for gen3.tools.download.drs_download

def wts_get_token(hostname: str, idp: str, access_token: str): - """ + """ Gets a auth token from a Gen3 WTS server for the supplied idp Args: hostname (str): Gen3 common's WTS service @@ -402,7 +423,7 @@

Source code for gen3.tools.download.drs_download

def get_drs_object_info(hostname: str, object_id: str) -> Optional[dict]: - """ + """ Retrieves information for a DRS object residing on the hostname Args: hostname (str): hostname of DRS object @@ -433,7 +454,7 @@

Source code for gen3.tools.download.drs_download

def extract_filename_from_object_info(object_info: dict) -> Optional[str]: - """Extracts the filename from the object_info. + """Extracts the filename from the object_info. if filename is in object_info use that, otherwise try to extract it from the one of the access methods. Returns filename if found, else return None @@ -454,7 +475,7 @@

Source code for gen3.tools.download.drs_download

def get_access_methods(object_info: dict) -> List[str]: - """ + """ Returns the DRS GA4GH access methods from the object_info. Args: @@ -470,7 +491,7 @@

Source code for gen3.tools.download.drs_download

def get_drs_object_type(object_info: dict) -> DRSObjectType: - """From the object info determine the type of object. + """From the object info determine the type of object. Args: object_info (dict): DRS object dictionary @@ -490,7 +511,7 @@

Source code for gen3.tools.download.drs_download

def get_drs_object_timestamp(s: Optional[str]) -> Optional[datetime]: - """returns the timestamp in datetime if not none otherwise returns None + """returns the timestamp in datetime if not none otherwise returns None Args: s (Optional[str]): string to parse @@ -501,7 +522,7 @@

Source code for gen3.tools.download.drs_download

def add_drs_object_info(info: Downloadable) -> bool: - """ + """ Given a downloader object fill in the required fields from the resolved hostname. In the case of a bundle, try to resolve all object_ids contained in the bundle including other objects and bundles. @@ -541,7 +562,7 @@

Source code for gen3.tools.download.drs_download

class InvisibleProgress: - """ + """ Invisible progress bar which stubs a tqdm progress bar """ @@ -552,7 +573,7 @@

Source code for gen3.tools.download.drs_download

def download_file_from_url( url: str, filename: Path, show_progress: bool = True ) -> bool: - """ + """ Downloads a file using the URL. The URL is a pre-signed url created by the download manager from the access method of the DRS object. @@ -588,7 +609,7 @@

Source code for gen3.tools.download.drs_download

progress_bar = ( tqdm( - desc=f"{str(filename) : <45}", + desc=f"{str(filename) : <45}", total=total_size_in_bytes, unit="iB", unit_scale=True, @@ -626,7 +647,7 @@

Source code for gen3.tools.download.drs_download

def parse_drs_identifier(drs_candidate: str) -> Tuple[str, str, str]: - """ + """ Parses a DRS identifier to extract a hostname in the case of hostname based DRS otherwise it look for a DRS compact identifier. @@ -647,7 +668,6 @@

Source code for gen3.tools.download.drs_download

matches = re.findall(drs_regex, drs_candidate, re.UNICODE) if len(matches) == 1: # this could be a hostname DRS id - hostname_regex = ( r"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*" r"([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" @@ -668,7 +688,7 @@

Source code for gen3.tools.download.drs_download

def resolve_drs_hostname_from_id( object_id: str, resolved_drs_prefix_cache: dict, mds_url: str ) -> Optional[Tuple[str, str, str]]: - """Resolves and returns a DRS identifier + """Resolves and returns a DRS identifier The resolved_drs_prefix_cache is updated if needed and is a potential side effect of this call Args: @@ -698,7 +718,7 @@

Source code for gen3.tools.download.drs_download

def resolve_objects_drs_hostname_from_id( object_ids: List[Downloadable], resolved_drs_prefix_cache: dict, mds_url: str ) -> None: - """Given a list of object_ids go through list and resolve + cache any unknown hosts + """Given a list of object_ids go through list and resolve + cache any unknown hosts Args: object_ids (List[Downloadable]): list of object to resolve @@ -719,7 +739,7 @@

Source code for gen3.tools.download.drs_download

def ensure_dirpath_exists(path: Path) -> Path: - """Utility to create a directory if missing. + """Utility to create a directory if missing. Returns the path so that the call can be inlined in a another call Args: @@ -739,7 +759,7 @@

Source code for gen3.tools.download.drs_download

def get_download_url_using_drs( drs_hostname: str, object_id: str, access_method: str, access_token: str ) -> Optional[str]: - """ + """ Returns the presigned URL for a DRS object, from a DRS hostname, via the access method Args: drs_hostname (str): hostname of DRS server @@ -768,13 +788,13 @@

Source code for gen3.tools.download.drs_download

logger.critical(f"Was unable to download: {object_id}. Timeout Error.") except requests.exceptions.HTTPError as exc: logger.critical( - f"HTTP Error ({exc.response.status_code}): requesting download url from {access_method}" + f"HTTP Error ({exc.response.status_code}) when requesting download url from {access_method}" ) return None def get_user_auth(commons_url: str, access_token: str) -> Optional[List[str]]: - """ + """ Retrieves a user's authz for the commons based on the access token. Any error will be logged and None is returned @@ -785,7 +805,7 @@

Source code for gen3.tools.download.drs_download

Returns: The authz object from the user endpoint """ - """ + """ """ headers = { @@ -807,7 +827,7 @@

Source code for gen3.tools.download.drs_download

def list_auth(hostname: str, authz: dict): - """ + """ Prints the authz for a DRS hostname Args: hostname (str): hostname to list access @@ -820,14 +840,16 @@

Source code for gen3.tools.download.drs_download

if authz is not None and len(authz) > 0: for access, methods in authz.items(): print( - f" {access : <55}: {' '.join(dict.fromkeys(x['method'] for x in methods).keys()):>40}" + f" {access : <55}: {' '.join(dict.fromkeys(x['method'] for x in methods).keys()):>40}" ) else: print(" No access") -
[docs]class DownloadManager: - """ +
+[docs] +class DownloadManager: + """ Class to assist in downloading a list of Downloadable object which at a minimum is a json manifest of DRS object ids. The methods of interest are download and user_access. """ @@ -839,7 +861,7 @@

Source code for gen3.tools.download.drs_download

download_list: List[Downloadable], show_progress: bool = False, ): - """ + """ Initialize the DownloadManager so that is ready to start downloading. Note the downloadable objects are required so that all tokens are available to support the download. @@ -867,8 +889,10 @@

Source code for gen3.tools.download.drs_download

self.download_list = download_list self.resolve_objects(self.download_list, show_progress) -
[docs] def resolve_objects(self, object_list: List[Downloadable], show_progress: bool): - """ +
+[docs] + def resolve_objects(self, object_list: List[Downloadable], show_progress: bool): + """ Given an Downloadable object list, resolve the DRS hostnames and update each Downloadable Args: @@ -890,8 +914,11 @@

Source code for gen3.tools.download.drs_download

entry._manager = self progress_bar.update(1)
-
[docs] def cache_hosts_wts_tokens(self, object_list): - """ + +
+[docs] + def cache_hosts_wts_tokens(self, object_list): + """ Using the list of DRS host obtain a WTS token for all DRS hosts in the list. It's is possible """ # create two sets: one of the know WTS host and the other of the host in the manifest @@ -925,8 +952,11 @@

Source code for gen3.tools.download.drs_download

f"Could not retrieve a token for {drs_hostname}: it is not available as a WTS endpoint." )
-
[docs] def get_fresh_token(self, drs_hostname: str) -> Optional[str]: - """Will return and/or refresh and return a WTS token if hostname is known otherwise returns None. + +
+[docs] + def get_fresh_token(self, drs_hostname: str) -> Optional[str]: + """Will return and/or refresh and return a WTS token if hostname is known otherwise returns None. Args: drs_hostname (str): hostname to get token for @@ -948,7 +978,10 @@

Source code for gen3.tools.download.drs_download

return None
-
[docs] def download( + +
+[docs] + def download( self, object_list: List[Downloadable], save_directory: str = ".", @@ -956,7 +989,7 @@

Source code for gen3.tools.download.drs_download

unpack_packages: bool = True, delete_unpacked_packages: bool = False, ) -> Dict[str, Any]: - """ + """ Downloads objects to the directory or current working directory. The input is an list of Downloadable object created by loading a manifest using the Manifest class or a call to Manifest.load(... @@ -1084,14 +1117,23 @@

Source code for gen3.tools.download.drs_download

if delete_unpacked_packages: filepath.unlink() - - completed[entry.object_id].status = "downloaded" if res else "error" + if res: + completed[entry.object_id].status = "downloaded" + logger.debug( + f"object {entry.object_id} has been successfully downloaded." + ) + else: + completed[entry.object_id].status = "error" + logger.debug(f"object {entry.object_id} has failed to be downloaded.") completed[entry.object_id].end_time = datetime.now(timezone.utc) return completed
-
[docs] def user_access(self): - """ + +
+[docs] + def user_access(self): + """ List the user's access permissions on each host needed to download DRS objects in the manifest. A useful way to determine if access permissions are one reason a download failed. @@ -1111,7 +1153,9 @@

Source code for gen3.tools.download.drs_download

authz = get_user_auth(hostname, access_token) results[hostname] = authz - return results
+ return results
+
+ def _download( @@ -1123,7 +1167,7 @@

Source code for gen3.tools.download.drs_download

unpack_packages=True, delete_unpacked_packages=False, ) -> Optional[Dict[str, Any]]: - """ + """ A convenience function used to download a json manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1167,18 +1211,18 @@

Source code for gen3.tools.download.drs_download

def _download_obj( hostname, auth, - object_id, + object_ids, output_dir=".", show_progress=False, unpack_packages=True, delete_unpacked_packages=False, ) -> Optional[Dict[str, Any]]: - """ + """ A convenience function used to download a single DRS object. Args: hostname (str): hostname of Gen3 commons to use for access and WTS auth: Gen3 Auth instance - object_id (str): DRS object id + object_ids (List[str]): DRS object id output_dir: directory to save downloaded files to show_progress: show progress bar unpack_packages (bool): set to False to disable the unpacking of downloaded packages @@ -1193,7 +1237,7 @@

Source code for gen3.tools.download.drs_download

logger.critical(f"Unable to authenticate your credentials with {hostname}") return None - object_list = [Downloadable(object_id=object_id)] + object_list = [Downloadable(object_id=object_id) for object_id in object_ids] downloader = DownloadManager( hostname=hostname, auth=auth, @@ -1212,7 +1256,7 @@

Source code for gen3.tools.download.drs_download

def _listfiles(hostname, auth, infile: str) -> bool: - """ + """ A wrapper function used by the cli to list files in a manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1248,7 +1292,7 @@

Source code for gen3.tools.download.drs_download

def _list_object(hostname, auth, object_id: str) -> bool: - """ + """ Lists a DRS object. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1281,7 +1325,7 @@

Source code for gen3.tools.download.drs_download

def _list_access(hostname, auth, infile: str) -> bool: - """ + """ A convenience function to list a users access for all DRS hostname in a manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1317,8 +1361,10 @@

Source code for gen3.tools.download.drs_download

# These functions are exposed to the SDK's cli under the drs-pull subcommand -
[docs]def list_files_in_drs_manifest(hostname, auth, infile: str) -> bool: - """ +
+[docs] +def list_files_in_drs_manifest(hostname, auth, infile: str) -> bool: + """ A wrapper function used by the cli to list files in a manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1331,8 +1377,11 @@

Source code for gen3.tools.download.drs_download

return _listfiles(hostname, auth, infile)
-
[docs]def list_drs_object(hostname, auth, object_id: str) -> bool: - """ + +
+[docs] +def list_drs_object(hostname, auth, object_id: str) -> bool: + """ A convenience function used to list a DRS object. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1345,7 +1394,10 @@

Source code for gen3.tools.download.drs_download

return _list_object(hostname, auth, object_id) # pragma: no cover
-
[docs]def download_files_in_drs_manifest( + +
+[docs] +def download_files_in_drs_manifest( hostname, auth, infile, @@ -1354,7 +1406,7 @@

Source code for gen3.tools.download.drs_download

unpack_packages=True, delete_unpacked_packages=False, ) -> None: - """ + """ A convenience function used to download a json manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1377,21 +1429,22 @@

Source code for gen3.tools.download.drs_download

)
-
[docs]def download_drs_object( + +def download_drs_objects( hostname, auth, - object_id, + object_ids, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False, ) -> None: - """ + """ A convenience function used to download a single DRS object. Args: hostname (str): hostname of Gen3 commons to use for access and WTS auth: Gen3 Auth instance - object_id (str): DRS object id + object_ids (List[str]): DRS object ids output_dir: directory to save downloaded files to unpack_packages (bool): set to False to disable the unpacking of downloaded packages delete_unpacked_packages (bool): set to True to delete package files after unpacking them @@ -1399,19 +1452,21 @@

Source code for gen3.tools.download.drs_download

Returns: List of DownloadStatus objects for the DRS object """ - _download_obj( + return _download_obj( hostname, auth, - object_id, + object_ids, output_dir, show_progress, unpack_packages, delete_unpacked_packages, - )
+ ) -
[docs]def list_access_in_drs_manifest(hostname, auth, infile) -> bool: - """ +
+[docs] +def list_access_in_drs_manifest(hostname, auth, infile) -> bool: + """ A convenience function to list a users access for all DRS hostname in a manifest. Args: hostname (str): hostname of Gen3 commons to use for access and WTS @@ -1422,6 +1477,7 @@

Source code for gen3.tools.download.drs_download

True if successfully listed """ return _list_access(hostname, auth, infile)
+
diff --git a/docs/_build/html/_modules/gen3/tools/indexing/download_manifest.html b/docs/_build/html/_modules/gen3/tools/indexing/download_manifest.html index 5ba72bbe9..35603584f 100644 --- a/docs/_build/html/_modules/gen3/tools/indexing/download_manifest.html +++ b/docs/_build/html/_modules/gen3/tools/indexing/download_manifest.html @@ -1,18 +1,15 @@ - - + gen3.tools.indexing.download_manifest — Gen3 SDK documentation - - - - - - - + + + + + @@ -92,14 +89,17 @@

Source code for gen3.tools.indexing.download_manifest

logging = get_logger("__name__") -
[docs]async def async_download_object_manifest( +
+[docs] +async def async_download_object_manifest( commons_url, output_filename="object-manifest.csv", num_processes=4, max_concurrent_requests=MAX_CONCURRENT_REQUESTS, input_manifest=None, + python_subprocess_command="python", ): - """ + """ Download all file object records into a manifest csv Args: @@ -113,6 +113,10 @@

Source code for gen3.tools.indexing.download_manifest

input_manifest (str): Input file. Read available object data from objects in this file instead of reading everything in indexd. This will attempt to query indexd for only the records identified in this manifest. + python_subprocess_command (str, optional): Command used to execute a + python process. By default you should not need to change this, but + if you are running something like MacOS and only installed Python 3.x + you may need to specify "python3". """ start_time = time.perf_counter() logging.info(f"start time: {start_time}") @@ -142,6 +146,7 @@

Source code for gen3.tools.indexing.download_manifest

num_processes, max_concurrent_requests, input_manifest, + python_subprocess_command, ) end_time = time.perf_counter() @@ -149,10 +154,16 @@

Source code for gen3.tools.indexing.download_manifest

logging.info(f"run time: {end_time-start_time}")
+ async def _write_all_index_records_to_file( - commons_url, output_filename, num_processes, max_concurrent_requests, input_manifest + commons_url, + output_filename, + num_processes, + max_concurrent_requests, + input_manifest, + python_subprocess_command, ): - """ + """ Spins up number of processes provided to parse indexd records and eventually write to a single output file manifest. @@ -223,7 +234,6 @@

Source code for gen3.tools.indexing.download_manifest

input_record_chunks = ( "|||".join(map(json.dumps, record_chunks[x])) if record_chunks else "|||" ) - print(input_record_chunks) # write record_checksum chunks to temporary files since the size can overload # command line arguments @@ -236,7 +246,7 @@

Source code for gen3.tools.indexing.download_manifest

# call the cli function below and pass in chunks of pages for each process command = ( - f"python {CURRENT_DIR}/download_manifest.py --commons_url " + f"{python_subprocess_command} {CURRENT_DIR}/download_manifest.py --commons_url " f"{commons_url} --pages {pages} --input-record-chunks-file {input_records_chunk_filename} " f"--num_processes {num_processes} --max_concurrent_requests {max_concurrent_requests}" ) @@ -304,7 +314,7 @@

Source code for gen3.tools.indexing.download_manifest

def write_page_records_to_files( commons_url, pages, input_record_chunks_file, num_processes, max_concurrent_requests ): - """ + """ Command line interface function for requesting a number of records from indexd and writing to a file in that process. num_processes is only used to calculate how many open connections this process should request. @@ -370,7 +380,7 @@

Source code for gen3.tools.indexing.download_manifest

async def _get_records_and_write_to_file( commons_url, pages, input_record_chunks, num_processes, max_concurrent_requests ): - """ + """ Getting indexd records and writing to a file. This function creates semaphores to limit the number of concurrent http connections that get opened to send requests to indexd. @@ -419,7 +429,7 @@

Source code for gen3.tools.indexing.download_manifest

async def _put_records_from_input_manifest_in_queue( input_record, commons_url, lock, queue ): - """ + """ Gets a semaphore then requests records for the given input_record and puts them in a queue. @@ -451,7 +461,7 @@

Source code for gen3.tools.indexing.download_manifest

async def _put_records_from_page_in_queue(page, commons_url, lock, queue): - """ + """ Gets a semaphore then requests records for the given page and puts them in a queue. @@ -476,7 +486,7 @@

Source code for gen3.tools.indexing.download_manifest

async def _parse_from_queue(queue): - """ + """ Read from the queue and write to a file Args: diff --git a/docs/_build/html/_modules/gen3/tools/indexing/verify_manifest.html b/docs/_build/html/_modules/gen3/tools/indexing/verify_manifest.html index 1e558f10e..4e0c24db9 100644 --- a/docs/_build/html/_modules/gen3/tools/indexing/verify_manifest.html +++ b/docs/_build/html/_modules/gen3/tools/indexing/verify_manifest.html @@ -1,18 +1,15 @@ - - + gen3.tools.indexing.verify_manifest — Gen3 SDK documentation - - - - - - - + + + + + @@ -91,7 +88,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_guid_from_row(row): - """ + """ Given a row from the manifest, return the field representing expected indexd guid. Args: @@ -107,7 +104,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_md5_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's md5 sum. Args: @@ -125,7 +122,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_file_size_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's size in bytes. Args: @@ -147,7 +144,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_acl_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's expected acls. Args: @@ -160,7 +157,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_authz_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's expected authz resources. @@ -174,7 +171,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_urls_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's expected urls. Args: @@ -192,7 +189,7 @@

Source code for gen3.tools.indexing.verify_manifest

def _get_file_name_from_row(row): - """ + """ Given a row from the manifest, return the field representing file's expected file_name. Args: @@ -222,7 +219,9 @@

Source code for gen3.tools.indexing.verify_manifest

} -
[docs]async def async_verify_object_manifest( +
+[docs] +async def async_verify_object_manifest( commons_url, manifest_file, max_concurrent_requests=MAX_CONCURRENT_REQUESTS, @@ -230,7 +229,7 @@

Source code for gen3.tools.indexing.verify_manifest

manifest_file_delimiter=None, output_filename=f"verify-manifest-errors-{time.time()}.log", ): - """ + """ Verify all file object records into a manifest csv Args: @@ -268,6 +267,7 @@

Source code for gen3.tools.indexing.verify_manifest

logging.info(f"run time: {end_time-start_time}")
+ async def _verify_all_index_records_in_file( commons_url, manifest_file, @@ -275,7 +275,7 @@

Source code for gen3.tools.indexing.verify_manifest

max_concurrent_requests, output_filename, ): - """ + """ Getting indexd records and writing to a file. This function creates semaphores to limit the number of concurrent http connections that get opened to send requests to indexd. @@ -347,7 +347,7 @@

Source code for gen3.tools.indexing.verify_manifest

async def _parse_from_queue(queue, lock, commons_url, output_queue): - """ + """ Keep getting items from the queue and verifying that indexd contains the expected fields from that row. If there are any issues, log errors into a file. Return when nothing is left in the queue. @@ -440,7 +440,7 @@

Source code for gen3.tools.indexing.verify_manifest

async def _get_record_from_indexd(guid, commons_url, lock): - """ + """ Gets a semaphore then requests a record for the given guid Args: diff --git a/docs/_build/html/_modules/gen3/tools/metadata/ingest_manifest.html b/docs/_build/html/_modules/gen3/tools/metadata/ingest_manifest.html index 1ab232de1..acde7b065 100644 --- a/docs/_build/html/_modules/gen3/tools/metadata/ingest_manifest.html +++ b/docs/_build/html/_modules/gen3/tools/metadata/ingest_manifest.html @@ -1,18 +1,15 @@ - - + gen3.tools.metadata.ingest_manifest — Gen3 SDK documentation - - - - - - - + + + + + @@ -78,7 +75,7 @@

Source code for gen3.tools.metadata.ingest_manifest

def _get_guid_for_row(commons_url, row, lock): - """ + """ Given a row from the manifest, return the guid to use for the metadata object. Args: @@ -96,7 +93,7 @@

Source code for gen3.tools.metadata.ingest_manifest

async def _query_for_associated_indexd_record_guid( commons_url, row, lock, output_queue ): - """ + """ Given a row from the manifest, return the guid for the related indexd record. By default attempts to use a column "submitted_sample_id" to pattern match @@ -176,7 +173,9 @@

Source code for gen3.tools.metadata.ingest_manifest

} -
[docs]async def async_ingest_metadata_manifest( +
+[docs] +async def async_ingest_metadata_manifest( commons_url, manifest_file, metadata_source, @@ -188,7 +187,7 @@

Source code for gen3.tools.metadata.ingest_manifest

get_guid_from_file=True, metadata_type=None, ): - """ + """ Ingest all metadata records into a manifest csv Args: @@ -232,6 +231,7 @@

Source code for gen3.tools.metadata.ingest_manifest

)
+ async def _ingest_all_metadata_in_file( commons_url, manifest_file, @@ -243,7 +243,7 @@

Source code for gen3.tools.metadata.ingest_manifest

get_guid_from_file, metadata_type, ): - """ + """ Ingest metadata from file into metadata service. This function creates semaphores to limit the number of concurrent http connections that get opened to send requests to mds. @@ -357,7 +357,7 @@

Source code for gen3.tools.metadata.ingest_manifest

metadata_source, metadata_type, ): - """ + """ Keep getting items from the queue and checking if indexd contains a record with that guid. Then create/update metadta for that GUID in the metadata service. Also log to output queue. Return when nothing is left in the queue. @@ -457,7 +457,7 @@

Source code for gen3.tools.metadata.ingest_manifest

async def _create_metadata(guid, metadata, auth, commons_url, lock): - """ + """ Gets a semaphore then creates metadata for guid Args: @@ -480,7 +480,7 @@

Source code for gen3.tools.metadata.ingest_manifest

async def _update_metadata(guid, metadata, auth, commons_url, lock): - """ + """ Gets a semaphore then updates metadata for guid Args: @@ -503,7 +503,7 @@

Source code for gen3.tools.metadata.ingest_manifest

async def _is_indexed_file_object(guid, commons_url, lock): - """ + """ Gets a semaphore then requests a record for the given guid Args: @@ -528,8 +528,10 @@

Source code for gen3.tools.metadata.ingest_manifest

return bool(record) -
[docs]async def async_query_urls_from_indexd(pattern, commons_url, lock): - """ +
+[docs] +async def async_query_urls_from_indexd(pattern, commons_url, lock): + """ Gets a semaphore then requests a record for the given pattern Args: @@ -548,8 +550,9 @@

Source code for gen3.tools.metadata.ingest_manifest

return await index.async_query_urls(pattern, _ssl=ssl)
+ async def _get_with_params_from_indexd(params, commons_url, lock): - """ + """ Gets a semaphore then requests a record for the given params Args: diff --git a/docs/_build/html/_modules/gen3/wss.html b/docs/_build/html/_modules/gen3/wss.html index ce2bd5e91..9e3b61579 100644 --- a/docs/_build/html/_modules/gen3/wss.html +++ b/docs/_build/html/_modules/gen3/wss.html @@ -1,18 +1,15 @@ - - + gen3.wss — Gen3 SDK documentation - - - - - - - + + + + + @@ -50,7 +47,7 @@

Source code for gen3.wss

 
 
 def wsurl_to_tokens(ws_urlstr):
-    """Tokenize ws:/// paths - so ws:///@user/bla/foo returns ("@user", "bla/foo")"""
+    """Tokenize ws:/// paths - so ws:///@user/bla/foo returns ("@user", "bla/foo")"""
     urlparts = urlparse(ws_urlstr)
     if urlparts.scheme != "ws":
         raise Exception("invalid path {}".format(ws_urlstr))
@@ -62,7 +59,7 @@ 

Source code for gen3.wss

 
 @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS)
 def get_url(urlstr, dest_path):
-    """Simple url fetch to dest_path with backoff"""
+    """Simple url fetch to dest_path with backoff"""
     res = requests.get(urlstr)
     raise_for_status_and_print_error(res)
     if dest_path == "-":
@@ -74,14 +71,16 @@ 

Source code for gen3.wss

 
 @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS)
 def put_url(urlstr, src_path):
-    """Simple put src_path to url with backoff"""
+    """Simple put src_path to url with backoff"""
     with open(src_path, "rb") as f:
         res = requests.put(urlstr, data=f)
     raise_for_status_and_print_error(res)
 
 
-
[docs]class Gen3WsStorage: - """A class for interacting with the Gen3 workspace storage service. +
+[docs] +class Gen3WsStorage: + """A class for interacting with the Gen3 workspace storage service. Examples: This generates the Gen3WsStorage class pointed at the sandbox commons while @@ -92,7 +91,7 @@

Source code for gen3.wss

     """
 
     def __init__(self, auth_provider=None):
-        """
+        """
         Initialization for instance of the class to setup basic endpoint info.
 
         Args:
@@ -101,9 +100,11 @@ 

Source code for gen3.wss

         """
         self._auth_provider = auth_provider
 
-
[docs] @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) +
+[docs] + @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) def upload_url(self, ws, wskey): - """ + """ Get a upload url for the given workspace key Args: @@ -115,17 +116,23 @@

Source code for gen3.wss

         raise_for_status_and_print_error(res)
         return res.json()
-
[docs] @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) def upload(self, src_path, dest_ws, dest_wskey): - """ + """ Upload a local file to the specified workspace path """ url = self.upload_url(dest_ws, dest_wskey)["Data"] put_url(url, src_path)
-
[docs] @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) def download_url(self, ws, wskey): - """ + """ Get a download url for the given workspace key Args: @@ -137,8 +144,11 @@

Source code for gen3.wss

         raise_for_status_and_print_error(res)
         return res.json()
-
[docs] def download(self, src_ws, src_wskey, dest_path): - """ + +
+[docs] + def download(self, src_ws, src_wskey, dest_path): + """ Download a file from the workspace to local disk Args: @@ -149,8 +159,11 @@

Source code for gen3.wss

         durl = self.download_url(src_ws, src_wskey)["Data"]
         get_url(durl, dest_path)
-
[docs] def copy(self, src_urlstr, dest_urlstr): - """ + +
+[docs] + def copy(self, src_urlstr, dest_urlstr): + """ Parse src_urlstr and dest_urlstr, and call upload or download as appropriate """ @@ -166,9 +179,12 @@

Source code for gen3.wss

             return self.upload(src_urlstr, pathparts[0], pathparts[1])
         raise Exception("source and destination may not both be local")
-
[docs] @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) def ls(self, ws, wskey): - """ + """ List the contents under the given workspace path Args: @@ -180,8 +196,11 @@

Source code for gen3.wss

         raise_for_status_and_print_error(res)
         return res.json()
-
[docs] def ls_path(self, ws_urlstr): - """ + +
+[docs] + def ls_path(self, ws_urlstr): + """ Same as ls - but parses ws_urlstr argument of form: ws:///workspace/key @@ -192,9 +211,12 @@

Source code for gen3.wss

         pathparts = wsurl_to_tokens(ws_urlstr)
         return self.ls(pathparts[0], pathparts[1])
-
[docs] @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) + +
+[docs] + @backoff.on_exception(backoff.expo, requests.HTTPError, **DEFAULT_BACKOFF_SETTINGS) def rm(self, ws, wskey): - """ + """ Remove the given workspace key Args: @@ -208,12 +230,17 @@

Source code for gen3.wss

         raise_for_status_and_print_error(res)
         return res.json()
-
[docs] def rm_path(self, ws_urlstr): - """ + +
+[docs] + def rm_path(self, ws_urlstr): + """ Same as rm - but parses the ws_urlstr argument """ pathparts = wsurl_to_tokens(ws_urlstr) - return self.rm(pathparts[0], pathparts[1])
+ return self.rm(pathparts[0], pathparts[1])
+
+
diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html index 32443099f..cd40db8b0 100644 --- a/docs/_build/html/_modules/index.html +++ b/docs/_build/html/_modules/index.html @@ -1,18 +1,15 @@ - - + Overview: module code — Gen3 SDK documentation - - - - - - - + + + + + diff --git a/docs/_build/html/_static/alabaster.css b/docs/_build/html/_static/alabaster.css index 0eddaeb07..517d0b29c 100644 --- a/docs/_build/html/_static/alabaster.css +++ b/docs/_build/html/_static/alabaster.css @@ -419,7 +419,9 @@ table.footnote td { } dl { - margin: 0; + margin-left: 0; + margin-right: 0; + margin-top: 0; padding: 0; } diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css index 4e9a9f1fa..30fee9d0f 100644 --- a/docs/_build/html/_static/basic.css +++ b/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -324,6 +328,7 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } + nav.contents, aside.topic, div.admonition, div.topic, blockquote { @@ -331,6 +336,7 @@ div.admonition, div.topic, blockquote { } /* -- topics ---------------------------------------------------------------- */ + nav.contents, aside.topic, div.topic { @@ -606,6 +612,7 @@ ol.simple p, ul.simple p { margin-bottom: 0; } + aside.footnote > span, div.citation > span { float: left; @@ -667,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -735,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js index c3db08d1c..d06a71d75 100644 --- a/docs/_build/html/_static/doctools.js +++ b/docs/_build/html/_static/doctools.js @@ -4,12 +4,19 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ "use strict"; +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + const _ready = (callback) => { if (document.readyState !== "loading") { callback(); @@ -18,73 +25,11 @@ const _ready = (callback) => { } }; -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - /** * Small JavaScript module for the documentation. */ const Documentation = { init: () => { - Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, @@ -126,51 +71,6 @@ const Documentation = { Documentation.LOCALE = catalog.locale; }, - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - /** * helper function to focus on search bar */ @@ -210,15 +110,11 @@ const Documentation = { ) return; - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; if (!event.shiftKey) { switch (event.key) { @@ -240,10 +136,6 @@ const Documentation = { event.preventDefault(); } break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); } } diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js index b57ae3b83..7e4c114f2 100644 --- a/docs/_build/html/_static/documentation_options.js +++ b/docs/_build/html/_static/documentation_options.js @@ -1,5 +1,4 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), +const DOCUMENTATION_OPTIONS = { VERSION: '', LANGUAGE: 'en', COLLAPSE_INDEX: false, diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js index 2e22b06ab..250f5665f 100644 --- a/docs/_build/html/_static/language_data.js +++ b/docs/_build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css index 9abe04ba5..57c7df37b 100644 --- a/docs/_build/html/_static/pygments.css +++ b/docs/_build/html/_static/pygments.css @@ -22,6 +22,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ .highlight .gd { color: #a40000 } /* Generic.Deleted */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ .highlight .gr { color: #ef2929 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js index f2fb7d5cf..7918c3fab 100644 --- a/docs/_build/html/_static/searchtools.js +++ b/docs/_build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -57,14 +57,14 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, highlightTerms, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); let requestUrl; @@ -75,29 +75,35 @@ const _displayItem = (item, highlightTerms, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } - const params = new URLSearchParams(); - params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + "?" + params.toString() + anchor; + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, highlightTerms) + Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -116,15 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, + searchTerms, highlightTerms, - searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), highlightTerms, searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -237,6 +243,12 @@ const Search = { * execute search (requires search index to be loaded) */ query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -264,6 +276,10 @@ const Search = { } }); + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + // console.debug("SEARCH: searching for:"); // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); @@ -272,6 +288,40 @@ const Search = { let results = []; _removeChildren(document.getElementById("search-progress")); + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + // lookup as object objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) @@ -318,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, highlightTerms, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** @@ -399,8 +449,8 @@ const Search = { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; - const docNames = Search._index.docnames; const filenames = Search._index.filenames; + const docNames = Search._index.docnames; const titles = Search._index.titles; const scoreMap = new Map(); @@ -497,11 +547,9 @@ const Search = { /** * helper function to return a node containing the * search summary for a given text. keywords is a list - * of stemmed words, highlightWords is the list of normal, unstemmed - * words. the first one is used to find the occurrence, the - * latter for highlighting it. + * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, highlightWords) => { + makeSearchSummary: (htmlText, keywords) => { const text = Search.htmlToText(htmlText); if (text === "") return null; @@ -519,10 +567,6 @@ const Search = { summary.classList.add("context"); summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; - highlightWords.forEach((highlightWord) => - _highlightText(summary, highlightWord, "highlighted") - ); - return summary; }, }; diff --git a/docs/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/docs/_build/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/_build/html/auth.html b/docs/_build/html/auth.html index 0e032cf29..281b7bcb0 100644 --- a/docs/_build/html/auth.html +++ b/docs/_build/html/auth.html @@ -1,19 +1,16 @@ - - + - + Gen3 Auth Helper — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
-

Gen3 Auth Helper

+

Gen3 Auth Helper

-class gen3.auth.Gen3Auth(endpoint=None, refresh_file=None, refresh_token=None, idp=None)[source]
+class gen3.auth.Gen3Auth(endpoint=None, refresh_file=None, refresh_token=None, idp=None, client_credentials=None, client_scopes=None)[source]

Bases: AuthBase

Gen3 auth helper class for use with requests auth.

Implements requests.auth.AuthBase in order to support JWT authentication. @@ -55,6 +52,10 @@

Gen3 Auth Helper
>>> auth = Gen3Auth(
+    endpoint="https://datacommons.example",
+    client_credentials=("client ID", os.environ["GEN3_OIDC_CLIENT_CREDS_SECRET"])
+)
+
+

If working in a Gen3 Workspace, initialize as follows:

>>> auth = Gen3Auth()
 
-curl(path, request=None, data=None)[source]
+curl(path, request=None, data=None)[source]

Curl the given endpoint - ex: gen3 curl /user/user. Return requests.Response

Parameters:
@@ -97,20 +107,20 @@

Gen3 Auth Helper
-get_access_token(endpoint=None)[source]
+get_access_token()[source]

Get the access token - auto refresh if within 5 minutes of expiration

-get_access_token_from_wts(endpoint=None)[source]
+get_access_token_from_wts(endpoint=None)[source]

Try to fetch an access token for the given idp from the wts in the given namespace. If idp is not set, then default to “local”

-refresh_access_token(endpoint=None)[source]
+refresh_access_token(endpoint=None)[source]

Get a new access token

@@ -143,7 +153,16 @@

Gen3 SDK

Navigation

    -
  • Gen3 Auth Helper
  • +
  • Gen3 Auth Helper +
  • Gen3 File Class
  • Gen3 Index Class
  • Gen3 Jobs Class
  • diff --git a/docs/_build/html/file.html b/docs/_build/html/file.html index 2e2b24a3e..931280b8a 100644 --- a/docs/_build/html/file.html +++ b/docs/_build/html/file.html @@ -1,19 +1,16 @@ - - + - + Gen3 File Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
    -

    Gen3 File Class

    +

    Gen3 File Class

    -class gen3.file.Gen3File(endpoint=None, auth_provider=None)[source]
    +class gen3.file.Gen3File(endpoint=None, auth_provider=None)[source]

    Bases: object

    For interacting with Gen3 file management features.

    A class for interacting with the Gen3 file download services. @@ -57,7 +54,7 @@

    Gen3 File Class
    -delete_file(guid)[source]
    +delete_file(guid)[source]

    This method is DEPRECATED. Use delete_file_locations() instead. Delete all locations of a stored data file and remove its record from indexd

    @@ -75,7 +72,7 @@

    Gen3 File Class
    -delete_file_locations(guid)[source]
    +delete_file_locations(guid)[source]

    Delete all locations of a stored data file and remove its record from indexd

    Parameters:
    @@ -90,9 +87,23 @@

    Gen3 File Class +
    +download_single(object_id, path)[source]
    +

    Download a single file using its GUID.

    +
    +
    Parameters:
    +
      +
    • object_id (str) – The file’s unique ID

    • +
    • path (str) – Path to store the downloaded file at

    • +
    +
    +
    +

    +
    -get_presigned_url(guid, protocol=None)[source]
    +get_presigned_url(guid, protocol=None)[source]

    Generates a presigned URL for a file.

    Retrieves a presigned url for a file giving access to a file for a limited time.

    @@ -111,7 +122,7 @@

    Gen3 File Class
    -upload_file(file_name, authz=None, protocol=None, expires_in=None)[source]
    +upload_file(file_name, authz=None, protocol=None, expires_in=None, bucket=None)[source]

    Get a presigned url for a file to upload

    Parameters:
    @@ -123,6 +134,36 @@

    Gen3 File ClassReturns: +

    json representation for the file upload

    +
    +
    Return type:
    +

    Document

    +
    +

    +

    + +
    +
    +upload_file_to_guid(guid, file_name, protocol=None, expires_in=None, bucket=None)[source]
    +

    Get a presigned url for a file to upload to the specified existing GUID

    +
    +
    Parameters:
    +
      +
    • file_name (str) – file_name to use for upload

    • +
    • protocol (str) – Storage protocol to use for upload: “s3”, “az”. +If this isn’t set, the default will be “s3”

    • +
    • expires_in (int) – Amount in seconds that the signed url will expire from datetime.utcnow(). +Be sure to use a positive integer. +This value will also be treated as <= MAX_PRESIGNED_URL_TTL in the fence configuration.

    • +
    • bucket (str) – Bucket to upload to. The bucket must be configured in the Fence instance’s +ALLOWED_DATA_UPLOAD_BUCKETS setting. If not specified, Fence defaults to the +DATA_UPLOAD_BUCKET setting.

    Returns:
    @@ -164,7 +205,18 @@

    Gen3 SDK

    Navigation

      +
    • async_get_records_on_page() (gen3.index.Gen3Index method) +
    • async_get_with_params() (gen3.index.Gen3Index method)
    • async_ingest_metadata_manifest() (in module gen3.tools.metadata.ingest_manifest) @@ -98,6 +103,8 @@

      A

    • async_run_job_and_wait() (gen3.jobs.Gen3Jobs method)
    • async_update() (gen3.metadata.Gen3Metadata method) +
    • +
    • async_update_aliases() (gen3.metadata.Gen3Metadata method)
    • async_update_record() (gen3.index.Gen3Index method)
    • @@ -132,6 +139,8 @@

      C

    • copy() (gen3.wss.Gen3WsStorage method)
    • create() (gen3.metadata.Gen3Metadata method) +
    • +
    • create_aliases() (gen3.metadata.Gen3Metadata method)
    • create_blank() (gen3.index.Gen3Index method)
    • @@ -170,6 +179,10 @@

      D

      + -
      -
    • download_drs_object() (in module gen3.tools.download.drs_download) -
    • download_files_in_drs_manifest() (in module gen3.tools.download.drs_download) +
    • +
    • download_single() (gen3.file.Gen3File method)
    • download_url() (gen3.wss.Gen3WsStorage method)
    • @@ -330,15 +343,17 @@

      G

    • get_access_token() (gen3.auth.Gen3Auth method)
    • get_access_token_from_wts() (gen3.auth.Gen3Auth method) +
    • +
    • get_aliases() (gen3.metadata.Gen3Metadata method)
    • get_all_records() (gen3.index.Gen3Index method)
    • get_dictionary_all() (gen3.submission.Gen3Submission method) -
    • -
    • get_dictionary_node() (gen3.submission.Gen3Submission method)
      • +
      • get_dictionary_node() (gen3.submission.Gen3Submission method) +
      • get_fresh_token() (gen3.tools.download.drs_download.DownloadManager method)
      • get_graphql_schema() (gen3.submission.Gen3Submission method) @@ -593,6 +608,8 @@

        U

        • update() (gen3.metadata.Gen3Metadata method) +
        • +
        • update_aliases() (gen3.metadata.Gen3Metadata method)
        • update_blank() (gen3.index.Gen3Index method)
        • @@ -605,6 +622,8 @@

          U

        • upload() (gen3.wss.Gen3WsStorage method)
        • upload_file() (gen3.file.Gen3File method) +
        • +
        • upload_file_to_guid() (gen3.file.Gen3File method)
        • upload_url() (gen3.wss.Gen3WsStorage method)
        • diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 80896e93f..bf4d4bba6 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -1,19 +1,16 @@ - - + - + Welcome to Gen3 SDK’s documentation! — Gen3 SDK documentation - - - - - - - + + + + + @@ -34,39 +31,269 @@
          -

          Welcome to Gen3 SDK’s documentation!

          +

          Welcome to Gen3 SDK’s documentation!

          The README in the Gen3 Python SDK Github Repo contains installation and setup information along with some quickstart scripts. This contains more detailed documentation about the various classes and functions available.

          This documentation is mostly auto-generated from the docstrings within the source code.

          -

          Indices and tables

          +

          Indices and tables

          • Index

          • Module Index

          • diff --git a/docs/_build/html/indexing.html b/docs/_build/html/indexing.html index dbe06dcd6..23de15507 100644 --- a/docs/_build/html/indexing.html +++ b/docs/_build/html/indexing.html @@ -1,19 +1,16 @@ - - + - + Gen3 Index Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
            -

            Gen3 Index Class

            +

            Gen3 Index Class

            -class gen3.index.Gen3Index(endpoint=None, auth_provider=None, service_location='index')[source]
            +class gen3.index.Gen3Index(endpoint=None, auth_provider=None, service_location='index')[source]

            Bases: object

            A class for interacting with the Gen3 Index services.

            @@ -58,7 +55,7 @@

            Gen3 Index Class
            -async async_create_record(hashes, size, did=None, urls=None, file_name=None, metadata=None, baseid=None, acl=None, urls_metadata=None, version=None, authz=None, _ssl=None)[source]
            +async async_create_record(hashes, size, did=None, urls=None, file_name=None, metadata=None, baseid=None, acl=None, urls_metadata=None, version=None, authz=None, _ssl=None)[source]

            Asynchronous function to create a record in indexd.

            Parameters:
            @@ -88,7 +85,7 @@

            Gen3 Index Class
            -async async_get_record(guid=None, _ssl=None)[source]
            +async async_get_record(guid=None, _ssl=None)[source]

            Asynchronous function to request a record from indexd.

            Parameters:
            @@ -105,7 +102,7 @@

            Gen3 Index Class
            -async async_get_records_from_checksum(checksum, checksum_type='md5', _ssl=None)[source]
            +async async_get_records_from_checksum(checksum, checksum_type='md5', _ssl=None)[source]

            Asynchronous function to request records from indexd matching checksum.

            Parameters:
            @@ -125,7 +122,7 @@

            Gen3 Index Class
            -async async_get_records_on_page(limit=None, page=None, _ssl=None)[source]
            +async async_get_records_on_page(limit=None, page=None, _ssl=None)[source]

            Asynchronous function to request a page from indexd.

            Parameters:
            @@ -142,7 +139,7 @@

            Gen3 Index Class
            -async async_get_with_params(params, _ssl=None)[source]
            +async async_get_with_params(params, _ssl=None)[source]

            Return a document object corresponding to the supplied parameter

            • need to include all the hashes in the request

            • @@ -166,7 +163,7 @@

              Gen3 Index Class
              -async async_query_urls(pattern, _ssl=None)[source]
              +async async_query_urls(pattern, _ssl=None)[source]

              Asynchronous function to query urls from indexd.

              Parameters:
              @@ -183,7 +180,7 @@

              Gen3 Index Class
              -async async_update_record(guid, file_name=None, urls=None, version=None, metadata=None, acl=None, authz=None, urls_metadata=None)[source]
              +async async_update_record(guid, file_name=None, urls=None, version=None, metadata=None, acl=None, authz=None, urls_metadata=None, _ssl=None, **kwargs)[source]

              Asynchronous function to update a record in indexd.

              Parameters:
              @@ -200,7 +197,7 @@

              Gen3 Index Class
              -create_blank(uploader, file_name=None)[source]
              +create_blank(uploader, file_name=None)[source]

              Create a blank record

              Parameters:
              @@ -216,7 +213,7 @@

              Gen3 Index Class
              -create_new_version(guid, hashes, size, did=None, urls=None, file_name=None, metadata=None, acl=None, urls_metadata=None, version=None, authz=None)[source]
              +create_new_version(guid, hashes, size, did=None, urls=None, file_name=None, metadata=None, acl=None, urls_metadata=None, version=None, authz=None)[source]

              Add new version for the document associated to the provided uuid

              Since data content is immutable, when you want to change the size or hash, a new index document with a new uuid needs to be @@ -248,7 +245,7 @@

              Gen3 Index Class
              -create_record(hashes, size, did=None, urls=None, file_name=None, metadata=None, baseid=None, acl=None, urls_metadata=None, version=None, authz=None)[source]
              +create_record(hashes, size, did=None, urls=None, file_name=None, metadata=None, baseid=None, acl=None, urls_metadata=None, version=None, authz=None)[source]

              Create a new record and add it to the index

              Parameters:
              @@ -278,7 +275,7 @@

              Gen3 Index Class
              -delete_record(guid)[source]
              +delete_record(guid)[source]

              Delete an entry from the index

              Parameters:
              @@ -291,7 +288,7 @@

              Gen3 Index Class
              -get(guid, dist_resolution=True)[source]
              +get(guid, dist_resolution=True)[source]

              Get the metadata associated with the given id, alias, or distributed identifier

              @@ -308,13 +305,13 @@

              Gen3 Index Class
              -get_all_records(limit=None, paginate=False, start=None)[source]
              +get_all_records(limit=None, paginate=False, start=None)[source]

              Get a list of all records

              -get_guids_prefix()[source]
              +get_guids_prefix()[source]

              Get the prefix for GUIDs if there is one :returns: prefix for this instance :rtype: str

              @@ -322,7 +319,7 @@

              Gen3 Index Class
              -get_latest_version(guid, has_version=False)[source]
              +get_latest_version(guid, has_version=False)[source]

              Get the metadata of the latest index record version associated with the given id

              @@ -339,19 +336,19 @@

              Gen3 Index Class
              -get_record(guid)[source]
              +get_record(guid)[source]

              Get the metadata associated with a given id

              -get_record_doc(guid)[source]
              +get_record_doc(guid)[source]

              Get the metadata associated with a given id

              -get_records(dids)[source]
              +get_records(dids)[source]

              Get a list of documents given a list of dids

              Parameters:
              @@ -369,19 +366,19 @@

              Gen3 Index Class
              -get_records_on_page(limit=None, page=None)[source]
              +get_records_on_page(limit=None, page=None)[source]

              Get a list of all records given the page and page size limit

              -get_stats()[source]
              +get_stats()[source]

              Return basic info about the records in indexd

              -get_urls(size=None, hashes=None, guids=None)[source]
              +get_urls(size=None, hashes=None, guids=None)[source]

              Get a list of urls that match query params

              Parameters:
              @@ -399,7 +396,7 @@

              Gen3 Index Class
              -get_valid_guids(count=None)[source]
              +get_valid_guids(count=None)[source]

              Get a list of valid GUIDs without indexing :param count: number of GUIDs to request :type count: int

              @@ -415,13 +412,13 @@

              Gen3 Index Class
              -get_version()[source]
              +get_version()[source]

              Return the version of indexd

              -get_versions(guid)[source]
              +get_versions(guid)[source]

              Get the metadata of index record version associated with the given id

              @@ -434,7 +431,7 @@

              Gen3 Index Class
              -get_with_params(params=None)[source]
              +get_with_params(params=None)[source]

              Return a document object corresponding to the supplied parameters, such as {'hashes': {'md5': '...'}, 'size': '...', 'metadata': {'file_state': '...'}}.

              @@ -448,13 +445,13 @@

              Gen3 Index Class
              -is_healthy()[source]
              +is_healthy()[source]

              Return if indexd is healthy or not

              -query_urls(pattern)[source]
              +query_urls(pattern)[source]

              Query all record URLs for given pattern

              Parameters:
              @@ -471,7 +468,7 @@

              Gen3 Index Class
              -update_blank(guid, rev, hashes, size, urls=None, authz=None)[source]
              +update_blank(guid, rev, hashes, size, urls=None, authz=None)[source]

              Update only hashes and size for a blank index

              Parameters:
              @@ -488,7 +485,7 @@

              Gen3 Index Class
              -update_record(guid, file_name=None, urls=None, version=None, metadata=None, acl=None, authz=None, urls_metadata=None)[source]
              +update_record(guid, file_name=None, urls=None, version=None, metadata=None, acl=None, authz=None, urls_metadata=None)[source]

              Update an existing entry in the index

              Parameters:
              @@ -534,7 +531,41 @@

              Navigation

              • Gen3 Auth Helper
              • Gen3 File Class
              • -
              • Gen3 Index Class
              • +
              • Gen3 Index Class +
              • Gen3 Jobs Class
              • Gen3 Metadata Class
              • Gen3 Object Class
              • diff --git a/docs/_build/html/jobs.html b/docs/_build/html/jobs.html index 4a2f088d9..a2bd9bdfb 100644 --- a/docs/_build/html/jobs.html +++ b/docs/_build/html/jobs.html @@ -1,19 +1,16 @@ - - + - + Gen3 Jobs Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
                -

                Gen3 Jobs Class

                +

                Gen3 Jobs Class

                -class gen3.jobs.Gen3Jobs(endpoint=None, auth_provider=None, service_location='job')[source]
                +class gen3.jobs.Gen3Jobs(endpoint=None, auth_provider=None, service_location='job')[source]

                Bases: object

                A class for interacting with the Gen3’s Job Dispatching Service(s).

                Examples

                @@ -50,7 +47,7 @@

                Gen3 Jobs Class
                -async async_run_job_and_wait(job_name, job_input, _ssl=None, **kwargs)[source]
                +async async_run_job_and_wait(job_name, job_input, _ssl=None, **kwargs)[source]

                Asynchronous function to create a job, wait for output, and return. Will sleep in a linear delay until the job is done, starting with 1 second.

                @@ -72,7 +69,7 @@

                Gen3 Jobs Class
                -create_job(job_name, job_input)[source]
                +create_job(job_name, job_input)[source]

                Create a job with given name and input

                Parameters:
                @@ -92,19 +89,19 @@

                Gen3 Jobs Class
                -get_output(job_id)[source]
                +get_output(job_id)[source]

                Get the output of a previously completed job

                -get_status(job_id)[source]
                +get_status(job_id)[source]

                Get the status of a previously created job

                -get_version()[source]
                +get_version()[source]

                Return the version

                Returns:
                @@ -118,7 +115,7 @@

                Gen3 Jobs Class
                -is_healthy()[source]
                +is_healthy()[source]

                Return if is healthy or not

                Returns:
                @@ -132,7 +129,7 @@

                Gen3 Jobs Class
                -list_jobs()[source]
                +list_jobs()[source]

                List all jobs

                @@ -168,7 +165,19 @@

                Navigation

              • Gen3 Auth Helper
              • Gen3 File Class
              • Gen3 Index Class
              • -
              • Gen3 Jobs Class
              • +
              • Gen3 Jobs Class +
              • Gen3 Metadata Class
              • Gen3 Object Class
              • Gen3 Query Class
              • diff --git a/docs/_build/html/metadata.html b/docs/_build/html/metadata.html index 21d6dc773..2cc60ccca 100644 --- a/docs/_build/html/metadata.html +++ b/docs/_build/html/metadata.html @@ -1,19 +1,16 @@ - - + - + Gen3 Metadata Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
                -

                Gen3 Metadata Class

                +

                Gen3 Metadata Class

                -class gen3.metadata.Gen3Metadata(endpoint=None, auth_provider=None, service_location='mds', admin_endpoint_suffix='-admin')[source]
                +class gen3.metadata.Gen3Metadata(endpoint=None, auth_provider=None, service_location='mds', admin_endpoint_suffix='-admin')[source]

                Bases: object

                A class for interacting with the Gen3 Metadata services.

                Examples

                @@ -50,7 +47,7 @@

                Gen3 Metadata Class
                -endpoint
                +endpoint

                public endpoint for reading/querying metadata - only necessary if auth_provider not provided

                Type:
                @@ -61,7 +58,7 @@

                Gen3 Metadata Class
                -auth_provider
                +auth_provider

                auth manager

                Type:
                @@ -72,7 +69,7 @@

                Gen3 Metadata Class
                -async async_create(guid, metadata, aliases=None, overwrite=False, _ssl=None, **kwargs)[source]
                +async async_create(guid, metadata, aliases=None, overwrite=False, _ssl=None, **kwargs)[source]

                Asynchronous function to create metadata

                Parameters:
                @@ -87,9 +84,74 @@

                Gen3 Metadata Class +
                +async async_create_aliases(guid, aliases, _ssl=None, **kwargs)[source]
                +

                Asyncronously create Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • aliases (list[str]) – Aliases to set for the guid

                • +
                • _ssl (None, optional) – whether or not to use ssl

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to create aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                + +
                +
                +async async_delete_alias(guid, alias, _ssl=None, **kwargs)[source]
                +

                Asyncronously delete single Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (str) – Globally unique ID for the metadata blob

                • +
                • alias (str) – alternative identifier (alias) to delete

                • +
                • _ssl (None, optional) – whether or not to use ssl

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to delete aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +
                + +
                +
                +async async_delete_aliases(guid, _ssl=None, **kwargs)[source]
                +

                Asyncronously delete all Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • _ssl (None, optional) – whether or not to use ssl

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to delete aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +
                +
                -async async_get(guid, _ssl=None, **kwargs)[source]
                +async async_get(guid, _ssl=None, **kwargs)[source]

                Asynchronous function to get metadata

                Parameters:
                @@ -107,9 +169,30 @@

                Gen3 Metadata Class +
                +async async_get_aliases(guid, _ssl=None, **kwargs)[source]
                +

                Asyncronously get Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • _ssl (None, optional) – whether or not to use ssl

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to get aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                +
                -async async_update(guid, metadata, aliases=None, merge=False, _ssl=None, **kwargs)[source]
                +async async_update(guid, metadata, aliases=None, merge=False, _ssl=None, **kwargs)[source]

                Asynchronous function to update metadata

                Parameters:
                @@ -117,15 +200,42 @@

                Gen3 Metadata Class +
                +async async_update_aliases(guid, aliases, merge=False, _ssl=None, **kwargs)[source]
                +

                Asyncronously update Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • aliases (list[str]) – Aliases to set for the guid

                • +
                • merge (bool, optional) – Whether or not to aliases with existing values

                • +
                • _ssl (None, optional) – whether or not to use ssl

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to update aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                +
                -batch_create(metadata_list, overwrite=True, **kwargs)[source]
                +batch_create(metadata_list, overwrite=True, **kwargs)[source]

                Create the list of metadata associated with the list of guids

                Parameters:
                @@ -141,7 +251,7 @@

                Gen3 Metadata Class
                -create(guid, metadata, overwrite=False, **kwargs)[source]
                +create(guid, metadata, aliases=None, overwrite=False, **kwargs)[source]

                Create the metadata associated with the guid

                Parameters:
                @@ -155,9 +265,30 @@

                Gen3 Metadata Class +
                +create_aliases(guid, aliases, **kwargs)[source]
                +

                Create Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • aliases (list[str]) – Aliases to set for the guid

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to create aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                +
                -create_index_key_path(path)[source]
                +create_index_key_path(path)[source]

                Create a metadata key path indexed in the database.

                Parameters:
                @@ -168,7 +299,7 @@

                Gen3 Metadata Class
                -delete(guid, **kwargs)[source]
                +delete(guid, **kwargs)[source]

                Delete the metadata associated with the guid

                Parameters:
                @@ -177,9 +308,50 @@

                Gen3 Metadata Class +
                +delete_alias(guid, alias, **kwargs)[source]
                +

                Delete single Alias for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • alias (str) – alternative identifier (alias) to delete

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to delete aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                + +
                +
                +delete_aliases(guid, **kwargs)[source]
                +

                Delete all Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to delete aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +
                +
                -delete_index_key_path(path)[source]
                +delete_index_key_path(path)[source]

                List all the metadata key paths indexed in the database.

                Parameters:
                @@ -190,7 +362,7 @@

                Gen3 Metadata Class
                -get(guid, **kwargs)[source]
                +get(guid, **kwargs)[source]

                Get the metadata associated with the guid :param guid: guid to use :type guid: str

                @@ -204,9 +376,29 @@

                Gen3 Metadata Class +
                +get_aliases(guid, **kwargs)[source]
                +

                Get Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to get aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                +
                -get_index_key_paths()[source]
                +get_index_key_paths()[source]

                List all the metadata key paths indexed in the database.

                Returns:
                @@ -220,7 +412,7 @@

                Gen3 Metadata Class
                -get_version()[source]
                +get_version()[source]

                Return the version

                Returns:
                @@ -234,7 +426,7 @@

                Gen3 Metadata Class
                -is_healthy()[source]
                +is_healthy()[source]

                Return if is healthy or not

                Returns:
                @@ -248,7 +440,7 @@

                Gen3 Metadata Class
                -query(query, return_full_metadata=False, limit=10, offset=0, use_agg_mds=False, **kwargs)[source]
                +query(query, return_full_metadata=False, limit=10, offset=0, use_agg_mds=False, **kwargs)[source]

                Query the metadata given a query.

                Query format is based off the logic used in the service:

                ‘’’ @@ -300,7 +492,7 @@

                Gen3 Metadata Class
                -update(guid, metadata, **kwargs)[source]
                +update(guid, metadata, aliases=None, merge=False, **kwargs)[source]

                Update the metadata associated with the guid

                Parameters:
                @@ -313,6 +505,28 @@

                Gen3 Metadata Class +
                +update_aliases(guid, aliases, merge=False, **kwargs)[source]
                +

                Update Aliases for the given guid

                +
                +
                Parameters:
                +
                  +
                • guid (TYPE) – Globally unique ID for the metadata blob

                • +
                • aliases (list[str]) – Aliases to set for the guid

                • +
                • merge (bool, optional) – Whether or not to aliases with existing values

                • +
                • **kwargs – additional query params

                • +
                +
                +
                Returns:
                +

                response from the request to update aliases

                +
                +
                Return type:
                +

                requests.Response

                +
                +
                +

                +

                @@ -346,7 +560,38 @@

                Navigation

              • Gen3 File Class
              • Gen3 Index Class
              • Gen3 Jobs Class
              • -
              • Gen3 Metadata Class
              • +
              • Gen3 Metadata Class +
              • Gen3 Object Class
              • Gen3 Query Class
              • Gen3 Submission Class
              • diff --git a/docs/_build/html/object.html b/docs/_build/html/object.html index ffe68dc3f..5370b568f 100644 --- a/docs/_build/html/object.html +++ b/docs/_build/html/object.html @@ -1,19 +1,16 @@ - - + - + Gen3 Object Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
                -

                Gen3 Object Class

                +

                Gen3 Object Class

                -class gen3.object.Gen3Object(auth_provider=None)[source]
                +class gen3.object.Gen3Object(auth_provider=None)[source]

                Bases: object

                For interacting with Gen3 object level features.

                A class for interacting with the Gen3 object services. @@ -57,12 +54,12 @@

                Gen3 Object Class
                -delete_object(guid, delete_file_locations=False)[source]
                +delete_object(guid, delete_file_locations=False)[source]

                Delete the object from indexd, metadata service and optionally all storage locations

                Parameters:
                  -
                • delete (guid -- GUID of the object to) –

                • +
                • delete (guid -- GUID of the object to) –

                • True (delete_file_locations -- if) –

                • location (removes the object from existing bucket) –

                @@ -107,7 +104,13 @@

                Navigation

              • Gen3 Index Class
              • Gen3 Jobs Class
              • Gen3 Metadata Class
              • -
              • Gen3 Object Class
              • +
              • Gen3 Object Class +
              • Gen3 Query Class
              • Gen3 Submission Class
              • Gen3 Tools
              • diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 98cf07bfc..8f2fb369e 100644 Binary files a/docs/_build/html/objects.inv and b/docs/_build/html/objects.inv differ diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html index e76e6628d..ee0167bf6 100644 --- a/docs/_build/html/py-modindex.html +++ b/docs/_build/html/py-modindex.html @@ -1,18 +1,15 @@ - - + Python Module Index — Gen3 SDK documentation - - - - - - - + + + + + diff --git a/docs/_build/html/query.html b/docs/_build/html/query.html index 50fe6b2e4..8c5d8630d 100644 --- a/docs/_build/html/query.html +++ b/docs/_build/html/query.html @@ -1,19 +1,16 @@ - - + - + Gen3 Query Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
                -

                Gen3 Query Class

                +

                Gen3 Query Class

                -class gen3.query.Gen3Query(auth_provider)[source]
                +class gen3.query.Gen3Query(auth_provider)[source]

                Bases: object

                Query ElasticSearch data from a Gen3 system.

                @@ -55,7 +52,7 @@

                Gen3 Query Class
                -graphql_query(query_string, variables=None)[source]
                +graphql_query(query_string, variables=None)[source]

                Execute a GraphQL query against a Data Commons.

                Parameters:
                @@ -80,7 +77,7 @@

                Gen3 Query Class
                -query(data_type, fields, first=None, offset=None, filters=None, filter_object=None, sort_object=None, accessibility=None, verbose=True)[source]
                +query(data_type, fields, first=None, offset=None, filters=None, filter_object=None, sort_object=None, accessibility=None, verbose=True)[source]

                Execute a query against a Data Commons.

                Parameters:
                @@ -119,7 +116,7 @@

                Gen3 Query Class
                -raw_data_download(data_type, fields, filter_object=None, sort_fields=None, accessibility=None, first=None, offset=None)[source]
                +raw_data_download(data_type, fields, filter_object=None, sort_fields=None, accessibility=None, first=None, offset=None)[source]

                Execute a raw data download against a Data Commons.

                Parameters:
                @@ -191,7 +188,15 @@

                Navigation

              • Gen3 Jobs Class
              • Gen3 Metadata Class
              • Gen3 Object Class
              • -
              • Gen3 Query Class
              • +
              • Gen3 Query Class +
              • Gen3 Submission Class
              • Gen3 Tools
              • Gen3 Workspace Storage
              • diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index 1bb9674f1..61db89256 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -1,19 +1,16 @@ - - + Search — Gen3 SDK documentation - - + + - - - - - + + + diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index b47cb47dc..35a0cd5cf 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["auth", "file", "index", "indexing", "jobs", "metadata", "object", "query", "submission", "tools", "tools/drs_pull", "tools/indexing", "tools/metadata", "wss"], "filenames": ["auth.rst", "file.rst", "index.rst", "indexing.rst", "jobs.rst", "metadata.rst", "object.rst", "query.rst", "submission.rst", "tools.rst", "tools/drs_pull.rst", "tools/indexing.rst", "tools/metadata.rst", "wss.rst"], "titles": ["Gen3 Auth Helper", "Gen3 File Class", "Welcome to Gen3 SDK\u2019s documentation!", "Gen3 Index Class", "Gen3 Jobs Class", "Gen3 Metadata Class", "Gen3 Object Class", "Gen3 Query Class", "Gen3 Submission Class", "Gen3 Tools", "DRS Download Tools", "Indexing Tools", "Metadata Tools", "Gen3 Workspace Storage"], "terms": {"class": [0, 2, 10, 11, 13], "gen3auth": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "endpoint": [0, 1, 3, 4, 5, 7, 8, 13], "none": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "refresh_fil": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "refresh_token": 0, "idp": 0, "sourc": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "base": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 13], "authbas": 0, "us": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "request": [0, 1, 3, 8, 11, 12], "implement": 0, "order": [0, 8], "support": [0, 1, 5, 8, 11], "jwt": 0, "authent": 0, "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 13], "access": [0, 1, 3, 7, 10], "token": [0, 10], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "provid": [0, 1, 3, 5, 7, 8, 12], "refresh": [0, 10], "file": [0, 2, 3, 4, 8, 9, 10, 11, 12, 13], "string": [0, 3, 5, 11, 13], "automat": 0, "when": [0, 3, 7, 10, 12], "thei": [0, 10], "expir": [0, 1], "paramet": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "str": [0, 1, 3, 4, 5, 7, 8, 10, 11, 12], "opt": 0, "The": [0, 1, 2, 3, 5, 8, 10, 11], "contain": [0, 2, 5, 8, 9, 10, 11, 12], "download": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13], "json": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "web": 0, "option": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11], "work": [0, 10, 11], "workspac": [0, 2], "default": [0, 1, 3, 7, 8, 11, 12], "env": 0, "gen3_api_kei": 0, "credenti": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "set": [0, 1, 10], "includ": [0, 3], "search": [0, 2, 3], "path": [0, 1, 5, 10, 11, 13], "valu": [0, 1, 3, 5, 7, 10, 11], "doe": [0, 11, 12], "interpret": 0, "wt": [0, 10], "an": [0, 3, 6, 8, 10, 11], "accesstoken": 0, "If": [0, 1, 7, 11, 12], "can": [0, 3, 4, 8, 11, 12], "specifi": [0, 3, 11, 13], "local": [0, 13], "indic": [0, 11], "environ": 0, "fenc": [0, 1], "exampl": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "point": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "sandbox": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "common": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "while": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "profil": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "page": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13], "instal": [0, 2], "crdc": 0, "some": [0, 2], "arbitrari": 0, "kei": [0, 3, 5, 13], "variabl": [0, 7, 8], "rather": 0, "than": [0, 5], "pass": [0, 7, 8, 10], "argument": [0, 13], "constructor": 0, "initi": [0, 10], "follow": [0, 11], "curl": 0, "data": [0, 1, 3, 5, 7, 8, 10, 11], "given": [0, 3, 4, 5, 8, 10, 11, 12, 13], "ex": [0, 11, 12], "user": [0, 10, 12], "return": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11], "respons": [0, 1, 3, 4], "under": [0, 8, 13], "index": [0, 2, 5, 9], "authz": [0, 1, 3, 10, 11], "map": [0, 11], "get": [0, 1, 3, 4, 5, 8, 10, 11, 12, 13], "post": [0, 11], "put": 0, "delet": [0, 1, 3, 5, 6, 8, 10, 11], "els": [0, 12], "filenam": [0, 8, 10, 11, 12], "get_access_token": 0, "auto": [0, 2], "within": [0, 2, 9], "5": [0, 5], "minut": 0, "refresh_access_token": 0, "new": [0, 3], "gen3fil": 1, "auth_provid": [1, 3, 4, 5, 6, 7, 8, 13], "object": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13], "For": [1, 5, 6, 7, 8, 9, 11], "interact": [1, 3, 4, 5, 6, 8, 13], "manag": [1, 5, 10], "featur": [1, 6], "A": [1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "servic": [1, 3, 4, 5, 6, 8, 11, 12, 13], "presign": 1, "url": [1, 3, 9, 10, 11, 12, 13], "right": 1, "now": [1, 8], "instanc": [1, 3, 6, 7, 8, 9, 10], "auth": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "delete_fil": 1, "guid": [1, 3, 5, 6, 11, 12], "method": [1, 7, 10], "deprec": 1, "delete_file_loc": [1, 6], "instead": [1, 7, 11], "all": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12], "locat": [1, 6], "store": [1, 3, 10], "remov": [1, 6, 11, 13], "its": [1, 3], "record": [1, 3, 5, 7, 8, 11, 12], "indexd": [1, 3, 6, 10, 11, 12], "uuid": [1, 3, 8], "id": [1, 3, 10, 11], "text": [1, 7, 8], "result": [1, 8, 10, 11], "type": [1, 3, 4, 5, 7, 8, 10, 11, 12], "get_presigned_url": 1, "protocol": 1, "retriev": [1, 8, 10, 12], "give": 1, "limit": [1, 3, 5, 12], "time": [1, 8, 10, 11], "pick": 1, "avail": [1, 2, 10, 11], "queri": [1, 2, 3, 5, 8, 11, 12], "upload_fil": 1, "file_nam": [1, 3, 10, 11], "expires_in": 1, "upload": [1, 3, 8, 13], "list": [1, 3, 4, 5, 7, 8, 10, 11, 13], "author": 1, "scope": 1, "storag": [1, 2, 6], "s3": [1, 10, 11], "az": 1, "isn": 1, "t": [1, 5, 11], "int": [1, 3, 5, 7, 8, 10, 11, 12], "amount": [1, 9], "second": [1, 4], "sign": 1, "datetim": [1, 10], "utcnow": 1, "Be": 1, "sure": 1, "posit": [1, 7], "integ": [1, 3, 8], "also": 1, "treat": [1, 5], "max_presigned_url_ttl": 1, "configur": 1, "represent": [1, 3], "document": [1, 3], "readm": 2, "python": [2, 9, 11], "github": [2, 7], "repo": 2, "setup": 2, "inform": [2, 3, 10], "along": 2, "quickstart": 2, "script": 2, "more": [2, 5, 7, 9, 10], "detail": [2, 7, 10], "about": [2, 3], "variou": 2, "function": [2, 3, 4, 5, 9, 10, 11, 12], "mostli": 2, "docstr": 2, "code": [2, 8], "helper": 2, "job": 2, "metadata": [2, 3, 6, 9, 11], "submiss": 2, "tool": 2, "dr": [2, 9], "verifi": [2, 9], "ingest": [2, 9], "modul": [2, 10, 11], "gen3index": 3, "service_loc": [3, 4, 5], "public": [3, 5], "read": [3, 5, 11], "onli": [3, 5, 7, 8, 10, 11], "necessari": [3, 5], "basic": [3, 11, 12], "cred": 3, "tupl": [3, 11, 12], "async": [3, 4, 5, 9, 11, 12], "async_create_record": 3, "hash": [3, 11], "size": [3, 10, 11], "did": 3, "baseid": 3, "acl": [3, 11], "urls_metadata": 3, "version": [3, 4, 5], "_ssl": [3, 4, 5], "asynchron": [3, 4, 5], "creat": [3, 4, 5, 6, 8, 10, 11], "dict": [3, 4, 5, 10, 11, 12], "eg": 3, "md5": [3, 11], "ab167e49d25b488939b1ede42752458b": 3, "associ": [3, 5], "made": 3, "where": [3, 5, 11, 12], "you": [3, 8, 11], "control": 3, "rbac": 3, "name": [3, 4, 8, 10, 11, 12, 13], "addit": [3, 10, 11], "entri": [3, 11], "attach": [3, 5], "each": [3, 8, 10, 11], "group": 3, "previou": [3, 11], "async_get_record": 3, "async_get_records_from_checksum": 3, "checksum": [3, 10], "checksum_typ": 3, "match": [3, 5, 12], "async_get_records_on_pag": 3, "async_get_with_param": 3, "param": [3, 5, 8, 10], "correspond": 3, "suppli": 3, "need": [3, 7, 10, 11], "handl": [3, 10], "hash_typ": 3, "whether": [3, 4, 5, 8, 11, 12], "ssl": [3, 4, 5], "async_query_url": 3, "pattern": [3, 12], "against": [3, 7, 8, 11, 12], "async_update_record": 3, "updat": [3, 5, 10, 11], "bodi": 3, "dictionari": [3, 4, 5, 7, 8], "format": [3, 5, 8, 11], "create_blank": 3, "blank": 3, "create_new_vers": 3, "add": [3, 5], "sinc": 3, "content": [3, 13], "immut": 3, "want": [3, 8], "chang": [3, 11], "That": 3, "field": [3, 5, 7, 11, 12], "old": 3, "ad": 3, "least": 3, "one": [3, 5, 10, 11], "suffici": 3, "note": [3, 11, 12], "good": 3, "idea": 3, "number": [3, 7, 8, 11, 12], "create_record": 3, "delete_record": [3, 8], "noth": [3, 6], "dist_resolut": 3, "true": [3, 4, 5, 6, 7, 8, 10, 11, 12], "alia": 3, "distribut": 3, "identifi": [3, 9, 11], "boolean": 3, "we": [3, 11], "get_all_record": 3, "pagin": 3, "fals": [3, 5, 6, 10, 11], "start": [3, 4, 7, 8, 10], "get_latest_vers": 3, "has_vers": 3, "latest": 3, "exclud": 3, "without": [3, 5], "get_record": 3, "get_record_doc": 3, "repres": [3, 5, 10], "get_records_on_pag": 3, "get_stat": 3, "info": [3, 11], "get_url": 3, "algorithm": 3, "get_vers": [3, 4, 5], "get_with_param": 3, "file_st": 3, "client": [3, 11], "like": [3, 5, 9, 11, 12], "signpost": 3, "is_healthi": [3, 4, 5], "healthi": [3, 4, 5], "query_url": 3, "update_blank": 3, "rev": 3, "revis": 3, "simpl": 3, "consist": 3, "mechan": 3, "update_record": 3, "exist": [3, 5, 6, 9, 12], "gen3job": [4, 10], "s": [], "dispatch": 4, "async_run_job_and_wait": 4, "job_nam": 4, "job_input": 4, "kwarg": [4, 5], "wait": 4, "output": [4, 5, 11, 12], "Will": [4, 7, 10], "sleep": 4, "linear": 4, "delai": 4, "until": [4, 10], "done": 4, "1": [4, 5, 8, 10, 11], "global": 4, "input": [4, 10, 11], "create_job": 4, "get_output": 4, "job_id": 4, "previous": 4, "complet": [4, 11], "get_statu": 4, "statu": [4, 10], "bool": [4, 5, 8, 10, 11, 12], "list_job": 4, "gen3metadata": 5, "md": [5, 7, 10, 12], "admin_endpoint_suffix": 5, "admin": [5, 11], "async_cr": 5, "overwrit": 5, "what": 5, "end": [5, 10], "up": [5, 9], "blob": [5, 7], "async_get": 5, "async_upd": 5, "batch_creat": 5, "metadata_list": 5, "specif": [5, 8, 11, 12], "expect": [5, 9, 11], "anoth": 5, "create_index_key_path": 5, "databas": 5, "delete_index_key_path": 5, "get_index_key_path": 5, "return_full_metadata": 5, "10": [5, 7, 11], "offset": [5, 7], "0": [5, 7, 8, 11], "use_agg_md": 5, "off": 5, "logic": [5, 12], "filter": [5, 7], "b": [5, 11], "2": [5, 11], "have": [5, 11], "ar": [5, 7, 8, 9, 10, 11], "alwai": 5, "nest": 5, "c": [5, 11], "3": 5, "same": [5, 11, 13], "whose": 5, "ani": [5, 10, 11], "But": 5, "differ": 5, "must": 5, "33": 5, "d": 5, "4": [5, 11], "e": [5, 10], "won": 5, "333": 5, "defin": [5, 8, 10], "api": [5, 8, 11], "just": [5, 11, 12], "max": 5, "num": 5, "OR": 5, "gen3object": 6, "level": 6, "current": [6, 8, 10], "allow": [6, 8, 10, 11, 12], "system": [6, 7, 8, 9], "delete_object": 6, "bucket": 6, "gen3queri": 7, "elasticsearch": 7, "graphql_queri": 7, "query_str": 7, "execut": [7, 8], "graphql": [7, 8], "query_txt": [7, 8], "syntax": 7, "see": [7, 10, 11], "http": [7, 11, 12], "com": 7, "uc": 7, "cdi": 7, "guppi": 7, "master": 7, "doc": [7, 10], "data_typ": 7, "my_index": 7, "my_field": 7, "first": [7, 8], "filter_object": 7, "sort_object": 7, "verbos": [7, 8], "row": [7, 8, 11, 12], "sort": 7, "equal": 7, "respect": 7, "complex": 7, "appli": 7, "One": 7, "unaccess": 7, "valid": [3, 7, 11], "regular": 7, "tier": 7, "mode": 7, "subject": [7, 8], "50": 7, "vital_statu": 7, "submitter_id": 7, "aliv": 7, "asc": 7, "raw_data_download": 7, "sort_field": 7, "raw": [7, 11], "project_id": [7, 8], "my_program": 7, "my_project": 7, "gen3submiss": 8, "submit": [8, 11], "export": [8, 10], "sheepdog": 8, "through": [8, 11], "peregrin": 8, "sub": 8, "create_program": 8, "program": [8, 11], "create_project": 8, "project": [8, 11], "dcf": 8, "delete_nod": 8, "node_nam": 8, "batch_siz": 8, "100": [8, 11], "node": 8, "how": [8, 11], "mani": [8, 11], "print": [8, 10], "progress": [8, 10], "log": [8, 10, 11, 12], "ccle": 8, "demograph": 8, "ordered_node_list": 8, "revers": 8, "graph": 8, "experi": 8, "delete_program": 8, "empti": [8, 11], "delete_project": 8, "uuid1": 8, "uuid2": 8, "export_nod": 8, "node_typ": 8, "fileformat": 8, "singl": [8, 10], "which": [8, 10, 11], "belong": 8, "either": 8, "tsv": [8, 11, 12], "screen": 8, "sampl": [8, 10], "ccle_sample_nod": 8, "export_record": 8, "d70b41b9": 8, "6f90": 8, "4714": 8, "8420": 8, "e043ab8b77b9": 8, "ccle_one_record": 8, "get_dictionary_al": 8, "entir": 8, "schema": 8, "get_dictionary_nod": 8, "get_graphql_schema": 8, "run": 8, "introspect": 8, "get_program": 8, "regist": 8, "get_project_dictionari": 8, "get_project_manifest": 8, "manifest": [8, 9, 10, 11, 12], "get_project": 8, "open_project": 8, "mark": 8, "open": [8, 10, 11], "mean": 8, "etc": 8, "max_tri": 8, "retri": 8, "fail": [8, 10], "submit_fil": 8, "chunk_siz": 8, "30": 8, "row_offset": 8, "spreadsheet": 8, "multipl": [8, 11], "csv": [8, 11, 12], "xlsx": 8, "worksheet": 8, "skip": 8, "data_spreadsheet": 8, "submit_record": 8, "should": [8, 11], "arrai": 8, "action": [9, 11], "These": 9, "broken": 9, "broad": 9, "categori": 9, "task": 9, "relat": 9, "persist": 9, "Such": 9, "mai": 9, "involv": 9, "assign": 9, "everi": [9, 11], "alreadi": 9, "larg": 9, "most": 9, "util": 9, "capabl": 9, "make": [9, 11], "effici": 9, "main": 10, "downloadmanag": 10, "datafil": 10, "load": 10, "manifest_1": 10, "my_common": 10, "org": 10, "gen3": [10, 11, 12], "my_credenti": 10, "i": [0, 1, 2, 3, 4, 5, 8, 10, 11, 12], "howto": 10, "drsdownload": 10, "drs_download": 10, "hostnam": 10, "download_list": 10, "show_progress": 10, "assist": 10, "minimum": 10, "interest": 10, "user_access": 10, "cache_hosts_wts_token": 10, "object_list": 10, "host": 10, "obtain": [10, 11], "It": 10, "possibl": 10, "save_directori": 10, "unpack_packag": 10, "delete_unpacked_packag": 10, "directori": [10, 11], "call": [10, 11, 13], "case": 10, "error": [10, 11, 12], "continu": 10, "downloadstatu": 10, "save": 10, "show": 10, "bar": 10, "disabl": 10, "unpack": 10, "packag": 10, "after": 10, "them": [10, 11], "get_fresh_token": 10, "drs_hostnam": 10, "known": 10, "otherwis": 10, "success": 10, "resolve_object": 10, "resolv": 10, "permiss": 10, "wai": 10, "determin": [10, 11, 12], "reason": 10, "pend": 10, "start_tim": 10, "end_tim": 10, "objectid": 10, "datamanag": 10, "occur": 10, "attribut": [10, 11], "object_id": 10, "object_typ": 10, "drsobjecttyp": 10, "unknown": 10, "file_s": [10, 11], "updated_tim": 10, "created_tim": 10, "access_method": 10, "factori": 10, "children": 10, "popul": [10, 11, 12], "server": [10, 11], "requir": 10, "byte": 10, "timestamp": 10, "last": 10, "g": 10, "child": 10, "bundl": 10, "_manag": 10, "self": 10, "pprint": 10, "indent": 10, "pretti": 10, "In": 10, "similar": 10, "linux": 10, "tree": 10, "command": 10, "md5sum": 10, "commons_url": [10, 11, 12], "typic": 10, "discoveri": 10, "cach": 10, "files": 10, "static": 10, "create_object_list": 10, "bownload": 10, "successfulli": 10, "pars": [10, 11, 12, 13], "load_manifest": 10, "download_drs_object": 10, "output_dir": 10, "conveni": 10, "download_files_in_drs_manifest": 10, "infil": 10, "list_access_in_drs_manifest": 10, "list_drs_object": 10, "list_files_in_drs_manifest": 10, "wrapper": 10, "cli": 10, "process": 11, "coroutin": 11, "asyncio": [11, 12], "librari": 11, "comma": 11, "separ": 11, "header": 11, "space": 11, "download_manifest": 11, "current_dir": 11, "indexd_record_page_s": 11, "per": [11, 12], "max_concurrent_request": [11, 12], "maximum": [11, 12], "desir": 11, "concurr": [11, 12], "across": 11, "thread": 11, "tmp_folder": 11, "folder": 11, "place": 11, "temporari": 11, "write": 11, "safe": 11, "so": 11, "To": 11, "workaround": 11, "concat": 11, "async_download_object_manifest": 11, "output_filenam": [11, 12], "num_process": 11, "24": [11, 12], "input_manifest": 11, "root": [11, 12], "domain": [11, 12], "live": [11, 12], "parallel": 11, "hit": 11, "total": 11, "help": 11, "everyth": 11, "attempt": 11, "tab": 11, "session": 11, "column": [11, 12], "shown": 11, "below": 11, "255e396f": 11, "f1f8": 11, "11e9": 11, "9a07": 11, "0a80fada099c": 11, "473d83400bc1bc9dc635e334faddf33c": 11, "363455714": 11, "pdcdatastor": 11, "test1": 11, "0a80fada098c": 11, "473d83400bc1bc9dc635e334faddd33c": 11, "343434344": 11, "test2": 11, "0a80fada097c": 11, "473d83400bc1bc9dc635e334fadd433c": 11, "543434443": 11, "phs0001": 11, "phs0002": 11, "test3": 11, "0a80fada096c": 11, "test4": 11, "0a80fada010c": 11, "473d83400bc1bc9dc635e334fadde33c": 11, "test5": 11, "index_manifest": 11, "prev_guid": 11, "usag": 11, "py": 11, "giangb": 11, "planx": 11, "pla": 11, "net": 11, "manifest_fil": [11, 12], "path_to_manifest": 11, "replace_url": 11, "thread_num": 11, "api_kei": 11, "threadcontrol": 11, "processed_fil": 11, "num_total_fil": 11, "synchron": 11, "delete_all_guid": 11, "warn": 11, "IF": 11, "know": 11, "THE": 11, "implic": 11, "index_object_manifest": 11, "manifest_file_delimit": [11, 12], "submit_additional_metadata_column": 11, "loop": 11, "ha": 11, "password": [11, 12], "flag": 11, "replac": 11, "delimit": 11, "guid_exampl": 11, "md5_hash": 11, "fieldnam": 11, "There": 11, "those": 11, "abov": 11, "overrid": [11, 12], "assum": 11, "altern": 11, "behavior": 11, "simpli": 11, "manifest_row_pars": [11, 12], "custom": 11, "import": 11, "verify_manifest": 11, "def": 11, "_get_authz_from_row": 11, "strip": 11, "parser": [11, 12], "verify_object_manifest": 11, "verif": 11, "error_nam": 11, "value_from_manifest": 11, "actual": 11, "value_from_indexd": 11, "93d9af72": 11, "b0f1": 11, "450c": 11, "a5c6": 11, "7d3d8d2083b4": 11, "dev": 11, "test": 11, "async_verify_object_manifest": 11, "_get_acl_from_row": 11, "_get_file_name_from_row": 11, "_get_file_size_from_row": 11, "_get_guid_from_row": 11, "_get_md5_from_row": 11, "_get_urls_from_row": 11, "1654627682": [], "4302042": [], "indexd_field": [11, 12], "func_to_parse_row": [11, 12], "delimet": [11, 12], "metdata": 12, "ingest_manifest": 12, "column_to_use_as_guid": 12, "guid_type_for_indexed_file_object": 12, "guid_type_for_non_indexed_file_object": 12, "NOT": [11, 12], "guid_from_fil": 12, "_get_guid_for_row": 12, "indexed_file_object_guid": 12, "_query_for_associated_indexd_record_guid": 12, "guid_for_row": 12, "elsewher": 12, "async_ingest_metadata_manifest": 12, "metadata_sourc": 12, "672043": [], "get_guid_from_fil": 12, "metadata_typ": 12, "namespac": [0, 12], "dbgap": 12, "usual": 12, "fill": 12, "_guid_typ": 12, "is_indexed_file_object": 12, "async_query_urls_from_indexd": 12, "lock": 12, "semaphor": 12, "semaphon": 12, "ammount": 12, "connect": 12, "wss": 13, "gen3wsstorag": 13, "copi": 13, "src_urlstr": 13, "dest_urlstr": 13, "appropri": 13, "src_w": 13, "src_wskei": 13, "dest_path": 13, "disk": 13, "download_url": 13, "ws": [], "wskei": 13, "ls": [], "ls_path": 13, "ws_urlstr": 13, "form": 13, "rm": 13, "rm_path": 13, "src_path": 13, "dest_w": 13, "dest_wskei": 13, "upload_url": 13, "1654634067": [], "5923028": [], "8967967": [], "1654789636": [], "6798043": [], "9773014": [], "1654807944": [], "3028057": [], "560571": [], "1654874610": [], "345438": [], "6664228": [], "1654874771": [], "190345": [], "4957037": [], "1654887195": [], "1666398": [], "5790925": [], "get_guids_prefix": 3, "prefix": 3, "get_valid_guid": 3, "count": 3, "populate_object_manifest_with_valid_guid": 11, "minim": 11, "miss": 11, "anyth": 11, "side": 11, "No": 11, "part": 11, "1655136811": [], "5685084": [], "982317": [], "get_access_token_from_wt": 0, "try": 0, "fetch": 0, "": [4, 8, 10, 11], "force_metadata_columns_even_if_empti": 11, "forc": 11, "creation": 11, "even": 11, "enabl": 11, "illustr": 11, "columna": 11, "columnb": 11, "columnc": 11, "dataa": 11, "datab": 11, "1659375909": [], "1640186": [], "522224": [], "w": 13, "l": 13, "rtype": 3, "alias": 5, "merg": 5, "1660165119": [], "312618": [], "6884966": [], "1660576358": [], "150224": [], "5508597": [], "1660677351": 11, "9370115": 11, "1660677352": 12, "260972": 12}, "objects": {"gen3.auth": [[0, 0, 1, "", "Gen3Auth"]], "gen3.auth.Gen3Auth": [[0, 1, 1, "", "curl"], [0, 1, 1, "", "get_access_token"], [0, 1, 1, "", "get_access_token_from_wts"], [0, 1, 1, "", "refresh_access_token"]], "gen3.file": [[1, 0, 1, "", "Gen3File"]], "gen3.file.Gen3File": [[1, 1, 1, "", "delete_file"], [1, 1, 1, "", "delete_file_locations"], [1, 1, 1, "", "get_presigned_url"], [1, 1, 1, "", "upload_file"]], "gen3.index": [[3, 0, 1, "", "Gen3Index"]], "gen3.index.Gen3Index": [[3, 1, 1, "", "async_create_record"], [3, 1, 1, "", "async_get_record"], [3, 1, 1, "", "async_get_records_from_checksum"], [3, 1, 1, "", "async_get_records_on_page"], [3, 1, 1, "", "async_get_with_params"], [3, 1, 1, "", "async_query_urls"], [3, 1, 1, "", "async_update_record"], [3, 1, 1, "", "create_blank"], [3, 1, 1, "", "create_new_version"], [3, 1, 1, "", "create_record"], [3, 1, 1, "", "delete_record"], [3, 1, 1, "", "get"], [3, 1, 1, "", "get_all_records"], [3, 1, 1, "", "get_guids_prefix"], [3, 1, 1, "", "get_latest_version"], [3, 1, 1, "", "get_record"], [3, 1, 1, "", "get_record_doc"], [3, 1, 1, "", "get_records"], [3, 1, 1, "", "get_records_on_page"], [3, 1, 1, "", "get_stats"], [3, 1, 1, "", "get_urls"], [3, 1, 1, "", "get_valid_guids"], [3, 1, 1, "", "get_version"], [3, 1, 1, "", "get_versions"], [3, 1, 1, "", "get_with_params"], [3, 1, 1, "", "is_healthy"], [3, 1, 1, "", "query_urls"], [3, 1, 1, "", "update_blank"], [3, 1, 1, "", "update_record"]], "gen3.jobs": [[4, 0, 1, "", "Gen3Jobs"]], "gen3.jobs.Gen3Jobs": [[4, 1, 1, "", "async_run_job_and_wait"], [4, 1, 1, "", "create_job"], [4, 1, 1, "", "get_output"], [4, 1, 1, "", "get_status"], [4, 1, 1, "", "get_version"], [4, 1, 1, "", "is_healthy"], [4, 1, 1, "", "list_jobs"]], "gen3.metadata": [[5, 0, 1, "", "Gen3Metadata"]], "gen3.metadata.Gen3Metadata": [[5, 1, 1, "", "async_create"], [5, 1, 1, "", "async_get"], [5, 1, 1, "", "async_update"], [5, 2, 1, "", "auth_provider"], [5, 1, 1, "", "batch_create"], [5, 1, 1, "", "create"], [5, 1, 1, "", "create_index_key_path"], [5, 1, 1, "", "delete"], [5, 1, 1, "", "delete_index_key_path"], [5, 2, 1, "", "endpoint"], [5, 1, 1, "", "get"], [5, 1, 1, "", "get_index_key_paths"], [5, 1, 1, "", "get_version"], [5, 1, 1, "", "is_healthy"], [5, 1, 1, "", "query"], [5, 1, 1, "", "update"]], "gen3.object": [[6, 0, 1, "", "Gen3Object"]], "gen3.object.Gen3Object": [[6, 1, 1, "", "delete_object"]], "gen3.query": [[7, 0, 1, "", "Gen3Query"]], "gen3.query.Gen3Query": [[7, 1, 1, "", "graphql_query"], [7, 1, 1, "", "query"], [7, 1, 1, "", "raw_data_download"]], "gen3.submission": [[8, 0, 1, "", "Gen3Submission"]], "gen3.submission.Gen3Submission": [[8, 1, 1, "", "create_program"], [8, 1, 1, "", "create_project"], [8, 1, 1, "", "delete_node"], [8, 1, 1, "", "delete_nodes"], [8, 1, 1, "", "delete_program"], [8, 1, 1, "", "delete_project"], [8, 1, 1, "", "delete_record"], [8, 1, 1, "", "delete_records"], [8, 1, 1, "", "export_node"], [8, 1, 1, "", "export_record"], [8, 1, 1, "", "get_dictionary_all"], [8, 1, 1, "", "get_dictionary_node"], [8, 1, 1, "", "get_graphql_schema"], [8, 1, 1, "", "get_programs"], [8, 1, 1, "", "get_project_dictionary"], [8, 1, 1, "", "get_project_manifest"], [8, 1, 1, "", "get_projects"], [8, 1, 1, "", "open_project"], [8, 1, 1, "", "query"], [8, 1, 1, "", "submit_file"], [8, 1, 1, "", "submit_record"]], "gen3": [[9, 3, 0, "-", "tools"]], "gen3.tools.download": [[10, 3, 0, "-", "drs_download"]], "gen3.tools.download.drs_download": [[10, 0, 1, "", "DownloadManager"], [10, 0, 1, "", "DownloadStatus"], [10, 0, 1, "", "Downloadable"], [10, 0, 1, "", "Manifest"], [10, 4, 1, "", "download_drs_object"], [10, 4, 1, "", "download_files_in_drs_manifest"], [10, 4, 1, "", "list_access_in_drs_manifest"], [10, 4, 1, "", "list_drs_object"], [10, 4, 1, "", "list_files_in_drs_manifest"]], "gen3.tools.download.drs_download.DownloadManager": [[10, 1, 1, "", "cache_hosts_wts_tokens"], [10, 1, 1, "", "download"], [10, 1, 1, "", "get_fresh_token"], [10, 1, 1, "", "resolve_objects"], [10, 1, 1, "", "user_access"]], "gen3.tools.download.drs_download.DownloadStatus": [[10, 2, 1, "", "end_time"], [10, 2, 1, "", "start_time"], [10, 2, 1, "", "status"]], "gen3.tools.download.drs_download.Downloadable": [[10, 2, 1, "", "_manager"], [10, 2, 1, "", "access_methods"], [10, 2, 1, "", "children"], [10, 2, 1, "", "created_time"], [10, 1, 1, "", "download"], [10, 2, 1, "", "file_name"], [10, 2, 1, "", "file_size"], [10, 2, 1, "", "hostname"], [10, 2, 1, "", "object_id"], [10, 2, 1, "", "object_type"], [10, 1, 1, "", "pprint"], [10, 2, 1, "", "updated_time"]], "gen3.tools.download.drs_download.Manifest": [[10, 2, 1, "", "commons_url"], [10, 1, 1, "", "create_object_list"], [10, 2, 1, "", "file_name"], [10, 2, 1, "", "file_size"], [10, 1, 1, "", "load"], [10, 1, 1, "", "load_manifest"], [10, 2, 1, "", "md5sum"], [10, 2, 1, "", "object_id"]], "gen3.tools.indexing": [[11, 3, 0, "-", "download_manifest"], [11, 3, 0, "-", "index_manifest"], [11, 3, 0, "-", "verify_manifest"]], "gen3.tools.indexing.download_manifest": [[11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "INDEXD_RECORD_PAGE_SIZE"], [11, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [11, 2, 1, "", "TMP_FOLDER"], [11, 4, 1, "", "async_download_object_manifest"]], "gen3.tools.indexing.index_manifest": [[11, 2, 1, "", "ACLS"], [11, 2, 1, "", "AUTHZ"], [11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "GUID"], [11, 2, 1, "", "MD5"], [11, 2, 1, "", "PREV_GUID"], [11, 2, 1, "", "SIZE"], [11, 0, 1, "", "ThreadControl"], [11, 2, 1, "", "URLS"], [11, 4, 1, "", "delete_all_guids"], [11, 4, 1, "", "index_object_manifest"], [11, 4, 1, "", "populate_object_manifest_with_valid_guids"]], "gen3.tools.indexing.verify_manifest": [[11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [11, 4, 1, "", "async_verify_object_manifest"]], "gen3.tools.metadata": [[12, 3, 0, "-", "ingest_manifest"]], "gen3.tools.metadata.ingest_manifest": [[12, 2, 1, "", "COLUMN_TO_USE_AS_GUID"], [12, 2, 1, "", "GUID_TYPE_FOR_INDEXED_FILE_OBJECT"], [12, 2, 1, "", "GUID_TYPE_FOR_NON_INDEXED_FILE_OBJECT"], [12, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [12, 4, 1, "", "async_ingest_metadata_manifest"], [12, 4, 1, "", "async_query_urls_from_indexd"]], "gen3.wss": [[13, 0, 1, "", "Gen3WsStorage"]], "gen3.wss.Gen3WsStorage": [[13, 1, 1, "", "copy"], [13, 1, 1, "", "download"], [13, 1, 1, "", "download_url"], [13, 1, 1, "", "ls"], [13, 1, 1, "", "ls_path"], [13, 1, 1, "", "rm"], [13, 1, 1, "", "rm_path"], [13, 1, 1, "", "upload"], [13, 1, 1, "", "upload_url"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute", "3": "py:module", "4": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "module", "Python module"], "4": ["py", "function", "Python function"]}, "titleterms": {"gen3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13], "auth": 0, "helper": 0, "file": 1, "class": [1, 3, 4, 5, 6, 7, 8], "welcom": 2, "sdk": 2, "s": [], "document": 2, "indic": 2, "tabl": 2, "index": [3, 11], "job": 4, "metadata": [5, 12], "object": 6, "queri": 7, "submiss": 8, "tool": [9, 10, 11, 12], "dr": 10, "download": [10, 11], "verifi": 11, "ingest": 12, "workspac": 13, "storag": 13, "": 2}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["auth", "file", "index", "indexing", "jobs", "metadata", "object", "query", "submission", "tools", "tools/drs_pull", "tools/indexing", "tools/metadata", "wss"], "filenames": ["auth.rst", "file.rst", "index.rst", "indexing.rst", "jobs.rst", "metadata.rst", "object.rst", "query.rst", "submission.rst", "tools.rst", "tools/drs_pull.rst", "tools/indexing.rst", "tools/metadata.rst", "wss.rst"], "titles": ["Gen3 Auth Helper", "Gen3 File Class", "Welcome to Gen3 SDK\u2019s documentation!", "Gen3 Index Class", "Gen3 Jobs Class", "Gen3 Metadata Class", "Gen3 Object Class", "Gen3 Query Class", "Gen3 Submission Class", "Gen3 Tools", "DRS Download Tools", "Indexing Tools", "Metadata Tools", "Gen3 Workspace Storage"], "terms": {"class": [0, 2, 10, 11, 13], "gen3auth": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "endpoint": [0, 1, 2, 3, 4, 5, 7, 8, 13], "none": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "refresh_fil": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "refresh_token": 0, "idp": 0, "client_credenti": 0, "client_scop": 0, "sourc": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "base": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 13], "authbas": 0, "us": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "request": [0, 1, 3, 5, 8, 11, 12], "implement": 0, "order": [0, 8], "support": [0, 1, 5, 8, 11], "jwt": 0, "authent": 0, "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 13], "access": [0, 1, 3, 7, 10], "token": [0, 10], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "provid": [0, 1, 3, 5, 7, 8, 12], "refresh": [0, 10], "file": [0, 2, 3, 4, 8, 9, 10, 11, 12, 13], "string": [0, 3, 5, 11, 13], "automat": 0, "when": [0, 3, 7, 10, 12], "thei": [0, 10], "expir": [0, 1], "paramet": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "str": [0, 1, 3, 4, 5, 7, 8, 10, 11, 12], "opt": 0, "The": [0, 1, 2, 3, 5, 8, 10, 11], "contain": [0, 2, 5, 8, 9, 10, 11, 12], "download": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13], "json": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "web": 0, "option": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11], "work": [0, 10], "workspac": [0, 2], "default": [0, 1, 3, 7, 8, 11, 12], "env": 0, "gen3_api_kei": 0, "credenti": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "set": [0, 1, 5, 10], "includ": [0, 3], "search": [0, 2, 3], "path": [0, 1, 5, 10, 11, 13], "valu": [0, 1, 3, 5, 7, 10, 11], "doe": [0, 12], "interpret": 0, "wt": [0, 10], "an": [0, 3, 6, 8, 10, 11], "accesstoken": 0, "If": [0, 1, 7, 11, 12], "can": [0, 3, 4, 8, 11, 12], "specifi": [0, 1, 3, 11, 13], "local": [0, 13], "indic": [0, 11], "environ": 0, "fenc": [0, 1], "tupl": [0, 3, 11, 12], "client_id": 0, "client_secret": 0, "oidc": 0, "client": [0, 3], "ha": [0, 11], "grant": 0, "allow": [0, 6, 8, 10, 11, 12], "obtain": [0, 10], "space": [0, 11], "separ": [0, 11], "list": [0, 1, 3, 4, 5, 7, 8, 10, 11, 13], "scope": [0, 1], "user": [0, 10, 12], "data": [0, 1, 3, 5, 7, 8, 10, 11], "openid": 0, "exampl": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "point": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "sandbox": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "common": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "while": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "profil": [0, 1, 3, 4, 5, 6, 7, 8, 10, 13], "page": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13], "instal": [0, 2, 11], "crdc": 0, "some": [0, 2], "arbitrari": 0, "kei": [0, 3, 5, 13], "variabl": [0, 7, 8], "rather": 0, "than": [0, 5], "pass": [0, 7, 8, 10], "argument": [0, 13], "constructor": 0, "id": [0, 1, 3, 5, 10, 11], "secret": 0, "note": [0, 3, 11, 12], "should": [0, 8, 11], "never": 0, "hardcod": 0, "http": [0, 7, 11, 12], "datacommon": 0, "o": 0, "gen3_oidc_client_creds_secret": 0, "initi": [0, 10], "follow": [0, 11], "curl": [0, 2], "given": [0, 3, 4, 5, 8, 10, 12, 13], "ex": [0, 11, 12], "return": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11], "respons": [0, 1, 3, 4, 5], "under": [0, 8, 13], "index": [0, 2, 5, 9], "authz": [0, 1, 2, 3, 9, 10, 11], "map": [0, 11], "get": [0, 1, 2, 3, 4, 5, 8, 10, 11, 12, 13], "post": [0, 11], "put": 0, "delet": [0, 1, 2, 3, 5, 6, 8, 10, 11], "i": [0, 1, 2, 3, 4, 5, 8, 10, 11, 12], "els": [0, 12], "filenam": [0, 8, 10, 11, 12], "get_access_token": [0, 2], "auto": [0, 2], "within": [0, 2, 9], "5": [0, 5], "minut": 0, "get_access_token_from_wt": [0, 2], "try": 0, "fetch": 0, "namespac": [0, 12], "refresh_access_token": [0, 2], "new": [0, 3], "gen3fil": [1, 2], "auth_provid": [1, 2, 3, 4, 5, 6, 7, 8, 13], "object": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13], "For": [1, 5, 6, 7, 8, 9, 11], "interact": [1, 3, 4, 5, 6, 8, 13], "manag": [1, 5, 10], "featur": [1, 6], "A": [1, 3, 4, 5, 6, 7, 8, 10, 11, 13], "servic": [1, 3, 4, 5, 6, 8, 11, 12, 13], "presign": 1, "url": [1, 2, 3, 9, 10, 11, 12, 13], "right": 1, "now": [1, 8], "instanc": [1, 3, 6, 7, 8, 9, 10], "auth": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13], "delete_fil": [1, 2], "guid": [1, 2, 3, 5, 6, 9, 11, 12], "method": [1, 7, 10], "deprec": 1, "delete_file_loc": [1, 2, 6], "instead": [1, 7, 11], "all": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12], "locat": [1, 6], "store": [1, 3, 10], "remov": [1, 6, 11, 13], "its": [1, 3], "record": [1, 3, 5, 7, 8, 11, 12], "indexd": [1, 3, 6, 10, 11, 12], "uuid": [1, 3, 8], "text": [1, 7, 8], "result": [1, 8, 10, 11], "type": [1, 3, 4, 5, 7, 8, 10, 11, 12], "download_singl": [1, 2], "object_id": [1, 2, 9, 10], "singl": [1, 5, 8], "": [1, 4, 8, 10, 11], "uniqu": [1, 5], "get_presigned_url": [1, 2], "protocol": 1, "retriev": [1, 8, 10, 12], "give": 1, "limit": [1, 3, 5, 12], "time": [1, 8, 10, 11], "pick": 1, "avail": [1, 2, 10, 11], "queri": [1, 2, 3, 5, 8, 11, 12], "upload_fil": [1, 2], "file_nam": [1, 2, 3, 9, 10, 11], "expires_in": 1, "bucket": [1, 6], "upload": [1, 2, 3, 8, 13], "author": 1, "storag": [1, 2, 6], "s3": [1, 10, 11], "az": 1, "isn": 1, "t": [1, 5, 11], "int": [1, 3, 5, 7, 8, 10, 11, 12], "amount": [1, 9], "second": [1, 4], "sign": 1, "datetim": [1, 10], "utcnow": 1, "Be": 1, "sure": 1, "posit": [1, 7], "integ": [1, 3, 8], "also": 1, "treat": [1, 5], "max_presigned_url_ttl": 1, "configur": 1, "must": [1, 5], "allowed_data_upload_bucket": 1, "data_upload_bucket": 1, "represent": [1, 3], "document": [1, 3], "upload_file_to_guid": [1, 2], "exist": [1, 3, 5, 6, 9, 12], "readm": 2, "python": [2, 9, 11], "github": [2, 7], "repo": 2, "setup": 2, "inform": [2, 3, 10], "along": 2, "quickstart": 2, "script": 2, "more": [2, 5, 7, 9, 10], "detail": [2, 7, 10], "about": [2, 3], "variou": 2, "function": [2, 3, 4, 5, 9, 10, 11, 12], "mostli": 2, "docstr": 2, "code": [2, 8], "helper": 2, "gen3index": [2, 3], "async_create_record": [2, 3], "async_get_record": [2, 3], "async_get_records_from_checksum": [2, 3], "async_get_records_on_pag": [2, 3], "async_get_with_param": [2, 3], "async_query_url": [2, 3], "async_update_record": [2, 3], "create_blank": [2, 3], "create_new_vers": [2, 3], "create_record": [2, 3], "delete_record": [2, 3, 8], "get_all_record": [2, 3], "get_guids_prefix": [2, 3], "get_latest_vers": [2, 3], "get_record": [2, 3], "get_record_doc": [2, 3], "get_records_on_pag": [2, 3], "get_stat": [2, 3], "get_url": [2, 3], "get_valid_guid": [2, 3], "get_vers": [2, 3, 4, 5], "get_with_param": [2, 3], "is_healthi": [2, 3, 4, 5], "query_url": [2, 3], "update_blank": [2, 3], "update_record": [2, 3], "job": 2, "gen3job": [2, 4, 10], "async_run_job_and_wait": [2, 4], "create_job": [2, 4], "get_output": [2, 4], "get_statu": [2, 4], "list_job": [2, 4], "metadata": [2, 3, 6, 9, 11], "gen3metadata": [2, 5], "async_cr": [2, 5], "async_create_alias": [2, 5], "async_delete_alia": [2, 5], "async_delete_alias": [2, 5], "async_get": [2, 5], "async_get_alias": [2, 5], "async_upd": [2, 5], "async_update_alias": [2, 5], "batch_creat": [2, 5], "creat": [2, 3, 4, 5, 6, 8, 10, 11], "create_alias": [2, 5], "create_index_key_path": [2, 5], "delete_alia": [2, 5], "delete_alias": [2, 5], "delete_index_key_path": [2, 5], "get_alias": [2, 5], "get_index_key_path": [2, 5], "updat": [2, 3, 5, 10, 11], "update_alias": [2, 5], "gen3object": [2, 6], "delete_object": [2, 6], "gen3queri": [2, 7], "graphql_queri": [2, 7], "raw_data_download": [2, 7], "submiss": 2, "gen3submiss": [2, 8], "create_program": [2, 8], "create_project": [2, 8], "delete_nod": [2, 8], "delete_program": [2, 8], "delete_project": [2, 8], "export_nod": [2, 8], "export_record": [2, 8], "get_dictionary_al": [2, 8], "get_dictionary_nod": [2, 8], "get_graphql_schema": [2, 8], "get_program": [2, 8], "get_project_dictionari": [2, 8], "get_project_manifest": [2, 8], "get_project": [2, 8], "open_project": [2, 8], "submit_fil": [2, 8], "submit_record": [2, 8], "tool": 2, "dr": [2, 9], "downloadmanag": [2, 9, 10], "cache_hosts_wts_token": [2, 9, 10], "get_fresh_token": [2, 9, 10], "resolve_object": [2, 9, 10], "user_access": [2, 9, 10], "downloadstatu": [2, 9, 10], "statu": [2, 4, 9, 10], "start_tim": [2, 9, 10], "end_tim": [2, 9, 10], "object_typ": [2, 9, 10], "hostnam": [2, 9, 10], "file_s": [2, 9, 10, 11], "updated_tim": [2, 9, 10], "created_tim": [2, 9, 10], "access_method": [2, 9, 10], "children": [2, 9, 10], "_manag": [2, 9, 10], "pprint": [2, 9, 10], "manifest": [2, 8, 9, 10, 11, 12], "md5sum": [2, 9, 10], "commons_url": [2, 9, 10, 11, 12], "create_object_list": [2, 9, 10], "load": [2, 9, 10], "load_manifest": [2, 9, 10], "download_drs_object": [], "download_files_in_drs_manifest": [2, 9, 10], "list_access_in_drs_manifest": [2, 9, 10], "list_drs_object": [2, 9, 10], "list_files_in_drs_manifest": [2, 9, 10], "current_dir": [2, 9, 11], "indexd_record_page_s": [2, 9, 11], "max_concurrent_request": [2, 9, 11, 12], "tmp_folder": [2, 9, 11], "async_download_object_manifest": [2, 9, 11], "size": [2, 3, 9, 10, 11], "md5": [2, 3, 9, 11], "acl": [2, 3, 9, 11], "prev_guid": [2, 9, 11], "threadcontrol": [2, 9, 11], "delete_all_guid": [2, 9, 11], "index_object_manifest": [2, 9, 11], "verifi": [2, 9], "async_verify_object_manifest": [2, 9, 11], "ingest": [2, 9], "column_to_use_as_guid": [2, 9, 12], "guid_type_for_indexed_file_object": [2, 9, 12], "guid_type_for_non_indexed_file_object": [2, 9, 12], "async_ingest_metadata_manifest": [2, 9, 12], "async_query_urls_from_indexd": [2, 9, 12], "gen3wsstorag": [2, 13], "copi": [2, 13], "download_url": [2, 13], "l": [2, 13], "ls_path": [2, 13], "rm": [2, 13], "rm_path": [2, 13], "upload_url": [2, 13], "modul": [2, 10, 11], "service_loc": [3, 4, 5], "public": [3, 5], "read": [3, 5, 11], "onli": [3, 5, 7, 8, 10, 11], "necessari": [3, 5], "basic": [3, 11, 12], "cred": 3, "async": [3, 4, 5, 9, 11, 12], "hash": [3, 11], "did": 3, "baseid": 3, "urls_metadata": 3, "version": [3, 4, 5], "_ssl": [3, 4, 5], "asynchron": [3, 4, 5], "dict": [3, 4, 5, 10, 11, 12], "eg": 3, "ab167e49d25b488939b1ede42752458b": 3, "associ": [3, 5], "made": 3, "where": [3, 5, 11, 12], "you": [3, 8, 11], "control": 3, "rbac": 3, "name": [3, 4, 8, 10, 11, 12, 13], "addit": [3, 5, 10, 11], "entri": [3, 11], "attach": [3, 5], "each": [3, 8, 10, 11], "group": 3, "previou": [3, 11], "checksum": [3, 10], "checksum_typ": 3, "match": [3, 5, 12], "param": [3, 5, 8, 10], "correspond": 3, "suppli": 3, "need": [3, 7, 10, 11], "handl": [3, 10], "hash_typ": 3, "whether": [3, 4, 5, 8, 11, 12], "ssl": [3, 4, 5], "pattern": [3, 12], "against": [3, 7, 8, 11, 12], "kwarg": [3, 4, 5], "bodi": 3, "dictionari": [3, 4, 5, 7, 8], "format": [3, 5, 8, 11], "blank": 3, "add": [3, 5], "sinc": 3, "content": [3, 13], "immut": 3, "want": [3, 8], "chang": [3, 11], "That": 3, "field": [3, 5, 7, 11, 12], "old": 3, "ad": 3, "least": 3, "one": [3, 5, 10, 11], "suffici": 3, "good": 3, "idea": 3, "number": [3, 7, 8, 11, 12], "noth": [3, 6], "dist_resolut": 3, "true": [3, 4, 5, 6, 7, 8, 10, 11, 12], "alia": [3, 5], "distribut": 3, "identifi": [3, 5, 9, 11], "boolean": 3, "we": [3, 11], "pagin": 3, "fals": [3, 5, 6, 10, 11], "start": [3, 4, 7, 8, 10], "prefix": 3, "rtype": 3, "has_vers": 3, "latest": 3, "exclud": 3, "without": [3, 5], "repres": [3, 5, 10], "info": [3, 11], "algorithm": 3, "count": 3, "valid": [3, 7], "file_st": 3, "like": [3, 5, 9, 11, 12], "signpost": 3, "healthi": [3, 4, 5], "rev": 3, "revis": 3, "simpl": 3, "consist": 3, "mechan": 3, "dispatch": 4, "job_nam": 4, "job_input": 4, "wait": 4, "output": [4, 5, 11, 12], "Will": [4, 7, 10], "sleep": 4, "linear": 4, "delai": 4, "until": [4, 10], "done": 4, "1": [4, 5, 8, 10, 11], "global": [4, 5], "input": [4, 10, 11], "job_id": 4, "previous": 4, "complet": [4, 11], "bool": [4, 5, 8, 10, 11, 12], "md": [5, 7, 10, 12], "admin_endpoint_suffix": 5, "admin": [5, 11], "alias": 5, "overwrit": 5, "what": 5, "end": [5, 10], "up": [5, 9], "blob": [5, 7], "asyncron": 5, "altern": [5, 11], "merg": 5, "AND": 5, "descript": 5, "metadata_list": 5, "specif": [5, 8, 11, 12], "expect": [5, 9, 11], "anoth": 5, "databas": 5, "return_full_metadata": 5, "10": [5, 7, 11], "offset": [5, 7], "0": [5, 7, 8, 11], "use_agg_md": 5, "off": 5, "logic": [5, 12], "filter": [5, 7], "b": [5, 11], "2": [5, 11], "have": [5, 11], "ar": [5, 7, 8, 9, 10, 11], "alwai": 5, "nest": 5, "c": [5, 11], "3": [5, 11], "same": [5, 11, 13], "whose": 5, "ani": [5, 10, 11], "But": 5, "differ": 5, "33": 5, "d": 5, "4": [5, 11], "e": [5, 10], "won": 5, "333": 5, "defin": [5, 8, 10], "api": [5, 8, 11], "just": [5, 11, 12], "max": 5, "num": 5, "OR": 5, "level": 6, "current": [6, 8, 10], "system": [6, 7, 8, 9], "elasticsearch": 7, "query_str": 7, "execut": [7, 8, 11], "graphql": [7, 8], "query_txt": [7, 8], "syntax": 7, "see": [7, 10, 11], "com": 7, "uc": 7, "cdi": 7, "guppi": 7, "master": 7, "doc": [7, 10], "data_typ": 7, "my_index": 7, "my_field": 7, "first": [7, 8], "filter_object": 7, "sort_object": 7, "verbos": [7, 8], "row": [7, 8, 11, 12], "sort": 7, "equal": 7, "respect": 7, "complex": 7, "appli": 7, "One": 7, "unaccess": 7, "regular": 7, "tier": 7, "mode": 7, "subject": [7, 8], "50": 7, "vital_statu": 7, "submitter_id": 7, "aliv": 7, "asc": 7, "sort_field": 7, "raw": [7, 11], "project_id": [7, 8], "my_program": 7, "my_project": 7, "submit": [8, 11], "export": [8, 10], "sheepdog": 8, "through": [8, 11], "peregrin": 8, "sub": 8, "program": [8, 11], "project": [8, 11], "dcf": 8, "node_nam": 8, "batch_siz": 8, "100": [8, 11], "node": 8, "how": [8, 11], "mani": [8, 11], "print": [8, 10], "progress": [8, 10], "log": [8, 10, 11, 12], "ccle": 8, "demograph": 8, "ordered_node_list": 8, "revers": 8, "graph": 8, "experi": 8, "empti": [8, 11], "uuid1": 8, "uuid2": 8, "node_typ": 8, "fileformat": 8, "which": [8, 10], "belong": 8, "either": 8, "tsv": [8, 11, 12], "screen": 8, "sampl": [8, 10], "ccle_sample_nod": 8, "d70b41b9": 8, "6f90": 8, "4714": 8, "8420": 8, "e043ab8b77b9": 8, "ccle_one_record": 8, "entir": 8, "schema": 8, "run": [8, 11], "introspect": 8, "regist": 8, "mark": 8, "open": [8, 10, 11], "mean": 8, "etc": 8, "max_tri": 8, "retri": 8, "fail": [8, 10], "chunk_siz": 8, "30": 8, "row_offset": 8, "spreadsheet": 8, "multipl": [8, 11], "csv": [8, 11, 12], "xlsx": 8, "worksheet": 8, "skip": 8, "data_spreadsheet": 8, "arrai": 8, "action": [9, 11], "These": 9, "broken": 9, "broad": 9, "categori": 9, "task": 9, "relat": 9, "persist": 9, "Such": 9, "mai": [9, 11], "involv": 9, "assign": 9, "everi": [9, 11], "alreadi": 9, "larg": 9, "most": 9, "util": 9, "capabl": 9, "make": [9, 11], "effici": 9, "main": 10, "datafil": 10, "manifest_1": 10, "my_common": 10, "org": 10, "gen3": [10, 11, 12], "my_credenti": 10, "howto": 10, "drsdownload": 10, "drs_download": 10, "download_list": 10, "show_progress": 10, "assist": 10, "minimum": 10, "interest": 10, "object_list": 10, "host": 10, "It": 10, "possibl": 10, "save_directori": 10, "unpack_packag": 10, "delete_unpacked_packag": 10, "directori": [10, 11], "call": [10, 13], "case": 10, "error": [10, 11, 12], "continu": 10, "save": 10, "show": 10, "bar": 10, "disabl": 10, "unpack": 10, "packag": 10, "after": 10, "them": [10, 11], "drs_hostnam": 10, "known": 10, "otherwis": 10, "success": 10, "resolv": 10, "permiss": 10, "wai": 10, "determin": [10, 11, 12], "reason": 10, "pend": 10, "objectid": 10, "datamanag": 10, "occur": 10, "attribut": [10, 11], "drsobjecttyp": 10, "unknown": 10, "factori": 10, "popul": [10, 12], "server": 10, "requir": 10, "byte": 10, "timestamp": 10, "last": 10, "g": 10, "child": 10, "bundl": 10, "self": 10, "indent": 10, "pretti": 10, "In": 10, "similar": 10, "linux": 10, "tree": 10, "command": [10, 11], "typic": 10, "discoveri": 10, "cach": 10, "files": 10, "static": 10, "bownload": 10, "successfulli": 10, "pars": [10, 11, 12, 13], "output_dir": 10, "conveni": 10, "infil": 10, "wrapper": 10, "cli": 10, "process": 11, "coroutin": 11, "asyncio": [11, 12], "librari": 11, "comma": 11, "header": 11, "download_manifest": 11, "per": [11, 12], "maximum": [11, 12], "desir": 11, "concurr": [11, 12], "across": 11, "thread": 11, "folder": 11, "place": 11, "temporari": 11, "write": 11, "safe": 11, "so": 11, "To": 11, "workaround": 11, "concat": 11, "output_filenam": [11, 12], "num_process": 11, "24": [11, 12], "input_manifest": 11, "python_subprocess_command": 11, "root": [11, 12], "domain": [11, 12], "live": [11, 12], "parallel": 11, "hit": 11, "total": 11, "help": 11, "everyth": 11, "attempt": 11, "By": 11, "someth": 11, "maco": 11, "x": 11, "python3": 11, "tab": 11, "session": 11, "column": [11, 12], "shown": 11, "below": 11, "255e396f": 11, "f1f8": 11, "11e9": 11, "9a07": 11, "0a80fada099c": 11, "473d83400bc1bc9dc635e334faddf33c": 11, "363455714": 11, "pdcdatastor": 11, "test1": 11, "0a80fada098c": 11, "473d83400bc1bc9dc635e334faddd33c": 11, "343434344": 11, "test2": 11, "0a80fada097c": 11, "473d83400bc1bc9dc635e334fadd433c": 11, "543434443": 11, "phs0001": 11, "phs0002": 11, "test3": 11, "0a80fada096c": 11, "test4": 11, "0a80fada010c": 11, "473d83400bc1bc9dc635e334fadde33c": 11, "test5": 11, "index_manifest": 11, "usag": 11, "py": 11, "giangb": 11, "planx": 11, "pla": 11, "net": 11, "manifest_fil": [11, 12], "path_to_manifest": 11, "replace_url": 11, "thread_num": 11, "api_kei": 11, "processed_fil": 11, "num_total_fil": 11, "synchron": 11, "warn": 11, "IF": 11, "know": 11, "THE": 11, "implic": 11, "manifest_file_delimit": [11, 12], "submit_additional_metadata_column": 11, "force_metadata_columns_even_if_empti": 11, "loop": 11, "password": [11, 12], "flag": 11, "replac": 11, "delimit": 11, "forc": 11, "creation": 11, "even": 11, "enabl": 11, "illustr": 11, "columna": 11, "columnb": 11, "columnc": 11, "dataa": 11, "datab": 11, "guid_exampl": 11, "md5_hash": 11, "fieldnam": 11, "There": 11, "those": 11, "abov": 11, "overrid": [11, 12], "assum": 11, "behavior": 11, "simpli": 11, "manifest_row_pars": [11, 12], "custom": 11, "import": 11, "verify_manifest": 11, "def": 11, "_get_authz_from_row": 11, "strip": 11, "parser": [11, 12], "verify_object_manifest": 11, "verif": 11, "error_nam": 11, "value_from_manifest": 11, "actual": 11, "value_from_indexd": 11, "93d9af72": 11, "b0f1": 11, "450c": 11, "a5c6": 11, "7d3d8d2083b4": 11, "dev": 11, "test": 11, "_get_acl_from_row": 11, "_get_file_name_from_row": 11, "_get_file_size_from_row": 11, "_get_guid_from_row": 11, "_get_md5_from_row": 11, "_get_urls_from_row": 11, "1692675811": [], "9771066": [], "indexd_field": [11, 12], "func_to_parse_row": [11, 12], "delimet": [11, 12], "metdata": 12, "ingest_manifest": 12, "NOT": 12, "guid_from_fil": 12, "_get_guid_for_row": 12, "indexed_file_object_guid": 12, "_query_for_associated_indexd_record_guid": 12, "guid_for_row": 12, "elsewher": 12, "metadata_sourc": 12, "1692675812": [], "3144128": [], "get_guid_from_fil": 12, "metadata_typ": 12, "dbgap": 12, "usual": 12, "fill": 12, "_guid_typ": 12, "is_indexed_file_object": 12, "lock": 12, "semaphor": 12, "semaphon": 12, "ammount": 12, "connect": 12, "wss": 13, "src_urlstr": 13, "dest_urlstr": 13, "appropri": 13, "src_w": 13, "src_wskei": 13, "dest_path": 13, "disk": 13, "w": 13, "wskei": 13, "ws_urlstr": 13, "form": 13, "src_path": 13, "dest_w": 13, "dest_wskei": 13, "1692676927": [], "2291234": [], "6143494": [], "1692716275": [], "1734753": [], "577429": [], "1692716527": [], "4222114": [], "9511294": [], "1692717039": [], "3338752": [], "744264": [], "1692741377": [], "0982177": [], "4559627": [], "1692743380": [], "4060478": [], "7860734": [], "1692743691": [], "983341": [], "1692743692": [], "4543839": [], "1692825679": [], "249731": [], "5510318": [], "1692886743": [], "381985": [], "8074749": [], "1693592991": [], "493957": [], "9576306": [], "1693593902": [], "1950202": [], "507454": [], "1696860505": [], "0205865": [], "4065857": [], "1696863250": [], "490177": [], "780603": [], "1696863654": [], "490772": [], "8764913": [], "1696866574": [], "146243": [], "4969604": [], "1696867172": [], "15485": [], "4488156": [], "1696870997": [], "41439": [], "7891934": [], "1696874363": [], "5903769": [], "1696874364": [], "0760994": [], "1696874786": [], "0779042": [], "4368396": [], "1696875823": [], "7846825": [], "1696875824": [], "2559378": [], "1696877990": [], "9968846": [], "1696877991": [], "3616166": [], "1696878184": [], "6719804": [], "1696878185": [], "1095488": [], "1696878605": [], "0427673": [], "4048421": [], "1696885653": [], "7007155": [], "1696885654": [], "1520922": [], "1697467909": [], "0874708": [], "51657": [], "1697484656": [], "68711": [], "1697484657": [], "1308327": [], "1700001291": [], "6339526": [], "9630976": [], "1700002025": [], "294231": [], "5915642": [], "1700004267": [], "4130003": [], "8317993": [], "1700005111": [], "074543": [], "4001298": [], "1700005642": [], "8724742": [], "1700005643": [], "1597712": [], "1700499325": [], "4715705": [], "7661629": [], "1700591014": [], "4958894": [], "8457959": [], "1700592493": [], "8351357": [], "1700592494": [], "1116993": [], "1700678708": [], "9883742": [], "1700678709": [], "2699912": [], "1700678999": 11, "9725351": 11, "1700679000": 12, "272037": 12}, "objects": {"gen3.auth": [[0, 0, 1, "", "Gen3Auth"]], "gen3.auth.Gen3Auth": [[0, 1, 1, "", "curl"], [0, 1, 1, "", "get_access_token"], [0, 1, 1, "", "get_access_token_from_wts"], [0, 1, 1, "", "refresh_access_token"]], "gen3.file": [[1, 0, 1, "", "Gen3File"]], "gen3.file.Gen3File": [[1, 1, 1, "", "delete_file"], [1, 1, 1, "", "delete_file_locations"], [1, 1, 1, "", "download_single"], [1, 1, 1, "", "get_presigned_url"], [1, 1, 1, "", "upload_file"], [1, 1, 1, "", "upload_file_to_guid"]], "gen3.index": [[3, 0, 1, "", "Gen3Index"]], "gen3.index.Gen3Index": [[3, 1, 1, "", "async_create_record"], [3, 1, 1, "", "async_get_record"], [3, 1, 1, "", "async_get_records_from_checksum"], [3, 1, 1, "", "async_get_records_on_page"], [3, 1, 1, "", "async_get_with_params"], [3, 1, 1, "", "async_query_urls"], [3, 1, 1, "", "async_update_record"], [3, 1, 1, "", "create_blank"], [3, 1, 1, "", "create_new_version"], [3, 1, 1, "", "create_record"], [3, 1, 1, "", "delete_record"], [3, 1, 1, "", "get"], [3, 1, 1, "", "get_all_records"], [3, 1, 1, "", "get_guids_prefix"], [3, 1, 1, "", "get_latest_version"], [3, 1, 1, "", "get_record"], [3, 1, 1, "", "get_record_doc"], [3, 1, 1, "", "get_records"], [3, 1, 1, "", "get_records_on_page"], [3, 1, 1, "", "get_stats"], [3, 1, 1, "", "get_urls"], [3, 1, 1, "", "get_valid_guids"], [3, 1, 1, "", "get_version"], [3, 1, 1, "", "get_versions"], [3, 1, 1, "", "get_with_params"], [3, 1, 1, "", "is_healthy"], [3, 1, 1, "", "query_urls"], [3, 1, 1, "", "update_blank"], [3, 1, 1, "", "update_record"]], "gen3.jobs": [[4, 0, 1, "", "Gen3Jobs"]], "gen3.jobs.Gen3Jobs": [[4, 1, 1, "", "async_run_job_and_wait"], [4, 1, 1, "", "create_job"], [4, 1, 1, "", "get_output"], [4, 1, 1, "", "get_status"], [4, 1, 1, "", "get_version"], [4, 1, 1, "", "is_healthy"], [4, 1, 1, "", "list_jobs"]], "gen3.metadata": [[5, 0, 1, "", "Gen3Metadata"]], "gen3.metadata.Gen3Metadata": [[5, 1, 1, "", "async_create"], [5, 1, 1, "", "async_create_aliases"], [5, 1, 1, "", "async_delete_alias"], [5, 1, 1, "", "async_delete_aliases"], [5, 1, 1, "", "async_get"], [5, 1, 1, "", "async_get_aliases"], [5, 1, 1, "", "async_update"], [5, 1, 1, "", "async_update_aliases"], [5, 2, 1, "", "auth_provider"], [5, 1, 1, "", "batch_create"], [5, 1, 1, "", "create"], [5, 1, 1, "", "create_aliases"], [5, 1, 1, "", "create_index_key_path"], [5, 1, 1, "", "delete"], [5, 1, 1, "", "delete_alias"], [5, 1, 1, "", "delete_aliases"], [5, 1, 1, "", "delete_index_key_path"], [5, 2, 1, "", "endpoint"], [5, 1, 1, "", "get"], [5, 1, 1, "", "get_aliases"], [5, 1, 1, "", "get_index_key_paths"], [5, 1, 1, "", "get_version"], [5, 1, 1, "", "is_healthy"], [5, 1, 1, "", "query"], [5, 1, 1, "", "update"], [5, 1, 1, "", "update_aliases"]], "gen3.object": [[6, 0, 1, "", "Gen3Object"]], "gen3.object.Gen3Object": [[6, 1, 1, "", "delete_object"]], "gen3.query": [[7, 0, 1, "", "Gen3Query"]], "gen3.query.Gen3Query": [[7, 1, 1, "", "graphql_query"], [7, 1, 1, "", "query"], [7, 1, 1, "", "raw_data_download"]], "gen3.submission": [[8, 0, 1, "", "Gen3Submission"]], "gen3.submission.Gen3Submission": [[8, 1, 1, "", "create_program"], [8, 1, 1, "", "create_project"], [8, 1, 1, "", "delete_node"], [8, 1, 1, "", "delete_nodes"], [8, 1, 1, "", "delete_program"], [8, 1, 1, "", "delete_project"], [8, 1, 1, "", "delete_record"], [8, 1, 1, "", "delete_records"], [8, 1, 1, "", "export_node"], [8, 1, 1, "", "export_record"], [8, 1, 1, "", "get_dictionary_all"], [8, 1, 1, "", "get_dictionary_node"], [8, 1, 1, "", "get_graphql_schema"], [8, 1, 1, "", "get_programs"], [8, 1, 1, "", "get_project_dictionary"], [8, 1, 1, "", "get_project_manifest"], [8, 1, 1, "", "get_projects"], [8, 1, 1, "", "open_project"], [8, 1, 1, "", "query"], [8, 1, 1, "", "submit_file"], [8, 1, 1, "", "submit_record"]], "gen3": [[9, 3, 0, "-", "tools"]], "gen3.tools.download": [[10, 3, 0, "-", "drs_download"]], "gen3.tools.download.drs_download": [[10, 0, 1, "", "DownloadManager"], [10, 0, 1, "", "DownloadStatus"], [10, 0, 1, "", "Downloadable"], [10, 0, 1, "", "Manifest"], [10, 4, 1, "", "download_files_in_drs_manifest"], [10, 4, 1, "", "list_access_in_drs_manifest"], [10, 4, 1, "", "list_drs_object"], [10, 4, 1, "", "list_files_in_drs_manifest"]], "gen3.tools.download.drs_download.DownloadManager": [[10, 1, 1, "", "cache_hosts_wts_tokens"], [10, 1, 1, "", "download"], [10, 1, 1, "", "get_fresh_token"], [10, 1, 1, "", "resolve_objects"], [10, 1, 1, "", "user_access"]], "gen3.tools.download.drs_download.DownloadStatus": [[10, 2, 1, "", "end_time"], [10, 2, 1, "", "start_time"], [10, 2, 1, "", "status"]], "gen3.tools.download.drs_download.Downloadable": [[10, 2, 1, "", "_manager"], [10, 2, 1, "", "access_methods"], [10, 2, 1, "", "children"], [10, 2, 1, "", "created_time"], [10, 1, 1, "", "download"], [10, 2, 1, "", "file_name"], [10, 2, 1, "", "file_size"], [10, 2, 1, "", "hostname"], [10, 2, 1, "", "object_id"], [10, 2, 1, "", "object_type"], [10, 1, 1, "", "pprint"], [10, 2, 1, "", "updated_time"]], "gen3.tools.download.drs_download.Manifest": [[10, 2, 1, "", "commons_url"], [10, 1, 1, "", "create_object_list"], [10, 2, 1, "", "file_name"], [10, 2, 1, "", "file_size"], [10, 1, 1, "", "load"], [10, 1, 1, "", "load_manifest"], [10, 2, 1, "", "md5sum"], [10, 2, 1, "", "object_id"]], "gen3.tools.indexing": [[11, 3, 0, "-", "download_manifest"], [11, 3, 0, "-", "index_manifest"], [11, 3, 0, "-", "verify_manifest"]], "gen3.tools.indexing.download_manifest": [[11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "INDEXD_RECORD_PAGE_SIZE"], [11, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [11, 2, 1, "", "TMP_FOLDER"], [11, 4, 1, "", "async_download_object_manifest"]], "gen3.tools.indexing.index_manifest": [[11, 2, 1, "", "ACLS"], [11, 2, 1, "", "AUTHZ"], [11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "GUID"], [11, 2, 1, "", "MD5"], [11, 2, 1, "", "PREV_GUID"], [11, 2, 1, "", "SIZE"], [11, 0, 1, "", "ThreadControl"], [11, 2, 1, "", "URLS"], [11, 4, 1, "", "delete_all_guids"], [11, 4, 1, "", "index_object_manifest"]], "gen3.tools.indexing.verify_manifest": [[11, 2, 1, "", "CURRENT_DIR"], [11, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [11, 4, 1, "", "async_verify_object_manifest"]], "gen3.tools.metadata": [[12, 3, 0, "-", "ingest_manifest"]], "gen3.tools.metadata.ingest_manifest": [[12, 2, 1, "", "COLUMN_TO_USE_AS_GUID"], [12, 2, 1, "", "GUID_TYPE_FOR_INDEXED_FILE_OBJECT"], [12, 2, 1, "", "GUID_TYPE_FOR_NON_INDEXED_FILE_OBJECT"], [12, 2, 1, "", "MAX_CONCURRENT_REQUESTS"], [12, 4, 1, "", "async_ingest_metadata_manifest"], [12, 4, 1, "", "async_query_urls_from_indexd"]], "gen3.wss": [[13, 0, 1, "", "Gen3WsStorage"]], "gen3.wss.Gen3WsStorage": [[13, 1, 1, "", "copy"], [13, 1, 1, "", "download"], [13, 1, 1, "", "download_url"], [13, 1, 1, "", "ls"], [13, 1, 1, "", "ls_path"], [13, 1, 1, "", "rm"], [13, 1, 1, "", "rm_path"], [13, 1, 1, "", "upload"], [13, 1, 1, "", "upload_url"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:attribute", "3": "py:module", "4": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "module", "Python module"], "4": ["py", "function", "Python function"]}, "titleterms": {"gen3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13], "auth": 0, "helper": 0, "file": 1, "class": [1, 3, 4, 5, 6, 7, 8], "welcom": 2, "sdk": 2, "": 2, "document": 2, "indic": 2, "tabl": 2, "index": [3, 11], "job": 4, "metadata": [5, 12], "object": 6, "queri": 7, "submiss": 8, "tool": [9, 10, 11, 12], "dr": 10, "download": [10, 11], "verifi": 11, "ingest": 12, "workspac": 13, "storag": 13}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Gen3 Auth Helper": [[0, "gen3-auth-helper"]], "Gen3 File Class": [[1, "gen3-file-class"]], "Welcome to Gen3 SDK\u2019s documentation!": [[2, "welcome-to-gen3-sdk-s-documentation"]], "Indices and tables": [[2, "indices-and-tables"]], "Gen3 Index Class": [[3, "gen3-index-class"]], "Gen3 Jobs Class": [[4, "gen3-jobs-class"]], "Gen3 Metadata Class": [[5, "gen3-metadata-class"]], "Gen3 Object Class": [[6, "gen3-object-class"]], "Gen3 Query Class": [[7, "gen3-query-class"]], "Gen3 Submission Class": [[8, "gen3-submission-class"]], "Gen3 Tools": [[9, "gen3-tools"]], "DRS Download Tools": [[10, "module-gen3.tools.download.drs_download"]], "Indexing Tools": [[11, "indexing-tools"]], "Download": [[11, "module-gen3.tools.indexing.download_manifest"]], "Index": [[11, "module-gen3.tools.indexing.index_manifest"]], "Verify": [[11, "module-gen3.tools.indexing.verify_manifest"]], "Metadata Tools": [[12, "metadata-tools"]], "Ingest": [[12, "module-gen3.tools.metadata.ingest_manifest"]], "Gen3 Workspace Storage": [[13, "gen3-workspace-storage"]]}, "indexentries": {"gen3auth (class in gen3.auth)": [[0, "gen3.auth.Gen3Auth"]], "curl() (gen3.auth.gen3auth method)": [[0, "gen3.auth.Gen3Auth.curl"]], "get_access_token() (gen3.auth.gen3auth method)": [[0, "gen3.auth.Gen3Auth.get_access_token"]], "get_access_token_from_wts() (gen3.auth.gen3auth method)": [[0, "gen3.auth.Gen3Auth.get_access_token_from_wts"]], "refresh_access_token() (gen3.auth.gen3auth method)": [[0, "gen3.auth.Gen3Auth.refresh_access_token"]], "gen3file (class in gen3.file)": [[1, "gen3.file.Gen3File"]], "delete_file() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.delete_file"]], "delete_file_locations() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.delete_file_locations"]], "download_single() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.download_single"]], "get_presigned_url() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.get_presigned_url"]], "upload_file() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.upload_file"]], "upload_file_to_guid() (gen3.file.gen3file method)": [[1, "gen3.file.Gen3File.upload_file_to_guid"]], "gen3index (class in gen3.index)": [[3, "gen3.index.Gen3Index"]], "async_create_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_create_record"]], "async_get_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_get_record"]], "async_get_records_from_checksum() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_get_records_from_checksum"]], "async_get_records_on_page() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_get_records_on_page"]], "async_get_with_params() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_get_with_params"]], "async_query_urls() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_query_urls"]], "async_update_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.async_update_record"]], "create_blank() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.create_blank"]], "create_new_version() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.create_new_version"]], "create_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.create_record"]], "delete_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.delete_record"]], "get() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get"]], "get_all_records() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_all_records"]], "get_guids_prefix() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_guids_prefix"]], "get_latest_version() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_latest_version"]], "get_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_record"]], "get_record_doc() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_record_doc"]], "get_records() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_records"]], "get_records_on_page() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_records_on_page"]], "get_stats() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_stats"]], "get_urls() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_urls"]], "get_valid_guids() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_valid_guids"]], "get_version() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_version"]], "get_versions() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_versions"]], "get_with_params() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.get_with_params"]], "is_healthy() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.is_healthy"]], "query_urls() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.query_urls"]], "update_blank() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.update_blank"]], "update_record() (gen3.index.gen3index method)": [[3, "gen3.index.Gen3Index.update_record"]], "gen3jobs (class in gen3.jobs)": [[4, "gen3.jobs.Gen3Jobs"]], "async_run_job_and_wait() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.async_run_job_and_wait"]], "create_job() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.create_job"]], "get_output() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.get_output"]], "get_status() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.get_status"]], "get_version() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.get_version"]], "is_healthy() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.is_healthy"]], "list_jobs() (gen3.jobs.gen3jobs method)": [[4, "gen3.jobs.Gen3Jobs.list_jobs"]], "gen3metadata (class in gen3.metadata)": [[5, "gen3.metadata.Gen3Metadata"]], "async_create() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_create"]], "async_create_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_create_aliases"]], "async_delete_alias() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_delete_alias"]], "async_delete_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_delete_aliases"]], "async_get() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_get"]], "async_get_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_get_aliases"]], "async_update() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_update"]], "async_update_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.async_update_aliases"]], "auth_provider (gen3.metadata.gen3metadata attribute)": [[5, "gen3.metadata.Gen3Metadata.auth_provider"]], "batch_create() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.batch_create"]], "create() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.create"]], "create_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.create_aliases"]], "create_index_key_path() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.create_index_key_path"]], "delete() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.delete"]], "delete_alias() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.delete_alias"]], "delete_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.delete_aliases"]], "delete_index_key_path() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.delete_index_key_path"]], "endpoint (gen3.metadata.gen3metadata attribute)": [[5, "gen3.metadata.Gen3Metadata.endpoint"]], "get() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.get"]], "get_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.get_aliases"]], "get_index_key_paths() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.get_index_key_paths"]], "get_version() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.get_version"]], "is_healthy() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.is_healthy"]], "query() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.query"]], "update() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.update"]], "update_aliases() (gen3.metadata.gen3metadata method)": [[5, "gen3.metadata.Gen3Metadata.update_aliases"]], "gen3object (class in gen3.object)": [[6, "gen3.object.Gen3Object"]], "delete_object() (gen3.object.gen3object method)": [[6, "gen3.object.Gen3Object.delete_object"]], "gen3query (class in gen3.query)": [[7, "gen3.query.Gen3Query"]], "graphql_query() (gen3.query.gen3query method)": [[7, "gen3.query.Gen3Query.graphql_query"]], "query() (gen3.query.gen3query method)": [[7, "gen3.query.Gen3Query.query"]], "raw_data_download() (gen3.query.gen3query method)": [[7, "gen3.query.Gen3Query.raw_data_download"]], "gen3submission (class in gen3.submission)": [[8, "gen3.submission.Gen3Submission"]], "create_program() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.create_program"]], "create_project() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.create_project"]], "delete_node() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_node"]], "delete_nodes() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_nodes"]], "delete_program() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_program"]], "delete_project() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_project"]], "delete_record() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_record"]], "delete_records() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.delete_records"]], "export_node() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.export_node"]], "export_record() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.export_record"]], "get_dictionary_all() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_dictionary_all"]], "get_dictionary_node() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_dictionary_node"]], "get_graphql_schema() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_graphql_schema"]], "get_programs() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_programs"]], "get_project_dictionary() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_project_dictionary"]], "get_project_manifest() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_project_manifest"]], "get_projects() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.get_projects"]], "open_project() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.open_project"]], "query() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.query"]], "submit_file() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.submit_file"]], "submit_record() (gen3.submission.gen3submission method)": [[8, "gen3.submission.Gen3Submission.submit_record"]], "gen3.tools": [[9, "module-gen3.tools"]], "module": [[9, "module-gen3.tools"], [10, "module-gen3.tools.download.drs_download"], [11, "module-gen3.tools.indexing.download_manifest"], [11, "module-gen3.tools.indexing.index_manifest"], [11, "module-gen3.tools.indexing.verify_manifest"], [12, "module-gen3.tools.metadata.ingest_manifest"]], "downloadmanager (class in gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.DownloadManager"]], "downloadstatus (class in gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.DownloadStatus"]], "downloadable (class in gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.Downloadable"]], "manifest (class in gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.Manifest"]], "_manager (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable._manager"]], "access_methods (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.access_methods"]], "cache_hosts_wts_tokens() (gen3.tools.download.drs_download.downloadmanager method)": [[10, "gen3.tools.download.drs_download.DownloadManager.cache_hosts_wts_tokens"]], "children (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.children"]], "commons_url (gen3.tools.download.drs_download.manifest attribute)": [[10, "gen3.tools.download.drs_download.Manifest.commons_url"]], "create_object_list() (gen3.tools.download.drs_download.manifest static method)": [[10, "gen3.tools.download.drs_download.Manifest.create_object_list"]], "created_time (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.created_time"]], "download() (gen3.tools.download.drs_download.downloadmanager method)": [[10, "gen3.tools.download.drs_download.DownloadManager.download"]], "download() (gen3.tools.download.drs_download.downloadable method)": [[10, "gen3.tools.download.drs_download.Downloadable.download"]], "download_files_in_drs_manifest() (in module gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.download_files_in_drs_manifest"]], "end_time (gen3.tools.download.drs_download.downloadstatus attribute)": [[10, "gen3.tools.download.drs_download.DownloadStatus.end_time"]], "file_name (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.file_name"]], "file_name (gen3.tools.download.drs_download.manifest attribute)": [[10, "gen3.tools.download.drs_download.Manifest.file_name"]], "file_size (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.file_size"]], "file_size (gen3.tools.download.drs_download.manifest attribute)": [[10, "gen3.tools.download.drs_download.Manifest.file_size"]], "gen3.tools.download.drs_download": [[10, "module-gen3.tools.download.drs_download"]], "get_fresh_token() (gen3.tools.download.drs_download.downloadmanager method)": [[10, "gen3.tools.download.drs_download.DownloadManager.get_fresh_token"]], "hostname (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.hostname"]], "list_access_in_drs_manifest() (in module gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.list_access_in_drs_manifest"]], "list_drs_object() (in module gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.list_drs_object"]], "list_files_in_drs_manifest() (in module gen3.tools.download.drs_download)": [[10, "gen3.tools.download.drs_download.list_files_in_drs_manifest"]], "load() (gen3.tools.download.drs_download.manifest static method)": [[10, "gen3.tools.download.drs_download.Manifest.load"]], "load_manifest() (gen3.tools.download.drs_download.manifest static method)": [[10, "gen3.tools.download.drs_download.Manifest.load_manifest"]], "md5sum (gen3.tools.download.drs_download.manifest attribute)": [[10, "gen3.tools.download.drs_download.Manifest.md5sum"]], "object_id (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.object_id"]], "object_id (gen3.tools.download.drs_download.manifest attribute)": [[10, "gen3.tools.download.drs_download.Manifest.object_id"]], "object_type (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.object_type"]], "pprint() (gen3.tools.download.drs_download.downloadable method)": [[10, "gen3.tools.download.drs_download.Downloadable.pprint"]], "resolve_objects() (gen3.tools.download.drs_download.downloadmanager method)": [[10, "gen3.tools.download.drs_download.DownloadManager.resolve_objects"]], "start_time (gen3.tools.download.drs_download.downloadstatus attribute)": [[10, "gen3.tools.download.drs_download.DownloadStatus.start_time"]], "status (gen3.tools.download.drs_download.downloadstatus attribute)": [[10, "gen3.tools.download.drs_download.DownloadStatus.status"]], "updated_time (gen3.tools.download.drs_download.downloadable attribute)": [[10, "gen3.tools.download.drs_download.Downloadable.updated_time"]], "user_access() (gen3.tools.download.drs_download.downloadmanager method)": [[10, "gen3.tools.download.drs_download.DownloadManager.user_access"]], "acls (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.ACLS"]], "authz (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.AUTHZ"]], "current_dir (in module gen3.tools.indexing.download_manifest)": [[11, "gen3.tools.indexing.download_manifest.CURRENT_DIR"]], "current_dir (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.CURRENT_DIR"]], "current_dir (in module gen3.tools.indexing.verify_manifest)": [[11, "gen3.tools.indexing.verify_manifest.CURRENT_DIR"]], "guid (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.GUID"]], "indexd_record_page_size (in module gen3.tools.indexing.download_manifest)": [[11, "gen3.tools.indexing.download_manifest.INDEXD_RECORD_PAGE_SIZE"]], "max_concurrent_requests (in module gen3.tools.indexing.download_manifest)": [[11, "gen3.tools.indexing.download_manifest.MAX_CONCURRENT_REQUESTS"]], "max_concurrent_requests (in module gen3.tools.indexing.verify_manifest)": [[11, "gen3.tools.indexing.verify_manifest.MAX_CONCURRENT_REQUESTS"]], "md5 (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.MD5"]], "prev_guid (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.PREV_GUID"]], "size (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.SIZE"]], "tmp_folder (in module gen3.tools.indexing.download_manifest)": [[11, "gen3.tools.indexing.download_manifest.TMP_FOLDER"]], "threadcontrol (class in gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.ThreadControl"]], "urls (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.URLS"]], "async_download_object_manifest() (in module gen3.tools.indexing.download_manifest)": [[11, "gen3.tools.indexing.download_manifest.async_download_object_manifest"]], "async_verify_object_manifest() (in module gen3.tools.indexing.verify_manifest)": [[11, "gen3.tools.indexing.verify_manifest.async_verify_object_manifest"]], "delete_all_guids() (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.delete_all_guids"]], "gen3.tools.indexing.download_manifest": [[11, "module-gen3.tools.indexing.download_manifest"]], "gen3.tools.indexing.index_manifest": [[11, "module-gen3.tools.indexing.index_manifest"]], "gen3.tools.indexing.verify_manifest": [[11, "module-gen3.tools.indexing.verify_manifest"]], "index_object_manifest() (in module gen3.tools.indexing.index_manifest)": [[11, "gen3.tools.indexing.index_manifest.index_object_manifest"]], "column_to_use_as_guid (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.COLUMN_TO_USE_AS_GUID"]], "guid_type_for_indexed_file_object (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.GUID_TYPE_FOR_INDEXED_FILE_OBJECT"]], "guid_type_for_non_indexed_file_object (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.GUID_TYPE_FOR_NON_INDEXED_FILE_OBJECT"]], "max_concurrent_requests (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.MAX_CONCURRENT_REQUESTS"]], "async_ingest_metadata_manifest() (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.async_ingest_metadata_manifest"]], "async_query_urls_from_indexd() (in module gen3.tools.metadata.ingest_manifest)": [[12, "gen3.tools.metadata.ingest_manifest.async_query_urls_from_indexd"]], "gen3.tools.metadata.ingest_manifest": [[12, "module-gen3.tools.metadata.ingest_manifest"]], "gen3wsstorage (class in gen3.wss)": [[13, "gen3.wss.Gen3WsStorage"]], "copy() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.copy"]], "download() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.download"]], "download_url() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.download_url"]], "ls() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.ls"]], "ls_path() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.ls_path"]], "rm() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.rm"]], "rm_path() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.rm_path"]], "upload() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.upload"]], "upload_url() (gen3.wss.gen3wsstorage method)": [[13, "gen3.wss.Gen3WsStorage.upload_url"]]}}) \ No newline at end of file diff --git a/docs/_build/html/submission.html b/docs/_build/html/submission.html index fa2351ef5..4223c0a83 100644 --- a/docs/_build/html/submission.html +++ b/docs/_build/html/submission.html @@ -1,19 +1,16 @@ - - + - + Gen3 Submission Class — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,10 +32,10 @@
                -

                Gen3 Submission Class

                +

                Gen3 Submission Class

                -class gen3.submission.Gen3Submission(endpoint=None, auth_provider=None)[source]
                +class gen3.submission.Gen3Submission(endpoint=None, auth_provider=None)[source]

                Bases: object

                Submit/Export/Query data from a Gen3 Submission system.

                A class for interacting with the Gen3 submission services. @@ -58,7 +55,7 @@

                Gen3 Submission Class
                -create_program(json)[source]
                +create_program(json)[source]

                Create a program. :param json: The json of the program to create :type json: object

                @@ -71,7 +68,7 @@

                Gen3 Submission Class
                -create_project(program, json)[source]
                +create_project(program, json)[source]

                Create a project. :param program: The program to create a project on :type program: str @@ -86,7 +83,7 @@

                Gen3 Submission Class
                -delete_node(program, project, node_name, batch_size=100, verbose=True)[source]
                +delete_node(program, project, node_name, batch_size=100, verbose=True)[source]

                Delete all records for a node from a project.

                Parameters:
                @@ -112,7 +109,7 @@

                Gen3 Submission Class
                -delete_nodes(program, project, ordered_node_list, batch_size=100, verbose=True)[source]
                +delete_nodes(program, project, ordered_node_list, batch_size=100, verbose=True)[source]

                Delete all records for a list of nodes from a project.

                Parameters:
                @@ -138,7 +135,7 @@

                Gen3 Submission Class
                -delete_program(program)[source]
                +delete_program(program)[source]

                Delete a program.

                This deletes an empty program from the commons.

                @@ -155,7 +152,7 @@

                Gen3 Submission Class
                -delete_project(program, project)[source]
                +delete_project(program, project)[source]

                Delete a project.

                This deletes an empty project from the commons.

                @@ -175,7 +172,7 @@

                Gen3 Submission Class
                -delete_record(program, project, uuid)[source]
                +delete_record(program, project, uuid)[source]

                Delete a record from a project.

                Parameters:
                @@ -195,7 +192,7 @@

                Gen3 Submission Class
                -delete_records(program, project, uuids, batch_size=100)[source]
                +delete_records(program, project, uuids, batch_size=100)[source]

                Delete a list of records from a project.

                Parameters:
                @@ -218,7 +215,7 @@

                Gen3 Submission Class
                -export_node(program, project, node_type, fileformat, filename=None)[source]
                +export_node(program, project, node_type, fileformat, filename=None)[source]

                Export all records in a single node type of a project.

                Parameters:
                @@ -240,7 +237,7 @@

                Gen3 Submission Class
                -export_record(program, project, uuid, fileformat, filename=None)[source]
                +export_record(program, project, uuid, fileformat, filename=None)[source]

                Export a single record into json.

                Parameters:
                @@ -262,7 +259,7 @@

                Gen3 Submission Class
                -get_dictionary_all()[source]
                +get_dictionary_all()[source]

                Returns the entire dictionary object for a commons.

                This gets a json of the current dictionary schema for a commons.

                Examples

                @@ -274,7 +271,7 @@

                Gen3 Submission Class
                -get_dictionary_node(node_type)[source]
                +get_dictionary_node(node_type)[source]

                Returns the dictionary schema for a specific node.

                This gets the current json dictionary schema for a specific node type in a commons.

                @@ -291,7 +288,7 @@

                Gen3 Submission Class
                -get_graphql_schema()[source]
                +get_graphql_schema()[source]

                Returns the GraphQL schema for a commons.

                This runs the GraphQL introspection query against a commons and returns the results.

                Examples

                @@ -303,13 +300,13 @@

                Gen3 Submission Class
                -get_programs()[source]
                +get_programs()[source]

                List registered programs

                -get_project_dictionary(program, project)[source]
                +get_project_dictionary(program, project)[source]

                Get dictionary schema for a given project

                Parameters:
                @@ -327,7 +324,7 @@

                Gen3 Submission Class
                -get_project_manifest(program, project)[source]
                +get_project_manifest(program, project)[source]

                Get a projects file manifest

                Parameters:
                @@ -345,7 +342,7 @@

                Gen3 Submission Class
                -get_projects(program)[source]
                +get_projects(program)[source]

                List registered projects for a given program

                Parameters:
                @@ -361,7 +358,7 @@

                Gen3 Submission Class
                -open_project(program, project)[source]
                +open_project(program, project)[source]

                Mark a project open. Opening a project means uploads, deletions, etc. are allowed.

                Parameters:
                @@ -379,7 +376,7 @@

                Gen3 Submission Class
                -query(query_txt, variables=None, max_tries=1)[source]
                +query(query_txt, variables=None, max_tries=1)[source]

                Execute a GraphQL query against a Data Commons.

                Parameters:
                @@ -401,7 +398,7 @@

                Gen3 Submission Class
                -submit_file(project_id, filename, chunk_size=30, row_offset=0)[source]
                +submit_file(project_id, filename, chunk_size=30, row_offset=0)[source]

                Submit data in a spreadsheet file containing multiple records in rows to a Gen3 Data Commons.

                Parameters:
                @@ -422,7 +419,7 @@

                Gen3 Submission Class
                -submit_record(program, project, json)[source]
                +submit_record(program, project, json)[source]

                Submit record(s) to a project as json.

                Parameters:
                @@ -476,7 +473,33 @@

                Navigation

              • Gen3 Metadata Class
              • Gen3 Object Class
              • Gen3 Query Class
              • -
              • Gen3 Submission Class
              • +
              • Gen3 Submission Class +
              • Gen3 Tools
              • Gen3 Workspace Storage
              diff --git a/docs/_build/html/tools.html b/docs/_build/html/tools.html index 151fe5cc7..00687b817 100644 --- a/docs/_build/html/tools.html +++ b/docs/_build/html/tools.html @@ -1,19 +1,16 @@ - - + - + Gen3 Tools — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,22 +32,101 @@
              -

              Gen3 Tools

              +

              Gen3 Tools

              Tools and functions for common actions in Gen3. These tools are broken up into broad categories like indexing (for tasks related to the file object persistent identifiers within the system) and metadata (for tasks relating to file object metadata within the system).

              Such common indexing tasks may involve indexing file object URLs into Gen3 to assign persistent identifiers, downloading a manifest of every file object that already exists, and verifying that a Gen3 instance contains the expected indexed file objects based on a file.

              For metadata, the task may be ingesting a large amount of metadata from a file into the system.

              Most of these tools utilize async capabilities of Python to make common tasks more efficient.

              diff --git a/docs/_build/html/tools/drs_pull.html b/docs/_build/html/tools/drs_pull.html index 225603fc8..002337aae 100644 --- a/docs/_build/html/tools/drs_pull.html +++ b/docs/_build/html/tools/drs_pull.html @@ -1,19 +1,16 @@ - - + - + DRS Download Tools — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,7 +32,7 @@
              -

              DRS Download Tools

              +

              DRS Download Tools

              Module for downloading and listing JSON DRS manifest and DRS objects. The main classes in this module for downloading DRS objects are DownloadManager and Manifest.

              @@ -56,18 +53,18 @@
              -class gen3.tools.download.drs_download.DownloadManager(hostname: str, auth: Gen3Auth, download_list: List[Downloadable], show_progress: bool = False)[source]
              +class gen3.tools.download.drs_download.DownloadManager(hostname: str, auth: Gen3Auth, download_list: List[Downloadable], show_progress: bool = False)[source]

              Class to assist in downloading a list of Downloadable object which at a minimum is a json manifest of DRS object ids. The methods of interest are download and user_access.

              -cache_hosts_wts_tokens(object_list)[source]
              +cache_hosts_wts_tokens(object_list)[source]

              Using the list of DRS host obtain a WTS token for all DRS hosts in the list. It’s is possible

              -download(object_list: List[Downloadable], save_directory: str = '.', show_progress: bool = False, unpack_packages: bool = True, delete_unpacked_packages: bool = False) Dict[str, Any][source]
              +download(object_list: List[Downloadable], save_directory: str = '.', show_progress: bool = False, unpack_packages: bool = True, delete_unpacked_packages: bool = False) Dict[str, Any][source]

              Downloads objects to the directory or current working directory. The input is an list of Downloadable object created by loading a manifest using the Manifest class or a call to Manifest.load(…

              @@ -93,7 +90,7 @@
              -get_fresh_token(drs_hostname: str) Optional[str][source]
              +get_fresh_token(drs_hostname: str) str | None[source]

              Will return and/or refresh and return a WTS token if hostname is known otherwise returns None. :param drs_hostname: hostname to get token for :type drs_hostname: str

              @@ -106,7 +103,7 @@
              -resolve_objects(object_list: List[Downloadable], show_progress: bool)[source]
              +resolve_objects(object_list: List[Downloadable], show_progress: bool)[source]

              Given an Downloadable object list, resolve the DRS hostnames and update each Downloadable

              Parameters:
              @@ -117,7 +114,7 @@
              -user_access()[source]
              +user_access()[source]

              List the user’s access permissions on each host needed to download DRS objects in the manifest. A useful way to determine if access permissions are one reason a download failed.

              @@ -132,7 +129,7 @@
              -class gen3.tools.download.drs_download.DownloadStatus(filename: str, status: str = 'pending', start_time: Optional[datetime] = None, end_time: Optional[datetime] = None)[source]
              +class gen3.tools.download.drs_download.DownloadStatus(filename: str, status: str = 'pending', start_time: datetime | None = None, end_time: datetime | None = None)[source]

              Stores the download status of objectIDs.

              The DataManager will return a list of DownloadStatus as a result of calling the download method

              Status is “pending” until it is downloaded or an error occurs. @@ -147,7 +144,7 @@

              -status
              +status

              status of file download initially “pending”

              Type:
              @@ -158,7 +155,7 @@
              -start_time
              +start_time

              start time of download as datetime initially None

              Type:
              @@ -169,7 +166,7 @@
              -end_time
              +end_time

              end time of download as datetime initially None

              Type:
              @@ -182,12 +179,12 @@
              -class gen3.tools.download.drs_download.Downloadable(object_id: str, object_type: ~typing.Optional[~gen3.tools.download.drs_download.DRSObjectType] = DRSObjectType.unknown, hostname: ~typing.Optional[str] = None, file_size: ~typing.Optional[int] = -1, file_name: ~typing.Optional[str] = None, updated_time: ~typing.Optional[~datetime.datetime] = None, created_time: ~typing.Optional[~datetime.datetime] = None, access_methods: ~typing.List[~typing.Dict[str, ~typing.Any]] = <factory>, children: ~typing.List[~gen3.tools.download.drs_download.Downloadable] = <factory>)[source]
              +class gen3.tools.download.drs_download.Downloadable(object_id: str, object_type: ~gen3.tools.download.drs_download.DRSObjectType | None = DRSObjectType.unknown, hostname: str | None = None, file_size: int | None = -1, file_name: str | None = None, updated_time: ~datetime.datetime | None = None, created_time: ~datetime.datetime | None = None, access_methods: ~typing.List[~typing.Dict[str, ~typing.Any]] = <factory>, children: ~typing.List[~gen3.tools.download.drs_download.Downloadable] = <factory>)[source]

              Class handling the information for a DRS object. The information is populated from the manifest or by retrieving the information from a DRS server.

              -object_id
              +object_id

              DRS object id (REQUIRED)

              Type:
              @@ -198,7 +195,7 @@
              -object_type
              +object_type

              type of DRS object

              Type:
              @@ -209,7 +206,7 @@
              -hostname
              +hostname

              hostname of DRS object

              Type:
              @@ -220,7 +217,7 @@
              -file_size
              +file_size

              size in bytes

              Type:
              @@ -231,7 +228,7 @@
              -file_name
              +file_name

              name of file

              Type:
              @@ -242,7 +239,7 @@
              -updated_time
              +updated_time

              timestamp of last update to file

              Type:
              @@ -253,7 +250,7 @@
              -created_time
              +created_time

              timestamp when file is created

              Type:
              @@ -264,7 +261,7 @@
              -access_methods
              +access_methods

              list of access methods (e.g. s3) for DRS object

              Type:
              @@ -275,7 +272,7 @@
              -children
              +children

              list of child objects (in the case of DRS bundles)

              Type:
              @@ -286,7 +283,7 @@
              -_manager
              +_manager

              manager for this Downloadable

              Type:
              @@ -297,13 +294,13 @@
              -download()[source]
              +download()[source]

              calls the manager to download this object. Allows Downloadables to be self downloading

              -pprint(indent: str = '')[source]
              +pprint(indent: str = '')[source]

              Pretty prints the object information. This is used for listing an object. In the case of a DRS bundle the child objects are listed similar to the linux tree command

              @@ -312,13 +309,13 @@
              -class gen3.tools.download.drs_download.Manifest(object_id: str, file_size: Optional[int] = -1, file_name: Optional[str] = None, md5sum: Optional[str] = None, commons_url: Optional[str] = None)[source]
              +class gen3.tools.download.drs_download.Manifest(object_id: str, file_size: int | None = -1, file_name: str | None = None, md5sum: str | None = None, commons_url: str | None = None)[source]

              Data class representing a Gen3 JSON manifest typically exported from a Gen3 discovery page.

              The class is passed to the DownloadManager to download or list all of the files in the manifest. The Download manager will cache additional information (if available)

              -object_id
              +object_id

              the DRS object id. This is the only attribute that needs to be defined

              Type:
              @@ -329,7 +326,7 @@
              -file_size
              +file_size

              the filesize of the object, if contained in the manifest

              Type:
              @@ -340,7 +337,7 @@
              -file_name
              +file_name

              the name of the file pointed to by the DRS object id

              Type:
              @@ -351,7 +348,7 @@
              -md5sum
              +md5sum

              the checksum of the object

              Type:
              @@ -362,7 +359,7 @@
              -commons_url
              +commons_url

              url of the indexd server to retrieve file/bundle from

              Type:
              @@ -373,7 +370,7 @@
              -static create_object_list(manifest) List[Downloadable][source]
              +static create_object_list(manifest) List[Downloadable][source]

              Create a list of Downloadable instances from the manifest

              Parameters:
              @@ -387,7 +384,7 @@
              -static load(filename: Path) Optional[List[Downloadable]][source]
              +static load(filename: Path) List[Downloadable] | None[source]

              Method to load a json manifest and return a list of Bownloadable object. This list is passed to the DownloadManager methods of download, and list

              @@ -402,36 +399,15 @@
              -static load_manifest(path: Path)[source]
              +static load_manifest(path: Path)[source]

              Loads a json manifest

              -
              -
              -gen3.tools.download.drs_download.download_drs_object(hostname, auth, object_id, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False) None[source]
              -

              A convenience function used to download a single DRS object. -:param hostname: hostname of Gen3 commons to use for access and WTS -:type hostname: str -:param auth: Gen3 Auth instance -:param object_id: DRS object id -:type object_id: str -:param output_dir: directory to save downloaded files to -:param unpack_packages: set to False to disable the unpacking of downloaded packages -:type unpack_packages: bool -:param delete_unpacked_packages: set to True to delete package files after unpacking them -:type delete_unpacked_packages: bool

              -
              -
              Returns:
              -

              List of DownloadStatus objects for the DRS object

              -
              -
              -
              -
              -gen3.tools.download.drs_download.download_files_in_drs_manifest(hostname, auth, infile, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False) None[source]
              +gen3.tools.download.drs_download.download_files_in_drs_manifest(hostname, auth, infile, output_dir, show_progress=True, unpack_packages=True, delete_unpacked_packages=False) None[source]

              A convenience function used to download a json manifest. :param hostname: hostname of Gen3 commons to use for access and WTS :type hostname: str @@ -449,7 +425,7 @@

              -gen3.tools.download.drs_download.list_access_in_drs_manifest(hostname, auth, infile) bool[source]
              +gen3.tools.download.drs_download.list_access_in_drs_manifest(hostname, auth, infile) bool[source]

              A convenience function to list a users access for all DRS hostname in a manifest. :param hostname: hostname of Gen3 commons to use for access and WTS :type hostname: str @@ -465,7 +441,7 @@

              -gen3.tools.download.drs_download.list_drs_object(hostname, auth, object_id: str) bool[source]
              +gen3.tools.download.drs_download.list_drs_object(hostname, auth, object_id: str) bool[source]

              A convenience function used to list a DRS object. :param hostname: hostname of Gen3 commons to use for access and WTS :type hostname: str @@ -481,7 +457,7 @@

              -gen3.tools.download.drs_download.list_files_in_drs_manifest(hostname, auth, infile: str) bool[source]
              +gen3.tools.download.drs_download.list_files_in_drs_manifest(hostname, auth, infile: str) bool[source]

              A wrapper function used by the cli to list files in a manifest. :param hostname: hostname of Gen3 commons to use for access and WTS :type hostname: str @@ -531,7 +507,53 @@

              Navigation

            • Gen3 Query Class
            • Gen3 Submission Class
            • Gen3 Tools diff --git a/docs/_build/html/tools/indexing.html b/docs/_build/html/tools/indexing.html index 5ed63912f..e93f4ffa9 100644 --- a/docs/_build/html/tools/indexing.html +++ b/docs/_build/html/tools/indexing.html @@ -1,19 +1,16 @@ - - + - + Indexing Tools — Gen3 SDK documentation - - - - - - - + + + + + @@ -35,9 +32,9 @@
              -

              Indexing Tools

              +

              Indexing Tools

              -

              Download

              +

              Download

              Module for indexing actions for downloading a manifest of indexed file objects (against indexd’s API). Supports multiple processes and coroutines using Python’s asyncio library.

              @@ -47,7 +44,7 @@

              Indexing Tools
              -gen3.tools.indexing.download_manifest.CURRENT_DIR
              +gen3.tools.indexing.download_manifest.CURRENT_DIR

              directory this file is in

              Type:
              @@ -58,7 +55,7 @@

              Indexing Tools
              -gen3.tools.indexing.download_manifest.INDEXD_RECORD_PAGE_SIZE
              +gen3.tools.indexing.download_manifest.INDEXD_RECORD_PAGE_SIZE

              number of records to request per page

              Type:
              @@ -69,7 +66,7 @@

              Indexing Tools
              -gen3.tools.indexing.download_manifest.MAX_CONCURRENT_REQUESTS
              +gen3.tools.indexing.download_manifest.MAX_CONCURRENT_REQUESTS

              maximum number of desired concurrent requests across processes/threads

              @@ -81,7 +78,7 @@

              Indexing Tools
              -gen3.tools.indexing.download_manifest.TMP_FOLDER
              +gen3.tools.indexing.download_manifest.TMP_FOLDER

              Folder directory for placing temporary files NOTE - We have to use a temporary folder b/c Python’s file writing is not

              @@ -98,7 +95,7 @@

              Indexing Tools
              -async gen3.tools.indexing.download_manifest.async_download_object_manifest(commons_url, output_filename='object-manifest.csv', num_processes=4, max_concurrent_requests=24, input_manifest=None)[source]
              +async gen3.tools.indexing.download_manifest.async_download_object_manifest(commons_url, output_filename='object-manifest.csv', num_processes=4, max_concurrent_requests=24, input_manifest=None, python_subprocess_command='python')[source]

              Download all file object records into a manifest csv

              Parameters:
              @@ -113,6 +110,10 @@

              Indexing Tools -

              Index

              +

              Index

              Module for indexing object files in a manifest (against indexd’s API).

              The default manifest format created is a Tab-Separated Value file (tsv) with rows for every record.

              @@ -135,7 +136,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.CURRENT_DIR
              +gen3.tools.indexing.index_manifest.CURRENT_DIR

              directory this file is in

              Type:
              @@ -146,7 +147,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.GUID
              +gen3.tools.indexing.index_manifest.GUID

              supported file id column names

              Type:
              @@ -157,7 +158,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.SIZE
              +gen3.tools.indexing.index_manifest.SIZE

              supported file size column names

              Type:
              @@ -168,7 +169,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.MD5
              +gen3.tools.indexing.index_manifest.MD5

              supported md5 hash column names

              Type:
              @@ -179,7 +180,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.ACLS
              +gen3.tools.indexing.index_manifest.ACLS

              supported acl column names

              Type:
              @@ -190,7 +191,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.URLS
              +gen3.tools.indexing.index_manifest.URLS

              supported url column names

              Type:
              @@ -201,7 +202,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.AUTHZ
              +gen3.tools.indexing.index_manifest.AUTHZ

              supported authz column names

              Type:
              @@ -212,7 +213,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.PREV_GUID
              +gen3.tools.indexing.index_manifest.PREV_GUID

              supported previous guid column names

              Type:
              @@ -228,14 +229,14 @@

              Indexing Tools
              -class gen3.tools.indexing.index_manifest.ThreadControl(processed_files=0, num_total_files=0)[source]
              +class gen3.tools.indexing.index_manifest.ThreadControl(processed_files=0, num_total_files=0)[source]

              Bases: object

              Class for thread synchronization

              -gen3.tools.indexing.index_manifest.delete_all_guids(auth, file)[source]
              +gen3.tools.indexing.index_manifest.delete_all_guids(auth, file)[source]

              Delete all GUIDs specified in the object manifest.

              WARNING: THIS COMPLETELY REMOVES INDEX RECORDS. USE THIS ONLY IF YOU KNOW

              THE IMPLICATIONS.

              @@ -245,7 +246,7 @@

              Indexing Tools
              -gen3.tools.indexing.index_manifest.index_object_manifest(commons_url, manifest_file, thread_num, auth=None, replace_urls=True, manifest_file_delimiter=None, output_filename='indexing-output-manifest.csv', submit_additional_metadata_columns=False, force_metadata_columns_even_if_empty=True)[source]
              +gen3.tools.indexing.index_manifest.index_object_manifest(commons_url, manifest_file, thread_num, auth=None, replace_urls=True, manifest_file_delimiter=None, output_filename='indexing-output-manifest.csv', submit_additional_metadata_columns=False, force_metadata_columns_even_if_empty=True)[source]

              Loop through all the files in the manifest, update/create records in indexd update indexd if the url is not in the record url list or acl has changed

              @@ -324,30 +325,9 @@

              Indexing Tools -
              -gen3.tools.indexing.index_manifest.populate_object_manifest_with_valid_guids(commons_url, manifest_file, output_filename=None)[source]
              -

              Given a minimal file object manifest, populate any missing GUIDs with valid GUIDs -for the given commons.

              -
              -
              NOTE: This DOES NOT index anything, it only works client side to populate the manifest

              with valid GUIDs (which are obtained from the server). No records are created -as part of this function call.

              -
              -
              -
              -
              Parameters:
              -
                -
              • commons_url (str) – root domain for commons where indexd lives

              • -
              • manifest_file (str) – file path for input manifest file to populate empty GUIDs

              • -
              • output_filename (str) – output file name for manifest

              • -
              -
              -
              -

              -

              -

              Verify

              +

              Verify

              Module for indexing actions for verifying a manifest of indexed file objects (against indexd’s API). Supports multiple processes and coroutines using Python’s asyncio library.

              @@ -377,7 +357,7 @@

              Indexing Tools
              -gen3.tools.indexing.verify_manifest.CURRENT_DIR
              +gen3.tools.indexing.verify_manifest.CURRENT_DIR

              directory this file is in

              Type:
              @@ -388,7 +368,7 @@

              Indexing Tools
              -gen3.tools.indexing.verify_manifest.MAX_CONCURRENT_REQUESTS
              +gen3.tools.indexing.verify_manifest.MAX_CONCURRENT_REQUESTS

              maximum number of desired concurrent requests across processes/threads

              @@ -400,7 +380,7 @@

              Indexing Tools
              -async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1660677351.9370115.log')[source]
              +async gen3.tools.indexing.verify_manifest.async_verify_object_manifest(commons_url, manifest_file, max_concurrent_requests=24, manifest_row_parsers={'acl': <function _get_acl_from_row>, 'authz': <function _get_authz_from_row>, 'file_name': <function _get_file_name_from_row>, 'file_size': <function _get_file_size_from_row>, 'guid': <function _get_guid_from_row>, 'md5': <function _get_md5_from_row>, 'urls': <function _get_urls_from_row>}, manifest_file_delimiter=None, output_filename='verify-manifest-errors-1700678999.9725351.log')[source]

              Verify all file object records into a manifest csv

              Parameters:
              @@ -455,9 +435,34 @@

              Navigation

            • Gen3 Tools diff --git a/docs/_build/html/wss.html b/docs/_build/html/wss.html index 2e4dd82ae..31e5ef52a 100644 --- a/docs/_build/html/wss.html +++ b/docs/_build/html/wss.html @@ -1,19 +1,16 @@ - - + - + Gen3 Workspace Storage — Gen3 SDK documentation - - - - - - - + + + + + @@ -34,10 +31,10 @@
              -

              Gen3 Workspace Storage

              +

              Gen3 Workspace Storage

              -class gen3.wss.Gen3WsStorage(auth_provider=None)[source]
              +class gen3.wss.Gen3WsStorage(auth_provider=None)[source]

              Bases: object

              A class for interacting with the Gen3 workspace storage service.

              Examples

              @@ -49,14 +46,14 @@

              Gen3 Workspace Storage
              -copy(src_urlstr, dest_urlstr)[source]
              +copy(src_urlstr, dest_urlstr)[source]

              Parse src_urlstr and dest_urlstr, and call upload or download as appropriate

              -download(src_ws, src_wskey, dest_path)[source]
              +download(src_ws, src_wskey, dest_path)[source]

              Download a file from the workspace to local disk

              Parameters:
              @@ -71,7 +68,7 @@

              Gen3 Workspace Storage
              -download_url(ws, wskey)[source]
              +download_url(ws, wskey)[source]

              Get a download url for the given workspace key

              Parameters:
              @@ -85,7 +82,7 @@

              Gen3 Workspace Storage
              -ls(ws, wskey)[source]
              +ls(ws, wskey)[source]

              List the contents under the given workspace path

              Parameters:
              @@ -99,7 +96,7 @@

              Gen3 Workspace Storage
              -ls_path(ws_urlstr)[source]
              +ls_path(ws_urlstr)[source]
              Same as ls - but parses ws_urlstr argument of form:

              ws:///workspace/key

              @@ -116,7 +113,7 @@

              Gen3 Workspace Storage
              -rm(ws, wskey)[source]
              +rm(ws, wskey)[source]

              Remove the given workspace key

              Parameters:
              @@ -130,19 +127,19 @@

              Gen3 Workspace Storage
              -rm_path(ws_urlstr)[source]
              +rm_path(ws_urlstr)[source]

              Same as rm - but parses the ws_urlstr argument

              -upload(src_path, dest_ws, dest_wskey)[source]
              +upload(src_path, dest_ws, dest_wskey)[source]

              Upload a local file to the specified workspace path

              -upload_url(ws, wskey)[source]
              +upload_url(ws, wskey)[source]

              Get a upload url for the given workspace key

              Parameters:
              @@ -192,7 +189,21 @@

              Navigation

            • Gen3 Query Class
            • Gen3 Submission Class
            • Gen3 Tools
            • -
            • Gen3 Workspace Storage
            • +
            • Gen3 Workspace Storage +
            diff --git a/docs/howto/cli.md b/docs/howto/cli.md new file mode 100644 index 000000000..9375cbcef --- /dev/null +++ b/docs/howto/cli.md @@ -0,0 +1,16 @@ +## CLI + +The CLI can be invoked as follows + +`gen3 [OPTIONS] COMMAND [ARGS]` + +For a list of commands and options run + +`gen3 --help` + +For example, the following can validate `user.yaml` files + +`gen3 users validate first_user.yaml second_user.yaml` + +The [gen3users](https://github.com/uc-cdis/gen3users) documentation describes the `users` functionality. + diff --git a/docs/howto/discoveryMetadataTools.md b/docs/howto/discoveryMetadataTools.md new file mode 100644 index 000000000..795af82aa --- /dev/null +++ b/docs/howto/discoveryMetadataTools.md @@ -0,0 +1,585 @@ +## Gen3 Discovery Page Metadata Tools + +**Table of Contents** + +- [Overview](#overview) +- [Export Discovery Metadata into File](#export-discovery-metadata-from-file) +- [Publish Discovery Metadata from File](#publish-discovery-metadata-from-file) +- [DOIs in Gen3](#dois-in-gen3-discovery-metadata-and-page-for-visualizing-public-doi-metadata) +- [dbGaP FHIR Metadata in Gen3 Discovery](#combine-dbgap-fhir-metadata-with-current-discovery-metadata) +- [Publish Discovery Metadata Objects from File](#publish-discovery-metadata-objects-from-file) + +### Overview + +The Gen3 Discovery Page allows the visualization of metadata. There are a collection +of SDK/CLI functionality that assists with the managing of such metadata in Gen3. + +`gen3 discovery --help` will provide the most up to date information about CLI +functionality. + +Like other CLI functions, the CLI code mostly just wraps an SDK function call. + +So you can choose to use the CLI or write your own Python script and use the SDK +functions yourself. Generally this provides the most flexibility, at less +of a convenience. + +### Export Discovery Metadata into File +Gen3's SDK can be used to export discovery metadata from a certain Gen3 environment into a file by using the `output_expanded_discovery_metadata()` function. By default this function will query for metadata with `guid_type=discovery_metadata` for the dump, and export the metadata into a TSV file. User can also specify a different `guid_type` values for this operation, and/or choose to export the metadata into a JSON file. When using TSV format, some certain fields from metadata will be flattened or "jsonified" so that each metadata record can be fitted into one row. + +Example of usage: +```python +from gen3.tools.metadata.discovery import ( + output_expanded_discovery_metadata, +) +from gen3.utils import get_or_create_event_loop_for_thread +from gen3.auth import Gen3Auth + +if __name__ == "__main__": + auth = Gen3Auth() + loop = get_or_create_event_loop_for_thread() + loop.run_until_complete( + output_expanded_discovery_metadata( + auth, endpoint="GEN3_ENV_HOSTNAME", output_format="json" + ) + ) +``` + +### Publish Discovery Metadata from File +Gen3's SDK can also be used to publish discovery metadata onto a target Gen3 environment from a file by using the `publish_discovery_metadata()` function. Ideally the metadata file should be originated from a metadata dump obtained by using the `output_expanded_discovery_metadata()` function. + +Example of usage: +```python +from gen3.tools.metadata.discovery import ( + publish_discovery_metadata, +) +from gen3.utils import get_or_create_event_loop_for_thread +from gen3.auth import Gen3Auth + +if __name__ == "__main__": + auth = Gen3Auth() + loop = get_or_create_event_loop_for_thread() + loop.run_until_complete( + publish_discovery_metadata( + auth, "./metadata.tsv", endpoint=HOSTNAME, guid_field="_hdp_uid" + ) + ) +``` + +### DOIs in Gen3: Discovery Metadata and Page for Visualizing Public DOI Metadata + +Gen3's SDK supports minting DOIs from DataCite, storing DOI metadata in a Gen3 instance, +and visualizing the DOI metadata in our Discovery Page to serve as a DOI "Landing Page". + +> **DOI?** A digital object identifier (DOI) is a persistent identifier or handle used to identify objects uniquely, standardized by the International Organization for Standardization (ISO). DOIs are in wide use mainly to identify academic, professional, and government information, such as journal articles, research reports, data sets, and official publications. However, they also have been used to identify other types of information resources, such as commercial videos. + +The general overview for how Gen3 supports DOIs is as follows: + +* Gen3 SDK/CLI used to gather Metadata from External Public Metadata Sources +* Gen3 SDK/CLI used to do any conversions to DOI Metadata +* Gen3 SDK/CLI communicates with DataCite API to mint DOI + * NOTE: the gathering of metadata, conversion to DOI fields, and final minting may or may not be a part of a regular data ingestion. It’s possible that this is used ad-hocly, as needed +* Gen3 SDK/CLI persists metadata in Gen3 +* Persisted metadata in Gen3 exposed via Discovery Page +* Discovery Page is used as the required DOI Landing Page + +> **What is DataCite?** In order to create a DOI, one must use a DOI registration service. In the US there are two: CrossRef and DataCite. We are focusing on DataCite, because that is what we were provided access to. + +#### Example Script: Manually Creating a Single DOI and Persisting the Metadata in Gen3 + +Prerequisites: + +* Environment variable `DATACITE_USERNAME` set as a valid DataCite username for interacting with their API +* Environment variable `DATACITE_PASSWORD` set as a valid DataCite password for interacting with their API + +This shows a full example of: + +* Setting up the necessary classes for interacting with Gen3 & Datacite +* Getting the DOI metadata (ideally from some external source like a file or another API, but here we've hard-coded it) +* Creating/Minting the DOI in DataCite +* Persisting the DOI metadata into a Gen3 Discovery record in the metadata service + +```python +import os +from requests.auth import HTTPBasicAuth + +from cdislogging import get_logger + +from gen3.doi import ( + DataCite, + DigitalObjectIdentifier, + DigitalObjectIdentifierCreator, + DigitalObjectIdentifierTitle, +) +from gen3.auth import Gen3Auth + +logging = get_logger("__name__", log_level="info") + +# This prefix should be provided by DataCite +PREFIX = "10.12345" +PUBLISHER = "Example" +COMMONS_DISCOVERY_PAGE = "https://example.com/discovery" + +DOI_DISCLAIMER = "" +DOI_ACCESS_INFORMATION = "You can find information about how to access this resource in the link below." +DOI_ACCESS_INFORMATION_LINK = "https://example.com/more/info" +DOI_CONTACT = "https://example.com/contact/" + + +def test_manual_single_doi(publish_dois=False): + # Setup + gen3_auth = Gen3Auth() + datacite = DataCite( + use_prod=False, + auth_provider=HTTPBasicAuth( + os.environ.get("DATACITE_USERNAME"), + os.environ.get("DATACITE_PASSWORD"), + ), + ) + + gen3_metadata_guid = "Example-Study-01" + + # Get DOI metadata (ideally from some external source) + identifier = "10.82483/BDC-268Z-O151" + creators = [ + DigitalObjectIdentifierCreator( + name="Bar, Foo", + name_type=DigitalObjectIdentifierCreator.NAME_TYPE_PERSON, + ).as_dict() + ] + titles = [DigitalObjectIdentifierTitle("Some Example Study in Gen3").as_dict()] + publisher = "Example Gen3 Sponsor" + publication_year = 2023 + doi_type_general = "Dataset" + version = 1 + + doi_metadata = { + "identifier": identifier, + "creators": creators, + "titles": titles, + "publisher": publisher, + "publication_year": publication_year, + "doi_type_general": doi_type_general, + "version": version, + } + + # Create/Mint the DOI in DataCite + # The default url generated is "root_url" + identifier + # If your Discovery metadata records don't use the DOI as the GUID, + # you may need to supply the URL yourself like below + url = COMMONS_DISCOVERY_PAGE.rstrip("/") + f"/{gen3_metadata_guid}" + doi = DigitalObjectIdentifier(url=url, **doi_metadata) + + if publish_dois: + logging.info(f"Publishing DOI `{identifier}`...") + doi.event = "publish" + + # works for only new DOIs + # You can use this for updates: `datacite.update_doi(doi)` + response = datacite.create_doi(doi) + doi = DigitalObjectIdentifier.from_datacite_create_doi_response(response) + + # Persist necessary DOI Metadata in Gen3 Discovery to support the landing page + metadata = datacite.persist_doi_metadata_in_gen3( + guid=gen3_metadata_guid, + doi=doi, + auth=gen3_auth, + additional_metadata={ + "disclaimer": DOI_DISCLAIMER, + "access_information": DOI_ACCESS_INFORMATION, + "access_information_link": DOI_ACCESS_INFORMATION_LINK, + "contact": DOI_CONTACT, + }, + prefix="doi_", + ) + logging.debug(f"Gen3 Metadata for GUID `{gen3_metadata_guid}`: {metadata}") + + +def main(): + test_manual_single_doi() + + +if __name__ == "__main__": + main() + +``` + +#### Example Partial Discovery Page Configuration for DOIs + +This is portion of the Gen3 Data Portal configuration that pertains to +the Discovery Page. The code provided shows an example of how to configure +the visualization of the DOI metadata. + +In order to be compliant with Landing Pages, the URL you provide during minting +needs to automatically display all this information. So if you have other tabs +of non-DOI information, they cannot be the first focused tab upon resolving the +DOI url. + +```json +"discoveryConfig": { + // ... + "features": { + // ... + "search": { + "searchBar": { + "enabled": true, + "searchableTextFields": [ + "doi_titles", + "doi_version_information", + "doi_citation", + "doi_creators", + "doi_publisher", + "doi_identifier", + "doi_alternateIdentifiers", + "doi_contributors", + "doi_descriptions", + "doi_publication_year", + "doi_resolvable_link", + "doi_fundingReferences", + "doi_relatedIdentifiers" + ] + }, + // ... + "detailView": { + // ... + "tabs": [ + { + "tabName": "DOI", + "groups": [ + { + "header": "Dataset Information", + "fields": [ + { + "type": "block", + "label": "", + "sourceField": "doi_disclaimer", + "default": "" + }, + { + "type": "text", + "label": "Title:", + "sourceField": "doi_titles", + "default": "Not specified" + }, + { + "type": "link", + "label": "DOI:", + "sourceField": "doi_resolvable_link", + "default": "None" + }, + { + "type": "text", + "label": "Data available:", + "sourceField": "doi_is_available", + "default": "None" + }, + { + "type": "text", + "label": "Creators:", + "sourceField": "doi_creators", + "default": "Not specified" + }, + { + "type": "text", + "label": "Citation:", + "sourceField": "doi_citation", + "default": "Not specified" + }, + { + "type": "link", + "label": "Contact:", + "sourceField": "doi_contact", + "default": "Not specified" + } + ] + }, + { + "header": "How to Access the Data", + "fields": [ + { + "type": "block", + "label": "How to access the data:", + "sourceField": "doi_access_information", + "default": "Not specified" + }, + { + "type": "link", + "label": "Data and access information:", + "sourceField": "doi_access_information_link", + "default": "Not specified" + } + ] + }, + { + "header": "Additional Information", + "fields": [ + { + "type": "text", + "label": "Publisher:", + "sourceField": "doi_publisher", + "default": "Not specified" + }, + { + "type": "text", + "label": "Funded by:", + "sourceField": "doi_fundingReferences", + "default": "Not specified" + }, + { + "type": "text", + "label": "Publication Year:", + "sourceField": "doi_publication_year", + "default": "Not specified" + }, + { + "type": "text", + "label": "Resource Type:", + "sourceField": "doi_resource_type", + "default": "Not specified" + }, + { + "type": "text", + "label": "Version:", + "sourceField": "doi_version_information", + "default": "Not specified" + }, + { + "type": "text", + "label": "Contributors:", + "sourceField": "doi_contributors", + "default": "Not specified" + }, + { + "type": "text", + "label": "Related Identifiers:", + "sourceField": "doi_relatedIdentifiers", + "default": "Not specified" + } + ] + }, + { + "header": "Description", + "fields": [ + { + "type": "block", + "label": "Description:", + "sourceField": "doi_descriptions", + "default": "Not specified" + } + ] + } + ] + }, + // ... +``` + +#### Automate DOI creation for Datasets + +Automates the pulling of current datasets from Discovery, getting identifiers, +scraping various APIs for DOI related metadata, and then going through +the DOI creation loop to mint the DOI in Datacite and persist the metadata back in +Gen3. + +See below for a full example using the dbGaP `DbgapMetadataInterface`. + +More interfaces may exist in the future for doing this by querying non-dbGaP +sources. + +```python +import os +from requests.auth import HTTPBasicAuth + +from cdislogging import get_logger + +from gen3.auth import Gen3Auth +from gen3.discovery_dois import mint_dois_for_discovery_datasets, DbgapMetadataInterface +from gen3.utils import get_random_alphanumeric + +logging = get_logger("__name__", log_level="info") + +PREFIX = "10.12345" +PUBLISHER = "Example" +COMMONS_DISCOVERY_PAGE = "https://example.com/discovery" + +DOI_DISCLAIMER = "" +DOI_ACCESS_INFORMATION = "You can find information about how to access this resource in the link below." +DOI_ACCESS_INFORMATION_LINK = "https://example.com/more/info" +DOI_CONTACT = "https://example.com/contact/" + +def mint_discovery_dois(): + auth = Gen3Auth() + + # this alternate ID is some globally unique ID other than the GUID that + # will be needed to get DOI metadata (like the phsid for dbGaP) + metadata_field_for_alternate_id = "dbgap_accession" + + # you can choose to exclude certain Discovery Metadata datasets based on + # their GUID or alternate ID (this means they won't get additional DOI metadata + # or have DOIs minted, they'll be skipped) + exclude_datasets=["MetadataGUID_to_exclude", "AlternateID_to_exclude", "..."] + + # When this is True, you CANNOT REVERT THIS ACTION. A published DOI + # cannot be deleted. It is recommended to test with "Draft" state DOIs first + # (which is the default when publish_dois is not True). + publish_dois = False + + mint_dois_for_discovery_datasets( + gen3_auth=auth, + datacite_auth=HTTPBasicAuth( + os.environ.get("DATACITE_USERNAME"), + os.environ.get("DATACITE_PASSWORD"), + ), + metadata_field_for_alternate_id=metadata_field_for_alternate_id, + get_doi_identifier_function=get_doi_identifier, + metadata_interface=DbgapMetadataInterface, + doi_publisher=PUBLISHER, + commons_discovery_page=COMMONS_DISCOVERY_PAGE, + doi_disclaimer=DOI_DISCLAIMER, + doi_access_information=DOI_ACCESS_INFORMATION, + doi_access_information_link=DOI_ACCESS_INFORMATION_LINK, + doi_contact=DOI_CONTACT, + publish_dois=publish_dois, + datacite_use_prod=False, + exclude_datasets=["MetadataGUID_to_exclude", "AlternateID_to_exclude", "..."] + ) + + +def get_doi_identifier(): + return ( + PREFIX + "/EXAMPLE-" + get_random_alphanumeric(4) + "-" + get_random_alphanumeric(4) + ) + + +def main(): + mint_discovery_dois() + + +if __name__ == "__main__": + main() + +``` + +### Combine dbGaP FHIR Metadata with Current Discovery Metadata + +For CLI, see `gen3 discovery combine --help`. + +This will describe how to use the SDK functions directly. If you use the CLI, +it will automatically read current Discovery metadata and then combine with the +file you provide (after applying a prefix to all the columns, if you specify that). + +> Note: This supports CSV and TSV formats for the metadata file + +Let's assume: + +- You don't have the current Discovery metadata in a file locally +- You want to merge new metadata (parsed from dbGaP's FHIR server) with the existing Discovery metadata +- You want to prefix all the new columns with `DBGAP_FHIR_` + +Here's how you would do that without using the CLI: + +```python +from gen3.auth import Gen3Auth +from gen3.tools.metadata.discovery import ( + output_expanded_discovery_metadata, + combine_discovery_metadata, +) +from gen3.external.nih.dbgap_fhir import dbgapFHIR +from gen3.utils import get_or_create_event_loop_for_thread + + +def main(): + """ + Read current Discovery metadata, then combine with dbgapFHIR metadata. + """ + # Get current Discovery metadata + loop = get_or_create_event_loop_for_thread() + auth = Gen3Auth(refresh_file="credentials.json") + current_discovery_metadata_file = loop.run_until_complete( + output_expanded_discovery_metadata(auth, endpoint=auth.endpoint) + ) + + # Get dbGaP FHIR Metadata + studies = [ + "phs000007.v31", + "phs000166.v2", + "phs000179.v6", + ] + dbgapfhir = dbgapFHIR() + simplified_data = dbgapfhir.get_metadata_for_ids(phsids=studies) + dbgapFHIR.write_data_to_file(simplified_data, "fhir_metadata_file.tsv") + + # Combine new FHIR Metadata with existing Discovery Metadata + metadata_filename = "fhir_metadata_file.tsv" + discovery_column_to_map_on = "guid" + metadata_column_to_map = "Id" + output_filename = "combined_discovery_metadata.tsv" + metadata_prefix = "DBGAP_FHIR_" + + output_file = combine_discovery_metadata( + current_discovery_metadata_file, + metadata_filename, + discovery_column_to_map_on, + metadata_column_to_map, + output_filename, + metadata_prefix=metadata_prefix, + ) + + # You now have a file with the combined information that you can publish + # NOTE: Combining does NOT publish automatically into Gen3. You should + # QA the output (make sure the result is correct), and then publish. + + +if __name__ == "__main__": + main() +``` + +### Publish Discovery Metadata Objects from File +Gen3's SDK can be used to ingest data objects related to datasets in Gen3 environment from a file by using the `publish_discovery_object_metadata()` function. To obtain a file of existing metadata objects, use the `output_discovery_objects()` function. By default new objects published from a file are appended to a dataset in a Gen3 environment. If object guids from a file already exist for a dataset in the Gen3 environment, objects are updated. If the `overwrite` option is `True`, all current metadata objects related to a dataset are instead replaced. You can also use this functionality from the CLI. See `gen3 discovery objects --help` + +Example of usage: +```python +""" +Example script showing reading Discovery Objects Metadata and then +publishing it back, just to demonstrate the functions. + +Before running this, ensure your ~/.gen3/credentials.json contains +an API key for a Gen3 instance to interact with and/or adjust the +Gen3Auth logic to provide auth in another way +""" +from cdislogging import get_logger + +from gen3.tools.metadata.discovery_objects import ( + publish_discovery_object_metadata, + output_discovery_objects, +) +from gen3.utils import get_or_create_event_loop_for_thread +from gen3.auth import Gen3Auth + +logging = get_logger("__name__") + +if __name__ == "__main__": + auth = Gen3Auth() + loop = get_or_create_event_loop_for_thread() + logging.info(f"Reading discovery objects metadata from: {auth.endpoint}...") + output_filename = loop.run_until_complete( + output_discovery_objects( + auth, + output_format="tsv", + ) + ) + logging.info(f"Output discovery objects metadata: {output_filename}") + + # Here you can modify the file by hand or in code and then publish to update + # Alternatively, you can skip the read above and just provide a file with + # the object metadata you want to publish + + logging.info( + f"publishing discovery object metadata to: {auth.endpoint} from file: {output_filename}" + ) + loop.run_until_complete( + publish_discovery_object_metadata( + auth, + output_filename, + overwrite=False, + ) + ) +``` \ No newline at end of file diff --git a/docs/howto/drsDownloading.md b/docs/howto/drsDownloading.md index 173b75590..05e93df77 100644 --- a/docs/howto/drsDownloading.md +++ b/docs/howto/drsDownloading.md @@ -67,6 +67,12 @@ You should see something like: Datafile05_T.csv : 100%|████████████████████████████████████████████████████████████████████████| 3.72M/3.72M [00:01<00:00, 1.92MiB/s] ``` +To download a list of files, you can use the `drs-pull objects` command: + +``` +gen3 --endpoint my-commons.org --auth drs-pull objects dg.XXTS/181af989-5d66-4139-91e7-69f4570ccd41 dg.XX22/221af922-2222-2239-22e7-62f4570cc222 +``` + ### Listing Files and Access #### List Contents @@ -93,6 +99,7 @@ BIG_DataCollection.5.2.1.7695.1700.100392922143281268049004312967/1.3.6.1.4.1.14 ├── BIG_Datafile.177741488444741406265552879434.dcm#1592595549340161 527.66 KB test.datacommons4.io 09/19/2020, 09:12:09 └── BIG_Datafile.193538014659307853778370216921.dcm#1592595549438034 527.66 KB test.datacommons4.io 09/18/2020, 14:48:53 ``` + #### List Access Given a manifest or DRS object id, you can query the access rights for that object's host commons, or in the case of a manifest all of the host commons diff --git a/docs/howto/metadataTools.md b/docs/howto/metadataTools.md index 5a41f41b9..7b18ba79c 100644 --- a/docs/howto/metadataTools.md +++ b/docs/howto/metadataTools.md @@ -11,7 +11,6 @@ TOC - [Using Gen3 Jobs](#using-gen3-jobs) - [Verify Metadata Manifest](#verify-metadata-manifest) - ### Ingest Manifest For populating the metadata service via a file filled with metadata. Uses asynchronous @@ -249,6 +248,7 @@ import asyncio from gen3.auth import Gen3Auth from gen3.tools import metadata from gen3.tools.metadata.ingest_manifest import manifest_row_parsers +from gen3.utils import get_or_create_event_loop_for_thread logging.basicConfig(filename="output.log", level=logging.DEBUG) logging.getLogger().addHandler(logging.StreamHandler(sys.stdout)) @@ -534,6 +534,7 @@ import asyncio from gen3.index import Gen3Index from gen3.auth import Gen3Auth from gen3.jobs import Gen3Jobs, DBGAP_METADATA_JOB, INGEST_METADATA_JOB +from gen3.utils import get_or_create_event_loop_for_thread # An API Key downloaded from the above commons' "Profile" page API_KEY_FILEPATH = "credentials.json" @@ -626,6 +627,7 @@ import logging import asyncio from gen3.tools import metadata +from gen3.utils import get_or_create_event_loop_for_thread logging.basicConfig(filename="output.log", level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(sys.stdout)) diff --git a/docs/reference/sdkClasses.md b/docs/reference/sdkClasses.md index 713cfe22c..601195512 100644 --- a/docs/reference/sdkClasses.md +++ b/docs/reference/sdkClasses.md @@ -113,6 +113,7 @@ import asyncio from gen3.auth import Gen3Auth from gen3.jobs import Gen3Jobs, DBGAP_METADATA_JOB +from gen3.utils import get_or_create_event_loop_for_thread # An API Key downloaded from the above commons' "Profile" page API_KEY_FILEPATH = "credentials.json" diff --git a/docs/tutorial/quickStart.md b/docs/tutorial/quickStart.md index 4b257ed12..775bc8ad4 100644 --- a/docs/tutorial/quickStart.md +++ b/docs/tutorial/quickStart.md @@ -3,6 +3,7 @@ * install the sdk: `pip install gen3` * for authenticated access to a commons - download an API key from the portal's Profile page, and save it as `~/.gen3/credentials.json` * write a script that uses the sdk (examples below) +* function calls that are configured with a backoff are retried 3 times by default. The number of retries can be customized by setting the `GEN3SDK_MAX_RETRIES` environment variable ## Quickstart Example - Object Index diff --git a/gen3/auth.py b/gen3/auth.py index 3db24b578..a78142718 100755 --- a/gen3/auth.py +++ b/gen3/auth.py @@ -46,7 +46,7 @@ def endpoint_from_token(token_str): endpoint = urlparts.scheme + "://" + urlparts.hostname if urlparts.port: endpoint += ":" + str(urlparts.port) - return endpoint + return remove_trailing_whitespace_and_slashes_in_url(endpoint) def _handle_access_token_response(resp, token_key): @@ -77,6 +77,22 @@ def get_access_token_with_key(api_key): return _handle_access_token_response(resp, token_key) +def get_access_token_with_client_credentials(endpoint, client_credentials, scopes): + """ + Try to get an access token from Fence using client credentials + + Args: + endpoint (str): URL of the Gen3 instance to get an access token for + client_credentials ((str, str) tuple): (client ID, client secret) tuple + scopes (str): space-delimited list of scopes to request + """ + if not endpoint: + raise ValueError("'endpoint' must be specified when using client credentials") + url = f"{endpoint}/user/oauth2/token?grant_type=client_credentials&scope={scopes}" + resp = requests.post(url, auth=client_credentials) + return _handle_access_token_response(resp, "access_token") + + def get_wts_endpoint(namespace=os.getenv("NAMESPACE", "default")): return "http://workspace-token-service.{}.svc.cluster.local".format(namespace) @@ -121,6 +137,10 @@ class Gen3Auth(AuthBase): refresh_token (str, opt): The JSON web token. Optional if working in a Gen3 Workspace. idp (str, opt): If working in a Gen3 Workspace, the IDP to use can be specified - "local" indicates the local environment fence idp + client_credentials (tuple, opt): The (client_id, client_secret) credentials for an OIDC client + that has the 'client_credentials' grant, allowing it to obtain access tokens. + client_scopes (str, opt): Space-separated list of scopes requested for access tokens obtained from client + credentials. Default: "user data openid" Examples: This generates the Gen3Auth class pointed at the sandbox commons while @@ -141,13 +161,33 @@ class Gen3Auth(AuthBase): than pass the refresh_file argument to the Gen3Auth constructor. + If working with an OIDC client that has the 'client_credentials' grant, allowing it to obtain + access tokens, provide the client ID and secret: + + Note: client secrets should never be hardcoded! + + >>> auth = Gen3Auth( + endpoint="https://datacommons.example", + client_credentials=("client ID", os.environ["GEN3_OIDC_CLIENT_CREDS_SECRET"]) + ) + If working in a Gen3 Workspace, initialize as follows: >>> auth = Gen3Auth() """ - def __init__(self, endpoint=None, refresh_file=None, refresh_token=None, idp=None): - # note - this is not actually a JWT refresh token - it's a + def __init__( + self, + endpoint=None, + refresh_file=None, + refresh_token=None, + idp=None, + client_credentials=None, + client_scopes=None, + ): + logging.debug("Initializing auth..") + self.endpoint = remove_trailing_whitespace_and_slashes_in_url(endpoint) + # note - `_refresh_token` is not actually a JWT refresh token - it's a # gen3 api key with a token as the "api_key" property self._refresh_token = refresh_token self._access_token = None @@ -157,6 +197,13 @@ def __init__(self, endpoint=None, refresh_file=None, refresh_token=None, idp=Non self._use_wts = False self._external_wts_host = None self._refresh_file = refresh_file + self._client_credentials = client_credentials + if self._client_credentials: + self._client_scopes = client_scopes or "user data openid" + elif client_scopes: + raise ValueError( + "'client_scopes' cannot be specified without 'client_credentials'" + ) if refresh_file and refresh_token: raise ValueError( @@ -193,6 +240,15 @@ def __init__(self, endpoint=None, refresh_file=None, refresh_token=None, idp=Non logging.warning("Unable to find refresh_file") refresh_file = None + if self._client_credentials: + if not endpoint: + raise ValueError( + "'endpoint' must be specified when '_client_credentials' is specified" + ) + self._access_token = get_access_token_with_client_credentials( + endpoint, self._client_credentials, self._client_scopes + ) + if not self._access_token: # at this point - refresh_file either exists or is None if not refresh_file and not refresh_token: @@ -220,28 +276,31 @@ def __init__(self, endpoint=None, refresh_file=None, refresh_token=None, idp=Non if idp or ( endpoint and ( - not endpoint + not endpoint.rstrip("/") == endpoint_from_token(self._refresh_token["api_key"]) ) ): try: + logging.debug( + "Switch to using WTS and set external WTS host url.." + ) self._use_wts = True self._external_wts_host = ( endpoint_from_token(self._refresh_token["api_key"]) + "/wts/" ) - self.get_access_token( - remove_trailing_whitespace_and_slashes_in_url(endpoint) - ) + self.get_access_token() except Gen3AuthError as g: logging.warning( "Could not obtain access token from WTS service." ) raise g - if self._access_token: - self.endpoint = endpoint_from_token(self._access_token) - else: - self.endpoint = endpoint_from_token(self._refresh_token["api_key"]) + + if not self.endpoint: + if self._access_token: + self.endpoint = endpoint_from_token(self._access_token) + else: + self.endpoint = endpoint_from_token(self._refresh_token["api_key"]) @property def _token_info(self): @@ -300,21 +359,28 @@ def refresh_access_token(self, endpoint=None): """Get a new access token""" if self._use_wts: self._access_token = self.get_access_token_from_wts(endpoint) + elif self._client_credentials: + self._access_token = get_access_token_with_client_credentials( + endpoint, self._client_credentials, self._client_scopes + ) else: self._access_token = get_access_token_with_key(self._refresh_token) + self._access_token_info = decode_token(self._access_token) + + cache_file = None if self._use_wts: cache_file = get_token_cache_file_name(self._wts_idp) - else: - if self._refresh_file: - cache_file = get_token_cache_file_name(self._refresh_token["api_key"]) - - try: - self._write_to_file(cache_file, self._access_token) - except Exception as e: - logging.warning( - f"Unable to write access token to cache file. Exceeded number of retries." - ) + elif self._refresh_file: + cache_file = get_token_cache_file_name(self._refresh_token["api_key"]) + + if cache_file: + try: + self._write_to_file(cache_file, self._access_token) + except Exception as e: + logging.warning( + f"Unable to write access token to cache file. Exceeded number of retries. Details: {e}" + ) return self._access_token @@ -337,7 +403,7 @@ def _write_to_file(self, cache_file, content): logging.warning(str(e)) raise e - def get_access_token(self, endpoint=None): + def get_access_token(self): """Get the access token - auto refresh if within 5 minutes of expiration""" if not self._access_token: if self._use_wts == True: @@ -364,7 +430,9 @@ def get_access_token(self, endpoint=None): or time.time() + 300 > self._access_token_info["exp"] ) if need_new_token: - return self.refresh_access_token(endpoint) + return self.refresh_access_token( + self.endpoint if hasattr(self, "endpoint") else None + ) # use cache return self._access_token @@ -415,23 +483,72 @@ def get_access_token_from_wts(self, endpoint=None): in the given namespace. If idp is not set, then default to "local" """ # attempt to get a token from the workspace-token-service + logging.debug("getting access token from wts..") auth_url = get_wts_endpoint(self._wts_namespace) + "/token/" - if self._wts_idp and self._wts_idp != "local": - auth_url += "?idp={}".format(self._wts_idp) - try: - resp = requests.get(auth_url) - if (resp and resp.status_code == 200) or (not self._external_wts_host): - return _handle_access_token_response(resp, "token") - except Exception as e: - if not self._external_wts_host: - raise e - else: - # Try to obtain token from external wts - pass + # If non "local" idp value exists, append to auth url + # If user specified endpoint value, then first attempt to determine idp value. + if self.endpoint or (self._wts_idp and self._wts_idp != "local"): + # If user supplied endpoint value and not idp, figure out the idp value + if self.endpoint: + logging.debug( + "First try to use the local WTS to figure out idp name for the supplied endpoint.." + ) + try: + provider_List = get_wts_idps(self._wts_namespace) + matchProviders = list( + filter( + lambda provider: provider["base_url"] == endpoint, + provider_List["providers"], + ) + ) + if len(matchProviders) == 1: + logging.debug("Found matching idp from local WTS.") + self._wts_idp = matchProviders[0]["idp"] + elif len(matchProviders) > 1: + raise ValueError( + "Multiple idps matched with endpoint value provided." + ) + else: + logging.debug("Could not find matching idp from local WTS.") + except Exception as e: + logging.debug( + "Exception occured when making network call to local WTS." + ) + if not self._external_wts_host: + raise e + else: + logging.debug("Since external WTS host exists, continuing on..") + pass + + if self._wts_idp and self._wts_idp != "local": + auth_url += "?idp={}".format(self._wts_idp) + + # If endpoint value exists, only get WTS token if idp value has been successfully determined + # Otherwise skip to querying external WTS + # This is to prevent local WTS from supplying an incorrect token to user + if ( + not self._external_wts_host + or not self.endpoint + or (self.endpoint and self._wts_idp != "local") + ): + try: + logging.debug("Try to get access token from local WTS..") + logging.debug(f"{auth_url=}") + resp = requests.get(auth_url) + if (resp and resp.status_code == 200) or (not self._external_wts_host): + return _handle_access_token_response(resp, "token") + except Exception as e: + if not self._external_wts_host: + raise e + else: + # Try to obtain token from external wts + logging.debug("Could get obtain token from Local WTS.") + pass # local workspace wts call failed, try using a network call # First get access token with WTS host + logging.debug("Trying to get access token from external WTS Host..") wts_token = get_access_token_with_key(self._refresh_token) auth_url = self._external_wts_host + "token/" @@ -452,9 +569,14 @@ def get_access_token_from_wts(self, endpoint=None): provider_List["providers"], ) ) + else: + raise Exception( + "Unable to generate matching identity providers (no IdP or endpoint provided)" + ) if len(matchProviders) == 1: self._wts_idp = matchProviders[0]["idp"] + logging.debug("Succesfully determined idp value: {}".format(self._wts_idp)) else: idp_list = "\n " @@ -491,7 +613,7 @@ def get_access_token_from_wts(self, endpoint=None): + idp_list + "Query /wts/external_oidc/ for more information." ) - + logging.debug("Finally getting access token..") auth_url += "?idp={}".format(self._wts_idp) header = {"Authorization": "Bearer " + wts_token} resp = requests.get(auth_url, headers=header) diff --git a/gen3/cli/__main__.py b/gen3/cli/__main__.py index 9839a04ea..5fed4e889 100644 --- a/gen3/cli/__main__.py +++ b/gen3/cli/__main__.py @@ -1,18 +1,22 @@ import click import os import sys +import logging import cdislogging - +import pkg_resources import gen3.cli.auth as auth import gen3.cli.pfb as pfb import gen3.cli.wss as wss import gen3.cli.discovery as discovery import gen3.cli.configure as configure import gen3.cli.objects as objects +import gen3.cli.file as file import gen3.cli.drs_pull as drs_pull +import gen3.cli.users as users import gen3 from gen3 import logging as sdklogging +from gen3.cli import nih class AuthFactory: @@ -33,18 +37,18 @@ def get(self): "--auth", "auth_config", default=os.getenv("GEN3_API_KEY", None), - help="""authentication source: - "idp://wts/" is an identity provider in a Gen3 workspace, - "accesstoken:///" is an access token, - otherwise a path to an api key or basename of key under ~/.gen3/; - default value is "credentials" if ~/.gen3/credentials.json exists, otherwise "idp://wts/local" + help="""authentication source, by default expects an API key in "~/.gen3/credentials.json". + Has special support for token service: "idp://wts/", and raw access tokens + "accesstoken:///", + otherwise a path to an API key or basename of key under ~/.gen3/ can be used. + Default value is "credentials" if ~/.gen3/credentials.json exists, otherwise "idp://wts/local" """, ) @click.option( "--endpoint", "endpoint", default=os.getenv("GEN3_ENDPOINT", "default"), - help="commons hostname - optional if API Key given", + help="commons hostname - optional if API Key given in `auth`", ) @click.option( "-v", @@ -67,15 +71,45 @@ def get(self): default=False, help="only show ERROR logs", ) +@click.option( + "--silent", + "silent", + is_flag=True, + default=False, + help="don't show ANY logs", +) +@click.option( + "--version", + help="Show Gen3 Version", +) @click.pass_context -def main(ctx, auth_config, endpoint, verbose_logs, very_verbose_logs, only_error_logs): +def main( + ctx, + auth_config, + endpoint, + verbose_logs, + very_verbose_logs, + only_error_logs, + silent, + version, +): """Gen3 Command Line Interface""" ctx.ensure_object(dict) ctx.obj["auth_config"] = auth_config ctx.obj["endpoint"] = endpoint ctx.obj["auth_factory"] = AuthFactory(auth_config) - if very_verbose_logs: + if version: + click.echo(pkg_resources.get_distribution("gen3").version) + if silent: + # we still need to define the logger, the log_level here doesn't + # really matter b/c we immediately disable all logging + logger = cdislogging.get_logger( + __name__, format=gen3.LOG_FORMAT, log_level="debug" + ) + # disables all logging + logging.disable(logging.CRITICAL) + elif very_verbose_logs: logger = cdislogging.get_logger( __name__, format=gen3.LOG_FORMAT, log_level="debug" ) @@ -104,4 +138,7 @@ def main(ctx, auth_config, endpoint, verbose_logs, very_verbose_logs, only_error main.add_command(configure.configure) main.add_command(objects.objects) main.add_command(drs_pull.drs_pull) +main.add_command(file.file) +main.add_command(nih.nih) +main.add_command(users.users) main() diff --git a/gen3/cli/auth.py b/gen3/cli/auth.py index 6216e97c9..a7969f38f 100644 --- a/gen3/cli/auth.py +++ b/gen3/cli/auth.py @@ -72,7 +72,7 @@ def wts_list(): @click.group() def auth(): - """Gen3 sdk auth commands""" + """Commands for authentication and authorization""" pass diff --git a/gen3/cli/configure.py b/gen3/cli/configure.py index ecd8184a5..d6bf9bfad 100644 --- a/gen3/cli/configure.py +++ b/gen3/cli/configure.py @@ -9,7 +9,7 @@ @click.option("--profile", help="name of the profile to name for this credentials") @click.option("--cred", help="path to the credentials.json") def configure(profile, cred): - """Command to configure multiple profiles with corresponding credentials + """[unfinished] Commands to configure multiple profiles with corresponding credentials ./gen3 configure --profile= --cred= """ diff --git a/gen3/cli/discovery.py b/gen3/cli/discovery.py index 44d15ca0d..2b260e131 100644 --- a/gen3/cli/discovery.py +++ b/gen3/cli/discovery.py @@ -1,11 +1,19 @@ import asyncio - import click +import csv from gen3.tools.metadata.discovery import ( publish_discovery_metadata, output_expanded_discovery_metadata, try_delete_discovery_guid, + combine_discovery_metadata, +) +from gen3.tools.metadata.discovery_objects import ( + output_discovery_objects, + publish_discovery_object_metadata, + try_delete_discovery_objects, + try_delete_discovery_objects_from_dict, + is_valid_object_manifest, ) from gen3.utils import get_or_create_event_loop_for_thread @@ -22,7 +30,7 @@ def discovery(): "--default-file", "use_default_file", is_flag=True, - help="Publishes {commons}-discovery_metadata.tsv from current directory", + help="Publishes {commons}-{guid_type}.tsv from current directory", show_default=True, ) @click.option( @@ -32,21 +40,52 @@ def discovery(): help="omit fields from empty columns if set", show_default=True, ) +@click.option( + "--guid-type", + "guid_type", + default="discovery_metadata", + help=( + "The value of this gets set as _guid_type in the root level metadata. " + "discovery_metadata is the default that enables the Gen3 Discovery Page to visualize the results." + ), + show_default=True, +) +@click.option( + "--guid_field", + "guid_field", + help=( + 'The column / field name within the metadata that will be used as GUIDs, if not specified, will try to find a column \ field named "guid" from the metadata.' + "If that field doesn't exists in a certain metadata record, that record will be skipped from publishing." + ), + default=None, + show_default=True, +) @click.pass_context -def discovery_publish(ctx, file, use_default_file, omit_empty): +def discovery_publish(ctx, file, use_default_file, omit_empty, guid_type, guid_field): """ - Run a discovery metadata ingestion on a given metadata TSV file with guid column. - If [FILE] is omitted and --default-file not set, prompts for TSV file name. + Run a discovery metadata ingestion on a given metadata TSV / JSON file with guid column / field. + If [FILE] is omitted and --default-file not set, prompts for TSV / JSON file name. """ + if is_valid_object_manifest(file): + click.confirm( + "WARNING! It appears like you are attempting to publish discovery **objects** (based on the file provided) but you are attempting to use the non-object, dataset-level command `gen3 discovery publish`. Perhaps you meant to use `gen3 discovery objects publish`. Are you sure you want proceed with publishing the dataset-level discovery metadata using the object file?", + abort=True, + ) + auth = ctx.obj["auth_factory"].get() if not file and not use_default_file: - file = click.prompt("Enter discovery metadata TSV file to publish") + file = click.prompt("Enter discovery metadata TSV / JSON file to publish") loop = get_or_create_event_loop_for_thread() endpoint = ctx.obj.get("endpoint") loop.run_until_complete( publish_discovery_metadata( - auth, file, endpoint=endpoint, omit_empty_values=omit_empty + auth, + file, + endpoint=endpoint, + omit_empty_values=omit_empty, + guid_type=guid_type, + guid_field=guid_field, ) ) @@ -65,24 +104,132 @@ def discovery_publish(ctx, file, use_default_file, omit_empty): help="use aggregate metadata service instead of the metadata service", show_default=True, ) +@click.option( + "--guid_type", + "guid_type", + help="value of intended GUID type for query", + default="discovery_metadata", + show_default=True, +) +@click.option( + "--output_format", + "output_format", + help="format of output file (can only be either tsv or json)", + default="tsv", + show_default=True, +) +@click.option( + "--output_filename_suffix", + "output_filename_suffix", + help="additional suffix for the output file name", + default="", + show_default=True, +) @click.pass_context -def discovery_read(ctx, limit, agg): +def discovery_read(ctx, limit, agg, guid_type, output_format, output_filename_suffix): """ - Download the metadata used to populate a commons' discovery page into a TSV. - Outputs the TSV filename with format {commons-url}-discovery_metadata.tsv + Download the metadata used to populate a commons' discovery page into a TSV or JSON file. + Outputs the TSV / JSON filename with format {commons-url}-{guid_type}.tsv/.json + If "output_filename_suffix" exists, file name will be something like {commons-url}-{guid_type}-{output_filename_suffix} """ auth = ctx.obj["auth_factory"].get() loop = get_or_create_event_loop_for_thread() endpoint = ctx.obj.get("endpoint") output_file = loop.run_until_complete( output_expanded_discovery_metadata( - auth, endpoint=endpoint, limit=limit, use_agg_mds=agg + auth, + endpoint=endpoint, + limit=limit, + use_agg_mds=agg, + guid_type=guid_type, + output_format=output_format, + output_filename_suffix=output_filename_suffix, ) ) click.echo(output_file) +@click.command() +@click.argument("file", required=False) +@click.option( + "--output-filename", + "output_filename", + help="filename for final combined output", + default="combined_discovery_metadata.tsv", + show_default=True, +) +@click.option( + "--max-number-discovery-records", + "max_number_discovery_records", + help="max number of metadata records to fetch. Initially defaulted to something very high. If you start to miss records, you may need to bump this up.", + default=8192, + type=int, + show_default=True, +) +@click.option( + "--discovery-column-to-map-on", + "discovery_column_to_map_on", + help="The column in the current discovery metadata to use to", + default="guid", + show_default=True, +) +@click.option( + "--metadata-column-to-map", + "metadata_column_to_map", + help="The column in the provided metadata file to use to map/merge into the current Discovery metadata", + default="guid", + show_default=True, +) +@click.option( + "--metadata-prefix", + "metadata_prefix", + help="Prefix to add to the column names in the provided metadata file before final output", + default="", + show_default=True, +) +@click.option( + "--agg", + is_flag=True, + help="use aggregate metadata service instead of the metadata service", + show_default=True, +) +@click.pass_context +def discovery_read_and_combine( + ctx, + file, + output_filename, + discovery_column_to_map_on, + metadata_column_to_map, + max_number_discovery_records, + metadata_prefix, + agg, +): + """ + Combine provided metadata from file with current commons' discovery page metadata. + Outputs a TSV with the original discovery metadata and provided metadata. + """ + auth = ctx.obj["auth_factory"].get() + loop = get_or_create_event_loop_for_thread() + endpoint = ctx.obj.get("endpoint") + current_discovery_metadata_file = loop.run_until_complete( + output_expanded_discovery_metadata( + auth, endpoint=endpoint, limit=max_number_discovery_records, use_agg_mds=agg + ) + ) + + output_file = combine_discovery_metadata( + current_discovery_metadata_file, + file, + discovery_column_to_map_on, + metadata_column_to_map, + output_filename, + metadata_prefix=metadata_prefix, + ) + + click.echo(f"{output_file}") + + @click.command() @click.argument("guid") @click.pass_context @@ -95,5 +242,169 @@ def discovery_delete(ctx, guid): discovery.add_command(discovery_read, name="read") +discovery.add_command(discovery_read_and_combine, name="combine") discovery.add_command(discovery_publish, name="publish") discovery.add_command(discovery_delete, name="delete") + + +@discovery.group() +def objects(): + """For ingesting dataset-level files""" + pass + + +@click.command( + help=""" + Outputs a TSV with populated information. [DATASET_GUIDS] argument is + a variable number of datasets, e.g. 'phs000001.v1.p1.c1 phs000002.v1.p1.c1' + """ +) +@click.argument( + "dataset_guids", + nargs=-1, +) +@click.option( + "--only-object-guids", + help=""" + Outputs object guids to the command line in the following format: + drs://dg.4503:943200c3-271d-4a04-a2b6-040272239a64 + drs://dg.4503:58818753-e8b9-4225-99bd-635a36ac41d9 + drs://dg.4503:72a9051e-5afa-4eb1-8faf-2fb28369f99b + drs://dg.4503:034e406d-f8f1-4ee8-bbb3-3818473174a6 + Output can be piped into another command + """, + is_flag=True, +) +@click.option( + "--template", + help=""" + Output a TSV with required columns for `publish`. Will NOT contain any actual existing values for datasets or objects. + If you want the full output of what's in the commons, don't supply this flag. + """, + is_flag=True, +) +@click.option( + "--output_format", + help="format of output file (can only be either tsv or json)", + default="tsv", + show_default=True, +) +@click.pass_context +def discovery_objects_read( + ctx, dataset_guids, only_object_guids, template, output_format +): + """ + Download the discovery objects from dataset(s) from a commons into TSV file. + Outputs the TSV / JSON filename with format {commons-url}-discovery_objects.tsv + If --only-object-guids is set, output object guids to the command line. + If the --template option is set, output a TSV with just the required columns with + format {commons-url}-discovery_objects-TEMPLATE.tsv + """ + auth = ctx.obj["auth_factory"].get() + loop = get_or_create_event_loop_for_thread() + endpoint = ctx.obj.get("endpoint") + output = loop.run_until_complete( + output_discovery_objects( + auth, + dataset_guids=dataset_guids, + endpoint=endpoint, + template=template, + output_format=output_format, + only_object_guids=only_object_guids, + ) + ) + if not only_object_guids: + click.echo(output) + else: + for obj in output: + click.echo(obj["guid"]) + + +@click.command( + help=""" + Takes a TSV as input and writes the specified objects GUIDs and defined metadata into Gen3's + Metadata API, under a Discovery Metadata record for the dataset. The specified content from + the TSV goes into an 'objects' block of the dataset's metadata. + If dataset_guid already exists, update, if it doesn't already exist, create it. + Use 'discovery objects read --template' to get a TSV with the minimum required columns + to publish. + """ +) +@click.argument( + "file", + required=True, +) +@click.option( + "--overwrite", + help=""" + Replaces all guids in the 'objects' field of a dataset instead of appending (which is the default) + """, + is_flag=True, +) +@click.pass_context +def discovery_objects_publish( + ctx, + file, + overwrite, +): + """ + Run a discovery objects ingestion on a given metadata TSV file. If --overwrite is set, objects for + each dataset are replaced instead of appeding by default. + """ + auth = ctx.obj["auth_factory"].get() + + loop = get_or_create_event_loop_for_thread() + endpoint = ctx.obj.get("endpoint") + loop.run_until_complete( + publish_discovery_object_metadata( + auth, + file, + endpoint=endpoint, + overwrite=overwrite, + ) + ) + + +@click.command( + help="Delete objects related to datasets in TSV file or list of dataset_guids" +) +@click.argument( + "guids", + nargs=-1, +) +@click.option( + "--file", + help=""" + Delete objects from a file + """, + type=click.File("r"), +) +@click.pass_context +def discovery_objects_delete( + ctx, + guids, + file, +): + """ + Delete all discovery objects for the provided guid(s), or from the the file provided by the --file option. + [GUIDS] argument is a variable number of dataset GUIDs, e.g. 'phs000001.v1.p1.c1 phs000002.v1.p1.c1' + """ + auth = ctx.obj["auth_factory"].get() + if guids: + try_delete_discovery_objects(auth, guids) + if file: + if is_valid_object_manifest(file.name): + delete_objs = {} + tsv_reader = csv.DictReader(file, delimiter="\t") + for row in tsv_reader: + dataset_guid = row["dataset_guid"] + guid = row["guid"] + delete_objs.setdefault(dataset_guid, set()).add(guid) + try_delete_discovery_objects_from_dict(auth, delete_objs) + else: + click.echo("Invalid objects file") + + +objects.add_command(discovery_objects_read, name="read") +objects.add_command(discovery_objects_publish, name="publish") +objects.add_command(discovery_objects_delete, name="delete") diff --git a/gen3/cli/drs_pull.py b/gen3/cli/drs_pull.py index be81c5a01..dc8f0e9a1 100644 --- a/gen3/cli/drs_pull.py +++ b/gen3/cli/drs_pull.py @@ -1,15 +1,17 @@ import click +import json + from cdislogging import get_logger from gen3.tools.download.drs_download import ( list_files_in_drs_manifest, list_drs_object, download_files_in_drs_manifest, - download_drs_object, + download_drs_objects, list_access_in_drs_manifest, ) -logger = get_logger("download", log_level="warning") +logger = get_logger("__name__") @click.command() @@ -94,7 +96,6 @@ def download_manifest( @click.command() @click.argument("object_id") -@click.argument("output-dir", default=".") @click.option( "--no-progress", is_flag=True, @@ -113,6 +114,11 @@ def download_manifest( help="delete package files after unpacking them", show_default=True, ) +@click.option( + "--output-dir", + default=".", + show_default=True, +) @click.pass_context def download_object( ctx, @@ -129,16 +135,114 @@ def download_object( gen3 --endpoint mydata.org drs-pull object dg.XXXT/181af989-5d66-4139-91e7-69f4570ccd41 """ - download_drs_object( + logger.info(f"GA4GH DRS Object Streaming Starting...") + res = download_drs_objects( ctx.obj["endpoint"], ctx.obj["auth_factory"].get(), - object_id, + [object_id], output_dir, no_progress, not no_unpack_packages, delete_unpacked_packages, ) + success = True + + results = { + "succeeded": [], + "failed": [], + } + + for drs_object_id in res: + if drs_object_id in res and res[drs_object_id].status == "downloaded": + results["succeeded"].append(drs_object_id) + else: + logger.error(f"Object {drs_object_id} download failed.") + success = False + results["failed"].append(drs_object_id) + + if success: + logger.info("All objects downloaded successfully.") + else: + logger.error(f"One or more objects have failed to be downloaded. Details:") + + click.echo(json.dumps(results)) + + +@click.command() +@click.argument("object_ids", nargs=-1) +@click.option( + "--output-dir", + default=".", + show_default=True, +) +@click.option( + "--no-progress", + is_flag=True, + help="Hide the progress bar when downloading", + show_default=True, +) +@click.option( + "--no-unpack-packages", + is_flag=True, + help="disable the unpacking of downloaded packages", + show_default=True, +) +@click.option( + "--delete-unpacked-packages", + is_flag=True, + help="delete package files after unpacking them", + show_default=True, +) +@click.pass_context +def download_objects( + ctx, + output_dir: str, + object_ids: list, + no_progress: bool, + no_unpack_packages: bool, + delete_unpacked_packages: bool, +): + """ + Download DRS objects by their object ids + The user credentials use the Gen3Auth class so the Gen3Auth options are applicable (--auth and --endpoint) + An example: + gen3 --endpoint mydata.org drs-pull objects dg.XXXT/181af989-5d66-4139-91e7-69f4570ccd41 dg.YYYT/221af989-2266-2239-22e7-22f4570ccd22 + + """ + success = True + + results = { + "succeeded": [], + "failed": [], + } + + logger.info(f"GA4GH DRS Object Streaming Starting...") + logger.debug(f"object_ids: {object_ids}") + res = download_drs_objects( + ctx.obj["endpoint"], + ctx.obj["auth_factory"].get(), + object_ids, + output_dir, + no_progress, + not no_unpack_packages, + delete_unpacked_packages, + ) + for drs_object_id in res: + if drs_object_id in res and res[drs_object_id].status == "downloaded": + results["succeeded"].append(drs_object_id) + else: + logger.error(f"Object {drs_object_id} download failed.") + success = False + results["failed"].append(drs_object_id) + + if success: + logger.info("All objects downloaded successfully.") + else: + logger.error(f"One or more objects have failed to be downloaded. Details:") + + click.echo(json.dumps(results)) + @click.group() def drs_pull(): @@ -148,4 +252,5 @@ def drs_pull(): drs_pull.add_command(download_manifest, name="manifest") drs_pull.add_command(download_object, name="object") +drs_pull.add_command(download_objects, name="objects") drs_pull.add_command(list_files_or_access, name="ls") diff --git a/gen3/cli/file.py b/gen3/cli/file.py new file mode 100644 index 000000000..194b14466 --- /dev/null +++ b/gen3/cli/file.py @@ -0,0 +1,41 @@ +import click +import time + +from cdislogging import get_logger + +from gen3.file import Gen3File +from gen3.utils import get_or_create_event_loop_for_thread + + +logger = get_logger("__name__") + + +@click.group() +def file(): + "Commands for asynchronously downloading files from a server" + pass + + +@click.command(help="Download a single file using its GUID") +@click.argument("object_id", required=True) +@click.option("--path", "path", help="Path to store downloaded file in", default=".") +@click.pass_context +def single_download(ctx, object_id, path): + auth = ctx.obj["auth_factory"].get() + file_tool = Gen3File(auth) + + start_time = time.perf_counter() + logger.info(f"Start time: {start_time}") + + result = file_tool.download_single( + object_id=object_id, + path=path, + ) + + logger.info(f"Download - {'success' if result else 'failure'}") + + duration = time.perf_counter() - start_time + logger.info(f"\nDuration = {duration}\n") + + +file.add_command(single_download, name="download-single") diff --git a/gen3/cli/nih.py b/gen3/cli/nih.py new file mode 100644 index 000000000..ec6c8a308 --- /dev/null +++ b/gen3/cli/nih.py @@ -0,0 +1,107 @@ +import json + +import click + +from gen3.external.nih.dbgap_study_registration import dbgapStudyRegistration +from cdislogging import get_logger + +logger = get_logger("__name__") + + +@click.group() +def nih(): + """Commands for reading from NIH APIs""" + pass + + +@nih.group() +def dbgap_study_registration(): + """Commands for interacting with the dbgap study registration api""" + pass + + +@dbgap_study_registration.command(name="get-metadata") +@click.argument( + "studies", + nargs=-1, +) +def get_child_studies(studies): + """ + Retrieve the study metadata associated with the provided study names. + + This command fetches the metadata associated with the given study names from the dbGaP Study Registration API. + + NOTE: If no version is provided, then the latest version for a study will be used. + + Args: + studies (str): A space-separated list of study names in which to get metadata for. + Example: + gen3 nih dbgap-study-registration get-metadata phs002793 phs002794 phs002795 + > { + "phs002793.v2.p1": { + "@uid": "48490", + "@whole_study_id": "44467", + "@phs": "002793", + "@v": "2", + "@p": "1", + "@createDate": "2022-09-14T11:39:44-05:00", + "@completedByGPADate": "2022-11-07T09:51:24-05:00", + "@modDate": "2022-12-21T09:03:26-05:00", + "@maxParentChildStudyModDate": "2022-12-21T09:04:04-05:00", + "@handle": "SLICE", + "@num_participants": "500", + "StudyInfo": { + "@accession": "phs002793.v2.p1", + "@parentAccession": "phs002793.v2.p1", + "childAccession": [ + "phs002795.v1.p1", + "phs002796.v1.p1", + "phs002797.v1.p1", + "phs002798.v1.p1", + "phs002794.v2.p1" + ], + ...truncated for brevity... + } + } + """ + result = dbgapStudyRegistration().get_metadata_for_ids(studies) + + if not result: + logger.info(f"No study found for {studies}") + else: + click.echo(f"{json.dumps(result, indent=4)}") + + +@dbgap_study_registration.command(name="get-child-studies") +@click.argument( + "studies", + nargs=-1, +) +def get_child_studies(studies): + """ + Retrieve the child studies associated with the provided study names. + + This command fetches the child studies associated with the specified parent study names + from the dbGaP Study Registration API. + + NOTE: If no version is provided, then the latest version for a study will be used. + + Args: + studies (str): A space-separated list of parent study names for which to fetch child studies. + Example: + gen3 nih dbgap-study-registration get-child-studies phs002793 + > { + "phs002793.v2.p1": ["phs002795.v1.p1", "phs002796.v1.p1", "phs002797.v1.p1", "phs002798.v1.p1"] + } + gen3 nih dbgap-study-registration get-child-studies phs002076 phs002793 + > { + "phs002076.v2.p1": ["phs002077.v2.p1"], + "phs002793.v2.p1": ["phs002795.v1.p1", "phs002796.v1.p1", "phs002797.v1.p1", "phs002798.v1.p1"] + } + """ + result = dbgapStudyRegistration().get_child_studies_for_ids(studies) + + if not result: + logger.info(f"No child studies found for {studies}") + else: + click.echo(f"{json.dumps(result, indent=4)}") diff --git a/gen3/cli/objects.py b/gen3/cli/objects.py index 12c39d612..a81bbcf51 100644 --- a/gen3/cli/objects.py +++ b/gen3/cli/objects.py @@ -75,9 +75,23 @@ def crosswalk(): type=click.Path(writable=True), show_default=True, ) +@click.option( + "--python-subprocess-command", + "python_subprocess_command", + help="Command used to execute a python process. By default you should not need " + "to change this, but if you are running something like MacOS and only " + "installed Python 3.x you may need to specify 'python3'", + default="python", + show_default=True, +) @click.pass_context def objects_manifest_read( - ctx, output_file, num_processes, max_concurrent_requests, input_manifest + ctx, + output_file, + num_processes, + max_concurrent_requests, + input_manifest, + python_subprocess_command, ): auth = ctx.obj["auth_factory"].get() loop = get_or_create_event_loop_for_thread() @@ -89,6 +103,7 @@ def objects_manifest_read( num_processes=num_processes, max_concurrent_requests=max_concurrent_requests, input_manifest=input_manifest, + python_subprocess_command=python_subprocess_command, ) ) click.echo(output_file) @@ -283,6 +298,7 @@ def objects_manifest_publish( append_urls, manifest_file_delimiter, out_manifest_file, + force_metadata_columns_even_if_empty, ): auth = ctx.obj["auth_factory"].get() loop = get_or_create_event_loop_for_thread() @@ -379,7 +395,7 @@ def objects_manifest_delete_all_guids(ctx, file): \tA file path to a CSV containing mapping identifiers. Has a specialized \tcolumn naming format. Column names MUST be pipe-delimited and contain:\n \t\tcommons url | identifier type | identifier name\n - + \tYou can have any number of columns for mapping.\n """ ) diff --git a/gen3/cli/users.py b/gen3/cli/users.py new file mode 100644 index 000000000..b6aad66ab --- /dev/null +++ b/gen3/cli/users.py @@ -0,0 +1,29 @@ +import click + +from gen3users import main as users_cli + + +try: + from importlib.metadata import entry_points +except ImportError: + from importlib_metadata import entry_points + + +@click.group() +def main(): + """Gen3 Command Line Interface""" + pass + + +@click.group() +def users(): + """Commands for working with gen3users""" + pass + + +for command in users_cli.main.commands: + users.add_command(users_cli.main.get_command(ctx=None, cmd_name=command)) + +# load plug-ins from entry_points +for ep in entry_points().get("gen3.plugins", []): + ep.load() diff --git a/gen3/cli/wss.py b/gen3/cli/wss.py index 0aaede0ca..8949631eb 100644 --- a/gen3/cli/wss.py +++ b/gen3/cli/wss.py @@ -72,7 +72,7 @@ def copy(ctx, src, dest): @click.group() def wss(): - """Gen3 sdk workspace storage commands""" + """[unfinished] Commands for Workspace Storage Service""" pass diff --git a/gen3/discovery_dois.py b/gen3/discovery_dois.py new file mode 100644 index 000000000..49952381a --- /dev/null +++ b/gen3/discovery_dois.py @@ -0,0 +1,439 @@ +""" +Classes and functions for interacting with Gen3's Discovery Metadata and configured +external sources to obtain DOI metadata and mint real DOIs using Datacite's API. +""" + +import csv + +from cdislogging import get_logger + +from gen3.doi import DataCite, DigitalObjectIdentifier +from gen3.external.nih.dbgap_doi import dbgapDOI +from gen3.tools.metadata.discovery import ( + BASE_CSV_PARSER_SETTINGS, + output_expanded_discovery_metadata, +) +from gen3.utils import ( + get_delimiter_from_extension, + get_or_create_event_loop_for_thread, + is_status_code, +) + +logging = get_logger("__name__") + + +class GetMetadataInterface(object): + """ + Abstract base class acting as interface for customized metadata retrievers. + + This is intended to be used to create an instance for use in the + `mint_dois_for_discovery_datasets` function. See /docs for examples on + Discovery DOI Metadata usage. + + To use, implement a new class and inherit from this and implement the single + `get_doi_metadata` function. See `DbgapMetadataInterface` for an example. + """ + + def __init__( + self, + doi_publisher, + current_discovery_alternate_id_to_guid, + all_discovery_metadata, + exclude_datasets=None, + ): + """ + `current_discovery_alternate_id_to_guid` should be populated already with the + `metadata_field_for_alternate_id` value as the keys and the Metadata GUID + as the values. In other words, it should map the proposed DOI to the + existing metadata GUID. + + Args: + doi_publisher (str): The DOI Publisher that should be added as the + 'Publisher' in the DOI Metadata. + current_discovery_alternate_id_to_guid (Dict): Mapping of the proposed DOI to the + existing metadata GUID. + all_discovery_metadata (Dict): all the current discovery metadata + as a dictionary with metadata GUID as the key. + exclude_datasets (list[str], optional): List of datasets to ignore from Discovery Metadata + (don't attempt to read DOI Metadata or mint DOIs for these). The strings in the + list can be either the alternate IDs (from the specified `metadata_field_for_alternate_id`) + or they can be the Metadata GUIDs (or a mix). + """ + self.doi_publisher = doi_publisher + self.current_discovery_alternate_id_to_guid = ( + current_discovery_alternate_id_to_guid + ) + self.all_discovery_metadata = all_discovery_metadata + self.exclude_datasets = exclude_datasets or [] + + if self.exclude_datasets: + logging.debug(f"Excluding datasets: {exclude_datasets}") + + is_valid = True + if not self.doi_publisher: + logging.error("`doi_publisher` was not provided and is required") + is_valid = False + + if not self.current_discovery_alternate_id_to_guid: + logging.error( + "`current_discovery_alternate_id_to_guid` was not provided and is required" + ) + is_valid = False + + if not self.all_discovery_metadata: + logging.error("`all_discovery_metadata` was not provided and is required") + is_valid = False + + if not is_valid: + raise Exception( + "Unable to initialize object without provided fields. " + "Please see previous logged errors" + ) + + super(GetMetadataInterface, self).__init__() + + def get_doi_metadata(self): + """ + Return DOI metadata for each of the DOIs listed in `current_discovery_alternate_id_to_guid` + (optionally utilize the existing Discovery Metadata GUIDs and/or other + Discovery Metadata in `all_discovery_metadata` to make the necessary API + calls to get the DOI metadata). + + Returns: + Dict[dict]: metadata for each of the provided IDs (which + are the keys in the returned dict) + """ + raise NotImplementedError() + + +class DbgapMetadataInterface(GetMetadataInterface): + def get_doi_metadata(self): + """ + Return dbGaP metadata. + """ + studies = [ + study + for study, guid in self.current_discovery_alternate_id_to_guid.items() + if study not in self.exclude_datasets and guid not in self.exclude_datasets + ] + + # there's a separate DOI class for dbGaP as a wrapper around various + # different APIs we need to call. Whereas if there are API sources that have + # all available data, you could write a more generic SomeClass.as_gen3_metadata() + # + # NOTE: The final DOI does NOT include the required field `url` (because generating + # that requires knowledge of the final DOI identifier). + # So if you're using this, you need to ensure the DigitalObjectIdentifier + # object you create with this metadata is supplied with the right landing page URL (or + # you can ask it to generate one based on a root url provided). + dbgap_doi = dbgapDOI(publisher=self.doi_publisher) + + return dbgap_doi.get_metadata_for_ids(ids=studies) + + +def mint_dois_for_discovery_datasets( + gen3_auth, + datacite_auth, + get_doi_identifier_function, + metadata_interface, + doi_publisher, + commons_discovery_page, + doi_disclaimer, + doi_access_information, + doi_access_information_link, + doi_contact, + exclude_datasets=None, + metadata_field_for_alternate_id="guid", + use_doi_in_landing_page_url=False, + doi_metadata_field_prefix="doi_", + datacite_use_prod=False, + datacite_api=None, + publish_dois=False, +): + """ + Get Discovery Page records, obtain DOI-related information, mint/update DOIs, and persist + related DOI data into Gen3. Returns GUIDs with finalized metadata persisted into Gen3. + + This will: + - Get all Discovery Page records based on the provided `gen3_auth` + - Use `metadata_interface` to use class for a particular + DOI metadata retrieval (such as retrieving DOI metadata for dbGaP + studies) + - Request an identifier for missing records by using the provided + `get_doi_identifier_function` + - Send request(s) to DataCite's API to mint/update DOI's + - Persist DOI related metadata into Gen3's Discovery Metadata + + WARNING: The act of "minting" the DOI does not fully publish it. + You must explicitly supply `publish_dois=True` + + TODO: intelligent versioning. How do we know when a new VERSION of the + DOI needs to be created with a link to the previous? + Perhaps there's just a field to attach a related DOI? + + Args: + gen3_auth (Gen3Auth): Gen3 auth or tuple with basic auth name and password + datacite_auth (requests.auth.HTTPBasicAuth): Basic auth username and password + provided by datacite to use against their API. + + WARNING: DO NOT HARD-CODE SECRETS OR PASSWORDS IN YOUR CODE. USE + ENVIRONMENT VARIABLES OR PULL FROM AN EXTERNAL SOURCE. + get_doi_identifier_function (Function): A function to call to get a valid DOI identifier + This DOES need to include the required prefix. For example, + the function should return something like: "10.12345/This-is-custom-123" and randomize + output on every call to get a new ID. + metadata_interface (gen3.discovery_dois.GetMetadataInterface CLASS, NOT INSTANCE): + GetMetadataInterface child class name. Must implement the interface. + For example: `DbgapMetadataInterface` + doi_publisher (str): Who/what to list as the DOI Publisher (required field) + commons_discovery_page (str): URL for Discovery Page root. Usually something + like: "https://example.com/discovery" + doi_disclaimer (str): Disclaimer to add to all records (this only ends + up in the Gen3 Metadata such that it can be visualized in the Discovery Page) + doi_access_information (str): Text description of how to access the underlying + data referenced by the DOI. This is a required part of the Landing Page. + doi_access_information_link (str): Link out to more info about data access. + This isn't required, but combining this with the `doi_access_information` + provides an option for text and a link out. + doi_contact (str): Required DOI metadata, who to contact with questions + about the DOI. This could be an email, link to contact form, etc. + exclude_datasets (list[str], optional): List of datasets to ignore from Discovery Metadata + (don't attempt to read DOI Metadata or mint DOIs for these). The strings in the + list can be either the alternate IDs (from the specified `metadata_field_for_alternate_id`) + or they can be the Metadata GUIDs (or a mix). + metadata_field_for_alternate_id (str): Field in current Discovery Metadata + where the alternate ID is that you want to use + (this could be a dbGaP ID or anything else that is GLOBALLY UNIQUE) + If you want to use the "guid" itself, you shouldn't need to change this. + use_doi_in_landing_page_url (bool, optional): Whether or not to use + the actual DOI in the landing page URL (derived from `commons_discovery_page`). + If this is False, the existing GUID is used instead. + If you want to make the URL contain the real DOI and + create a way to alias Discovery so `/discovery/GUID` and `/discovery/DOI` + go to the same place, that's cool too. But that feature wasn't + available at the time this code was written, so keep this False until + then. + doi_metadata_field_prefix (str, optional): What to prepend to Gen3 metadata + fields related to DOIs + datacite_use_prod (bool, optional): Default `False`. Whether or not to use + the production Datacite API. + datacite_api (str, optional): Provide to override the Datacite API to + send DOI mint requests to. Providing this ignores `datacite_use_prod` + publish_dois (bool, optional): Whether or not to fully publish the DOIs + created. + + WARNING: Setting this as True is NOT REVERSABLE once this function + completes. This makes the DOIs PERMENANTLY SEARCHABLE. + """ + exclude_datasets = exclude_datasets or [] + + ( + current_discovery_alternate_id_to_guid, + all_discovery_metadata, + ) = get_alternate_id_to_guid_mapping( + auth=gen3_auth, + metadata_field_for_alternate_id=metadata_field_for_alternate_id, + ) + + all_doi_data = metadata_interface( + doi_publisher=doi_publisher, + current_discovery_alternate_id_to_guid=current_discovery_alternate_id_to_guid, + all_discovery_metadata=all_discovery_metadata, + exclude_datasets=exclude_datasets, + ).get_doi_metadata() + + datacite = DataCite( + api=datacite_api, + use_prod=datacite_use_prod, + auth_provider=datacite_auth, + ) + + doi_identifiers = {} + + for alternate_id, doi_metadata in all_doi_data.items(): + if ( + alternate_id in exclude_datasets + or current_discovery_alternate_id_to_guid[alternate_id] in exclude_datasets + ): + logging.info( + f"Metadata was found, but we're excluding {metadata_field_for_alternate_id} " + f"`{alternate_id}` (Metadata GUID: " + f"`{current_discovery_alternate_id_to_guid[alternate_id]}`). " + f"No DOI metadata will be retrieved and no DOI will be minted." + ) + continue + + # check if the Discovery metadata thinks an existing DOI has been minted + # (e.g. see if there's a DOI listed in the metadata) + existing_identifier = all_discovery_metadata.get( + current_discovery_alternate_id_to_guid[alternate_id], {} + ).get(doi_metadata_field_prefix + "identifier") + + if existing_identifier: + existing_doi_response = datacite.read_doi(existing_identifier) + + # either there's no identifier in existing metadata OR there is but there's + # not an existing DOI minted, so we should get new DOI metadata and mint + if not existing_identifier or ( + existing_identifier and not is_status_code(existing_doi_response, 200) + ): + identifier = existing_identifier or get_doi_identifier_function() + _raise_exception_on_collision(datacite, identifier) + + # note that doi_identifiers is updated within this function + _create_or_update_doi_and_persist( + update=False, + datacite=datacite, + current_discovery_alternate_id_to_guid=current_discovery_alternate_id_to_guid, + alternate_id=alternate_id, + use_doi_in_landing_page_url=use_doi_in_landing_page_url, + identifier=identifier, + commons_discovery_page=commons_discovery_page, + doi_metadata=doi_metadata, + publish_dois=publish_dois, + gen3_auth=gen3_auth, + doi_disclaimer=doi_disclaimer, + doi_access_information=doi_access_information, + doi_access_information_link=doi_access_information_link, + doi_contact=doi_contact, + doi_metadata_field_prefix=doi_metadata_field_prefix, + doi_identifiers=doi_identifiers, + ) + else: + _create_or_update_doi_and_persist( + update=True, + datacite=datacite, + current_discovery_alternate_id_to_guid=current_discovery_alternate_id_to_guid, + alternate_id=alternate_id, + use_doi_in_landing_page_url=use_doi_in_landing_page_url, + identifier=existing_identifier, + commons_discovery_page=commons_discovery_page, + doi_metadata=doi_metadata, + publish_dois=publish_dois, + gen3_auth=gen3_auth, + doi_disclaimer=doi_disclaimer, + doi_access_information=doi_access_information, + doi_access_information_link=doi_access_information_link, + doi_contact=doi_contact, + doi_metadata_field_prefix=doi_metadata_field_prefix, + doi_identifiers=doi_identifiers, + ) + + return doi_identifiers + + +def _create_or_update_doi_and_persist( + update, + datacite, + current_discovery_alternate_id_to_guid, + alternate_id, + use_doi_in_landing_page_url, + identifier, + commons_discovery_page, + doi_metadata, + publish_dois, + gen3_auth, + doi_disclaimer, + doi_access_information, + doi_access_information_link, + doi_contact, + doi_metadata_field_prefix, + doi_identifiers, +): + # writes metadata to a record + guid = current_discovery_alternate_id_to_guid[alternate_id] + + # the DOI already exists for existing metadata, update as necessary + if use_doi_in_landing_page_url: + doi = DigitalObjectIdentifier( + identifier=identifier, + root_url=commons_discovery_page, + **doi_metadata, + ) + else: + url = commons_discovery_page.rstrip("/") + f"/{guid}/" + doi = DigitalObjectIdentifier( + identifier=identifier, + url=url, + **doi_metadata, + ) + + if publish_dois: + logging.info(f"Publishing DOI `{identifier}`...") + doi.event = "publish" + + # takes either a DOI object, or an ID and will query the MDS + if update: + response = datacite.update_doi(doi) + else: + response = datacite.create_doi(doi) + + doi = DigitalObjectIdentifier.from_datacite_create_doi_response(response) + + # TODO: update `is_available` in `additional_metadata`? + + metadata = datacite.persist_doi_metadata_in_gen3( + guid=guid, + doi=doi, + auth=gen3_auth, + additional_metadata={ + "disclaimer": doi_disclaimer, + "access_information": doi_access_information, + "access_information_link": doi_access_information_link, + "contact": doi_contact, + }, + prefix=doi_metadata_field_prefix, + ) + + doi_identifiers[identifier] = metadata + + +def _raise_exception_on_collision(datacite, identifier): + existing_doi_for_new_id = datacite.read_doi(identifier) + if existing_doi_for_new_id: + raise Exception( + f"Conflicting DOI identifier generated. {identifier} already exists in DataCite." + ) + + +def get_alternate_id_to_guid_mapping(metadata_field_for_alternate_id, auth): + """ + Return mapping from the alternate ID in current Discovery Metadata + to Metadata GUID. This function uses the provided `metadata_field_for_alternate_id` + to find the actual value in the Discovery Metadata). + + Args: + metadata_field_for_alternate_id (str): Field in current Discovery Metadata + where the alternate ID is (this could be a dbGaP ID or anything else + that is GLOBALLY UNIQUE) + auth (Gen3Auth): Gen3 auth or tuple with basic auth name and password + + Returns: + (alternate_id_to_guid Dict, all_discovery_metadata Dict): mapping from alternate_id to + guid & all the discovery metadata + """ + loop = get_or_create_event_loop_for_thread() + output_filename = loop.run_until_complete( + output_expanded_discovery_metadata(auth, endpoint=auth.endpoint) + ) + + alternate_id_to_guid = {} + all_discovery_metadata = {} + with open(output_filename) as metadata_file: + csv_parser_setting = { + **BASE_CSV_PARSER_SETTINGS, + "delimiter": get_delimiter_from_extension(output_filename), + } + metadata_reader = csv.DictReader(metadata_file, **{**csv_parser_setting}) + for row in metadata_reader: + if row.get(metadata_field_for_alternate_id): + alternate_id_to_guid[row.get(metadata_field_for_alternate_id)] = row[ + "guid" + ] + all_discovery_metadata[row["guid"]] = row + else: + logging.warning( + f"Could not find field {metadata_field_for_alternate_id} on row: {row}. Skipping..." + ) + + return alternate_id_to_guid, all_discovery_metadata diff --git a/gen3/doi.py b/gen3/doi.py new file mode 100644 index 000000000..3df539dff --- /dev/null +++ b/gen3/doi.py @@ -0,0 +1,1059 @@ +""" +This is a lower-level DOI class for interacting with Datacite and actually +minting the DOIs. + +For collecting DOI Metadata, other classes (outside of the ones in this module) +can interact with different APIs to gather the necessary metadata. +""" +import backoff +import requests +import os + +from cdislogging import get_logger + +from gen3.tools.metadata.discovery import get_discovery_metadata +from gen3.metadata import Gen3Metadata +from gen3.utils import ( + raise_for_status_and_print_error, + is_status_code, + DEFAULT_BACKOFF_SETTINGS, +) + +logging = get_logger("__name__") + + +class DataCiteDOIValidationError(Exception): + pass + + +class DataCite(object): + """ + For interacting with DataCite's API. + https://support.datacite.org/reference/introduction + + Example usage: + + ``` + import os + from requests.auth import HTTPBasicAuth + import sys + + from gen3.doi import DataCite, DigitalObjectIdentifer + + PREFIX = "10.12345" + + def main(): + datacite = DataCite( + auth_provider=HTTPBasicAuth( + os.environ["DATACITE_USERNAME"], os.environ["DATACITE_PASSWORD"] + ), use_prod=True + ) + + doi = DigitalObjectIdentifer( + prefix=PREFIX, + # identifier=f"{PREFIX}/test1", + creators=["test"], + titles=["test"], + publisher="test", + publication_year=2023, + doi_type_general="Other", + doi_type="Study Record", + url="https://example.com", + version="0.1", + descriptions=[{"description": "this is a test resource"}], + foobar="test", + ) + + datacite.create_doi(doi) + + datacite.persist_doi_metadata_in_gen3(doi) + + if __name__ == "__main__": + main() + ``` + """ + + DEFAULT_DOI_ACCESS_INFORMATION = ( + "The data identified by this DOI is available through Gen3. Please refer " + "to other documentation for more details on access. Alternatively, use the contact " + "information provided on this page to request such information." + ) + DEFAULT_DOI_CONTACT_INFORMATION = ( + "Unavailable. Please refer to other links or " + "documentation on this site to determine an effective contact." + ) + DOI_RESOLVER = "https://doi.org" + PRODUCTION_URL = "https://api.datacite.org" + TEST_URL = "https://api.test.datacite.org" + + def __init__( + self, + api=None, + auth_provider=None, + use_prod=False, + ): + """ + Initiatilize. + + Args: + api (str, optional): Override API with provided URL. Will ignore + `use_prod` if this is provided + auth_provider (Gen3Auth, optional): A Gen3Auth class instance or compatible interface + use_prod (bool, optional): Default False. Whether or not to use the + production Datacite URL. + """ + self._auth_provider = auth_provider + if api: + self.api = api + elif use_prod: + self.api = DataCite.PRODUCTION_URL + else: + self.api = DataCite.TEST_URL + + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + def create_doi(self, doi): + """ + Create DOI provided via DataCite's API + + Args: + doi (gen3.doi.DigitalObjectIdentifier): DOI to create + """ + payload = doi.as_dict() + headers = { + "Content-type": "application/vnd.api+json", + "Accept": "application/vnd.api+json", + } + + endpoint = self.api.rstrip("/") + "/dois" + logging.info(f"POST-ing to {endpoint}...") + logging.debug(f"Data payload to {endpoint}: {payload}") + response = requests.post( + endpoint, json=payload, auth=self._auth_provider, headers=headers + ) + logging.debug(f"Response: {response.text}") + raise_for_status_and_print_error(response) + + return response + + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + def read_doi(self, identifier): + """ + Get DOI provided by DataCite's API. + + Args: + identifier (str): DOI identifier to read + """ + headers = { + "Content-type": "application/vnd.api+json", + "Accept": "application/vnd.api+json", + } + + endpoint = self.api.rstrip("/") + f"/dois/{identifier}" + logging.info(f"GET-ing to {endpoint}...") + response = requests.get(endpoint, auth=self._auth_provider, headers=headers) + logging.debug(f"Response: {response.text}") + + # 404's should not raise exceptions, instead returning nothing + if is_status_code(response, "404"): + return None + + raise_for_status_and_print_error(response) + + return response + + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + def update_doi(self, doi): + """ + Update DOI provided via DataCite's API + + Args: + doi (gen3.doi.DigitalObjectIdentifier): DOI to update + """ + payload = doi.as_dict() + identifier = doi.identifier + headers = { + "Content-type": "application/vnd.api+json", + "Accept": "application/vnd.api+json", + } + + endpoint = self.api.rstrip("/") + f"/dois/{identifier}" + logging.info(f"PUT-ing to {endpoint}...") + logging.debug(f"Data payload to {endpoint}: {payload}") + response = requests.put( + endpoint, json=payload, auth=self._auth_provider, headers=headers + ) + logging.debug(f"Response: {response.text}") + raise_for_status_and_print_error(response) + + return response + + @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + def delete_doi(self, identifier): + """ + Delete DOI provided via DataCite's API + + Args: + identifier (str): DOI identifier to delete + """ + headers = { + "Content-type": "application/vnd.api+json", + "Accept": "application/vnd.api+json", + } + + endpoint = self.api.rstrip("/") + f"/dois/{identifier}" + logging.info(f"DELETE-ing to {endpoint}...") + response = requests.delete(endpoint, auth=self._auth_provider, headers=headers) + logging.debug(f"Response: {response.text}") + raise_for_status_and_print_error(response) + + return response + + def persist_doi_metadata_in_gen3( + self, + guid, + doi, + auth, + additional_metadata=None, + prefix="", + ): + """ + Persist the DOI Metadata in Gen3. The default behavior is + to use the Gen3 Discovery feature set, where there exists an entry + for the DOI already in the Discovery Metadata under the `guid` provided. + + The DOI Metadata will be added under the existing `guid`'s `gen3_discovery` + metadata block so that it is available to the Gen3 Discovery Page. + + Args: + guid (str): globally unique ID for the metadata record + doi (DigitalObjectIdentifier): DOI object with required metadata + auth (TYPE): Description + additional_metadata (Dict, optional): Any additional metadata fields + to add to the DOI metadata into the Gen3 Metadata API. + This can include overrides to the default landing page info + for the following fields: + is_available (bool): True/False + disclaimer (str): Text to display at the top of the page + intended use is for tombstone pages, where the data is + no longer available and we need to note that + citation (str): By default: `Creator (PublicationYear). + Title. Version. Publisher. ResourceType. Identifier` + access_information (str): Text on how to access this data + access_information_link (str): HTTP link to additional info + about access + version_information (str): Text on any version information + contact (str): Contact information required for landing page + prefix (str): prefix for the metadata fields to prepend to all DOI + fields from `doi` AND all fields in `additional_metadata` + """ + metadata_service = Gen3Metadata(auth_provider=auth) + identifier = doi.identifier + + metadata = doi.as_gen3_metadata(prefix=prefix) + + additional_metadata = additional_metadata or {} + + is_available = additional_metadata.get("is_available", True) + is_available_text = "Yes" if is_available else "No" + metadata[prefix + "is_available"] = is_available_text + + if additional_metadata.get("is_available"): + del additional_metadata["is_available"] + + metadata[prefix + "disclaimer"] = additional_metadata.get("disclaimer", "") + if additional_metadata.get("disclaimer"): + del additional_metadata["disclaimer"] + + metadata[prefix + "citation"] = additional_metadata.get("citation") + if not metadata[prefix + "citation"]: + if not doi.optional_fields.get("version"): + logging.warning( + f"DOI {doi.identifier} is missing `version` in doi.optional_fields. " + f"Defaulting to `1` for citation." + ) + # `Creator (PublicationYear). Title. Version. Publisher. ResourceType. Identifier` + metadata[prefix + "citation"] = ( + f"{'& '.join([creator.get('name') for creator in doi.creators])} " + f"({doi.publication_year}). " + f"{'& '.join([titles.get('title') for titles in doi.titles])} " + f"{str(doi.optional_fields.get('version', '1'))}. " + f"{doi.publisher}. {doi.doi_type_general}. {doi.identifier}" + ) + if additional_metadata.get("citation"): + del additional_metadata["citation"] + + metadata[prefix + "version_information"] = additional_metadata.get( + "version_information" + ) + if not metadata[prefix + "version_information"]: + if not doi.optional_fields.get("version"): + logging.warning( + f"DOI {doi.identifier} is missing `version` in doi.optional_fields. " + f"Defaulting to `1`." + ) + metadata[ + prefix + "version_information" + ] = f"This is version {doi.optional_fields.get('version', '1')} of this {doi.doi_type_general}." + if additional_metadata.get("version_information"): + del additional_metadata["version_information"] + + metadata[prefix + "access_information"] = additional_metadata.get( + "access_information" + ) + if not metadata[prefix + "access_information"]: + logging.warning( + "No `access_information` provided in " + "`additional_metadata` in doi.persist_metadata_in_gen3() call. " + f"Consider providing this. Default will be used: {DataCite.DEFAULT_DOI_ACCESS_INFORMATION}" + ) + metadata[ + prefix + "access_information" + ] = DataCite.DEFAULT_DOI_ACCESS_INFORMATION + if additional_metadata.get("access_information"): + del additional_metadata["access_information"] + + metadata[prefix + "contact"] = additional_metadata.get("contact") + if not metadata[prefix + "contact"]: + logging.warning( + "No `contact` provided in " + "`additional_metadata` in doi.persist_metadata_in_gen3() call. " + f"Consider providing this. Default will be used: {DataCite.DEFAULT_DOI_CONTACT_INFORMATION}" + ) + metadata[prefix + "contact"] = DataCite.DEFAULT_DOI_CONTACT_INFORMATION + if additional_metadata.get("contact"): + del additional_metadata["contact"] + + # ensure prefix gets added to any additional metadata + additional_metadata_with_prefix = { + prefix + key.lstrip(prefix): value + for key, value in additional_metadata.items() + } + + metadata.update(additional_metadata_with_prefix) + logging.debug(f"Metadata for {guid}: {metadata}") + + try: + existing_record = metadata_service.get(guid=guid) + + # combine new metadata with existing metadata b/c MDS only supports + # shallow merge at the moment + existing_record.setdefault("gen3_discovery", {}).update(metadata) + metadata = existing_record + + metadata_service.update(guid=guid, metadata=metadata, aliases=[identifier]) + + logging.info(f"Updated existing Gen3 metadata record for {guid}.") + logging.debug( + f"Updated existing Gen3 metadata record for {guid}: {existing_record}" + ) + except requests.exceptions.HTTPError as exc: + if is_status_code(exc, "404"): + logging.info( + f"Existing Gen3 Discovery metadata record with GUID " + f"`{guid}` not found. Creating..." + ) + metadata = get_discovery_metadata(metadata) + logging.debug( + f"Creating missing GUID `{guid}` with metadata: {metadata}." + ) + metadata_service.create( + guid=guid, metadata=metadata, aliases=[identifier] + ) + else: + # non 404s should actually escalate + raise + + return metadata + + +class DigitalObjectIdentifier(object): + """ + Object representation of a DOI (including it's metadata). + Convert to a DataCite-compatible payload by using `as_dict()` + + Example return: + { + "data": { + "id": "10.5438/0012", + "type": "dois", + "attributes": { + "event": "publish", + "doi": "10.5438/0012", + "creators": [{ + "name": "DataCite Metadata Working Group" + }], + "titles": [{ + "title": "DataCite Metadata Schema Documentation for the Publication and Citation of Research Data v4.0" + }], + "publisher": "DataCite e.V.", + "publicationYear": 2016, + "types": { + "resourceTypeGeneral": "Text" + }, + "url": "https://schema.datacite.org/meta/kernel-4.4/index.html", + "schemaVersion": "http://datacite.org/schema/kernel-4" + } + } + } + """ + + # to update to a later version, the classes that handle representing various + # objects will need to change. Also it's possible other parts of this implementation + # will need to change (including general types, how they should be representined in JSON, etc) + # As such, this will remain "hard coded" + SCHEMA_VERSION = "http://datacite.org/schema/kernel-4.4" + + RESOURCE_GENERAL_TYPES = [ + "Audiovisual", + "Book", + "BookChapter", + "Collection", + "ComputationalNotebook", + "ConferencePaper", + "ConferenceProceeding", + "DataPaper", + "Dataset", + "Dissertation", + "Event", + "Image", + "InteractiveResource", + "Journal", + "JournalArticle", + "Model", + "OutputManagementPlan", + "PeerReview", + "PhysicalObject", + "Preprint", + "Report", + "Service", + "Software", + "Sound", + "Standard", + "Text", + "Workflow", + "Other", + ] + + OPTIONAL_FIELDS = [ + "subjects", + "contributors", + "descriptions", + "dates", + "relatedIdentifiers", + "geoLocations", + "language", + "alternateIdentifiers", + "identifiers", + "sizes", + "formats", + "version", + "rightsList", + "fundingReferences", + ] + + DEFAULT_DOI_TYPE = "Dataset" + + def __init__( + self, + prefix=None, + identifier=None, + creators=None, + titles=None, + publisher=None, + publication_year=None, + doi_type_general=None, + doi_type=None, + url=None, + root_url=None, + event=None, + _type="dois", + **kwargs, + ): + """ + To create a DOI you must specify identifier OR prefix. + + Mandatory fields for registration are defaulted the init. + + Supply any additional reccomended/optional as keyword args + + Arg definitions summarized from the official schema for v4.4: + https://schema.datacite.org/meta/kernel-4.4/doc/DataCite-MetadataKernel_v4.4.pdf + + Args: + prefix (str, optional): DOI Prefix + identifier (str, optional): a unique string that identifies the resource (the DOI) + NOTE: `identifier` is NOT case sensitive but the `url` is. Different + Datacite API's tend to return the DOI either with the mixed cases + presented, fully lower, or fully upper (which adds to the confusion). + As such, anything provided/received will be forced UPPER_CASE + automatically to reduce confusion. + creators (List[Dict], optional): the main + researcher(s) involved in producing the data, + or the author(s) of the publication. + titles (List[Dict], optional): a name or titles by which a resource is known + Format [{"title": "some title"}, ...] + publisher (str, optional): The name of the entity that holds, archives, publishes + prints, distributes, releases, issues, or produces the resource. + This property will be used to formulate the citation, so consider the + prominence of the role. For software, use Publisher for the code + repository. If there is an entity other than a code repository, + that "holds, archives, publishes, prints, distributes, releases, + issues, or produces" the code, use the property + Contributor/contributorType/ hostingInstitution for the code repository. + publication_year (int, optional): the year the data or resource was or will be made + publicly available + doi_type_general (str, optional): a description of the general type of a resource. (controlled list values, see https://support.datacite.org/docs/datacite-metadata-schema-v44-mandatory-properties#10a-resourcetypegeneral) + doi_type (str, optional): a description of the resource (free-format text) + url (str, optional): the web address of the landing page for the resource + root_url (str, optional): the root url for the landing page, must be used + in combination with `identifier` to form a final landing page url + event (str, optional): what event to issue against the DOI + Event field logic per DataCite API: + publish - Triggers a state move from draft or registered to findable + register - Triggers a state move from draft to registered + hide - Triggers a state move from findable to registered + _type (str, optional): The type of thing to interact with in Datacite + """ + self.prefix = prefix + self.identifier = identifier or "" + self.creators = creators or [] + self.titles = titles or [] + self.publisher = publisher + self.publication_year = publication_year + self.doi_type_general = ( + doi_type_general or DigitalObjectIdentifier.DEFAULT_DOI_TYPE + ) + self.doi_type = doi_type + self.url = url + self.root_url = root_url + self.event = event + self._type = _type + + # See NOTE: in docstring under `identifier` + self.identifier = self.identifier.upper() + + # any additional kwargs get interpreted as optional fields + self.optional_fields = {} + + for key, value in kwargs.items(): + if key in DigitalObjectIdentifier.OPTIONAL_FIELDS: + self.optional_fields[key] = value + else: + logging.warning( + f"Skipping '{key}={value}' because '{key}' " + f"is not a supported optional DOI metadata field." + ) + logging.debug( + f"Supported optional DOI metadata fields: " + f"{DigitalObjectIdentifier.OPTIONAL_FIELDS}" + ) + + if not (self.identifier or self.prefix): + raise DataCiteDOIValidationError( + "You must either specify a) `identifier` which is a full DOI with prefix " + "or b) `prefix` (which will let Datacite autogenerate the rest of " + "the ID. You can't leave both blank." + ) + + if self.root_url and self.url: + logging.warning( + "You provided both `root_url` and `url`. " + f"Preferring `url` ({self.url}) and ignoring `root_url` ({self.root_url})." + ) + self.root_url = None + + if self.root_url and self.prefix and not self.identifier: + raise DataCiteDOIValidationError( + "To use `root_url`, you MUST specify `identifier` (which is a " + "full DOI with prefix). You CANNOT rely on `prefix` (which will " + "let Datacite autogenerate the rest of the ID)." + ) + + if not self.url: + if not self.root_url: + raise DataCiteDOIValidationError( + "You must either specify a) `url` which is a full landing page url " + "or b) `root_url` (which will automatically get appended with " + "the `identifier` to form final url). You can't leave both blank." + ) + + self.url = self._get_url_from_root() + + if ( + doi_type_general + and doi_type_general not in DigitalObjectIdentifier.RESOURCE_GENERAL_TYPES + ): + logging.error(f"{doi_type_general} is not an accepted resourceTypeGeneral") + raise DataCiteDOIValidationError( + f"{doi_type_general} is not an accepted resourceTypeGeneral" + ) + + def _get_url_from_root(self): + return self.root_url.rstrip("/") + f"/{self.identifier}/" + + def as_gen3_metadata(self, prefix=""): + """ + Return a flat dictionary for ingestion into Gen3's Metadata Service + + Returns: + Dict: flat dictionary for ingestion into Gen3's Metadata Service + """ + data = {} + + if self.identifier: + data[prefix + "identifier"] = self.identifier + data[prefix + "resolvable_link"] = ( + DataCite.DOI_RESOLVER.rstrip("/") + "/" + self.identifier + ) + if self.creators: + data[prefix + "creators"] = " & ".join( + [item["name"] for item in self.creators] + ) + if self.titles: + data[prefix + "titles"] = ", ".join([item["title"] for item in self.titles]) + if self.publisher: + data[prefix + "publisher"] = self.publisher + if self.publication_year: + data[prefix + "publication_year"] = self.publication_year + if self.doi_type_general: + data[prefix + "resource_type_general"] = self.doi_type_general + if self.doi_type: + data[prefix + "resource_type"] = self.doi_type + if self.url: + data[prefix + "url"] = self.url + + for key, value in self.optional_fields.items(): + if key == "contributors": + data[prefix + key] = " & ".join([item["name"] for item in value]) + elif key == "descriptions": + data[prefix + key] = "\n\n".join( + [ + item["descriptionType"] + ": " + item["description"] + for item in value + ] + ) + elif key == "alternateIdentifiers": + # sometimes this is a list and sometimes is an object depending + # on which Datacite API you hit (PUT/POST/DELETE). Handle both + if type(value) == list: + value = ", ".join( + [ + item.get("alternateIdentifier") + + f" ({item.get('alternateIdentifierType')})" + for item in value + ] + ) + else: + value = ( + value.get("alternateIdentifier") + + f" ({value.get('alternateIdentifierType')})" + ) + + data[prefix + key] = value + elif key == "identifiers": + # sometimes this is a list and sometimes is an object depending + # on which Datacite API you hit (PUT/POST/DELETE). Handle both + if type(value) == list: + value = ", ".join( + [ + item.get("identifier") + f" ({item.get('identifierType')})" + for item in value + ] + ) + else: + value = ( + value.get("identifier") + f" ({value.get('identifierType')})" + ) + + data[prefix + key] = value + elif key == "fundingReferences": + # sometimes this is a list and sometimes is an object depending + # on which Datacite API you hit (PUT/POST/DELETE). Handle both + if type(value) == list: + value = ", ".join([funder.get("funderName") for funder in value]) + else: + value = value.get("funderName") + + data[prefix + key] = value + else: + data[prefix + key] = value + + return data + + def as_dict(self): + data = { + "data": { + "id": self.identifier, + "type": self._type, + "attributes": { + "doi": self.identifier, + }, + } + } + + if self.creators: + data["data"]["attributes"]["creators"] = [item for item in self.creators] + if self.titles: + data["data"]["attributes"]["titles"] = self.titles + if self.publisher: + data["data"]["attributes"]["publisher"] = self.publisher + if self.publication_year: + data["data"]["attributes"]["publicationYear"] = self.publication_year + if self.doi_type_general: + data["data"]["attributes"]["types"] = { + "resourceTypeGeneral": self.doi_type_general + } + else: + data["data"]["attributes"]["types"] = {} + if self.doi_type: + data["data"]["attributes"]["types"].update({"resourceType": self.doi_type}) + if self.url: + data["data"]["attributes"]["url"] = self.url + if self.event: + data["data"]["attributes"]["event"] = self.event + + data["data"]["attributes"]["schemaVersion"] = self.SCHEMA_VERSION + + for key, value in self.optional_fields.items(): + data["data"]["attributes"][key] = value + + # per DataCite API's spec, if you don't specify a full DOI you need + # to specify the prefix at least + if not self.identifier: + del data["data"]["attributes"]["doi"] + del data["data"]["id"] + data["data"]["attributes"]["prefix"] = self.prefix + + return data + + @staticmethod + def from_datacite_create_doi_response(response): + """ + Return a DigitalObjectIdentifier instance from the Response from a + Datacite Create DOI API call. + """ + raw_attributes = response.json().get("data", {}).get("attributes", {}) + attributes = {} + + # we only want the mandatory and optional fields we know how to handle, + # exclude all other fields returned by the API + for key, value in raw_attributes.items(): + if key in DigitalObjectIdentifier.OPTIONAL_FIELDS: + attributes[key] = value + + return DigitalObjectIdentifier( + prefix=raw_attributes.get("prefix"), + # Why .upper()? See NOTE: in docstring under `identifier` + identifier=raw_attributes.get("doi").upper(), + creators=raw_attributes.get("creators"), + titles=raw_attributes.get("titles"), + publisher=raw_attributes.get("publisher"), + publication_year=raw_attributes.get("publicationYear"), + url=raw_attributes.get("url"), + doi_type=raw_attributes.get("types", {}).get("resourceType", None), + doi_type_general=raw_attributes.get("types", {}).get( + "resourceTypeGeneral", None + ), + **attributes, + ) + + +class DigitalObjectIdentifierCreator(object): + """ + Class to help with representing a Creator object for the DataCite API + per their schema. + + NOTE: If you use anything other than the schema this was built for (v4.4), + this logic will need to be updated. + + From the DataCite Metadata Schema V 4.4: + + * 20.2 Creator 0-n + The institution or person + responsible for creating the + related resource + To supply multiple creators, + repeat this property. + + * 20.2.1 creatorName 1 + The full name of the related + item creator + + Examples: Charpy, Antoine; + Jemison, Mae; Foo Data + Center Note: The personal + name, format should be: + family, given. Non- roman + names may be transliterated + according to the ALA-LC + schemas12. + + * 20.2.1.a nameType 0-1 + The type of name Controlled List Values: + Organizational + Personal (default) + + * 20.2.2 givenName 0-1 + The personal or first name of + the creator + Examples based on the 20.11.1 names: Antoine; Mae + + * 20.2.3 familyName 0-1 + The surname or last name of + the creator + + Examples based on the 2.1 + names: Charpy; Jemison + """ + + NAME_TYPE_PERSON = "Personal" + NAME_TYPE_ORGANIZATION = "Organizational" + + def __init__( + self, + name, + name_type=NAME_TYPE_PERSON, + given_name=None, + family_name=None, + ): + self.name = name + + allowed_name_types = [ + DigitalObjectIdentifierCreator.NAME_TYPE_PERSON, + DigitalObjectIdentifierCreator.NAME_TYPE_ORGANIZATION, + ] + if name_type not in allowed_name_types: + logging.error( + f"Provided name_type '{name_type}' is NOT in {allowed_name_types}. " + f"Defaulting to '{DigitalObjectIdentifierCreator.NAME_TYPE_PERSON}'." + ) + name_type = DigitalObjectIdentifierCreator.NAME_TYPE_PERSON + + self.name_type = name_type + self.given_name = given_name + self.family_name = family_name + + def as_dict(self): + data = { + "name": self.name, + "nameType": self.name_type, + } + + if self.given_name: + data.update({"givenName": self.given_name}) + + if self.family_name: + data.update({"familyName": self.family_name}) + + if ( + self.given_name + and self.family_name + and self.name_type == DigitalObjectIdentifierCreator.NAME_TYPE_PERSON + ): + data.update({"name": f"{self.family_name}, {self.given_name}"}) + + return data + + +class DigitalObjectIdentifierFundingReference(object): + """ + This could theoretically support more options, but at the point of writing, + they weren't deemed necessary. Leaving this as an isolated class in case + we want to expand in the future. + + From the DataCite Metadata Schema V 4.4: + + * 19 FundingReference 0-n + Information about financial + support (funding) for the + resource being registered + It is a best practice to supply + funding information when + financial support has been + received. + + * 19.1 funderName 1 + Name of the funding provider Example: Gordon and Betty + Moore Foundation + + * 19.2 funderIdentifier 0-1 + Uniquely identifies a funding + entity, according to various + types. + Example: + https://doi.org/10.13039/100 + 000936 + + * 19.2.a funderIdentifierType 0-1 + The type of the funderIdentifier Controlled List Values: + GRID + ISNI + ROR + Other + """ + + def __init__( + self, + name, + ): + self.name = name + + def as_dict(self): + data = { + "funderName": f"{self.name}", + } + + return data + + +class DigitalObjectIdentifierTitle(object): + """ + This could theoretically support more options, but at the point of writing, + they weren't deemed necessary. Leaving this as an isolated class in case + we want to expand in the future. + + From the DataCite Metadata Schema V 4.4: + * 3 Title 1-n + A name or title by which a + resource is known. May be + the title of a dataset or the + name of a piece of software. + Free text. + + * 3.a titleType 0-1 + The type of Title (other than + the Main Title) + Controlled List Values: + AlternativeTitle + Subtitle + TranslatedTitle + Other + """ + + def __init__( + self, + title, + ): + self.title = title + + def as_dict(self): + data = { + "title": f"{self.title}", + } + + return data + + +class DigitalObjectIdentifierDescription(object): + """ + From the DataCite Metadata Schema V 4.4: + * 17 Description 0-n + All additional information that + does not fit in any of the other + categories. May be used for + technical information. + Free text + *** + It is a best practice to supply a + description. + + * 17.a descriptionType 1 + The type of the Description If Description is used, + descriptionType is mandatory. + + Controlled List Values: + Abstract + Methods + SeriesInformation + TableOfContents + TechnicalInfo + Other + + Note: SeriesInformation as a + container for series title, + volume, issue, page number, + and related fields, is now + superseded by the new + RelatedItem property + """ + + TYPE_ABSTRACT = "Abstract" + TYPE_METHODS = "Methods" + TYPE_SERIES_INFORMATION = "SeriesInformation" + TYPE_TABLE_OF_CONTENTS = "TableOfContents" + TYPE_TECHNICAL_INFO = "TechnicalInfo" + TYPE_OTHER = "Other" + + def __init__(self, description, description_type=TYPE_ABSTRACT): + self.description = description + + allowed_types = [ + DigitalObjectIdentifierDescription.TYPE_ABSTRACT, + DigitalObjectIdentifierDescription.TYPE_METHODS, + DigitalObjectIdentifierDescription.TYPE_SERIES_INFORMATION, + DigitalObjectIdentifierDescription.TYPE_TABLE_OF_CONTENTS, + DigitalObjectIdentifierDescription.TYPE_TECHNICAL_INFO, + DigitalObjectIdentifierDescription.TYPE_OTHER, + ] + if description_type not in allowed_types: + logging.error( + f"Provided description_type '{description_type}' is NOT in {allowed_types}. " + f"Defaulting to '{DigitalObjectIdentifierDescription.TYPE_ABSTRACT}'." + ) + description_type = DigitalObjectIdentifierDescription.TYPE_ABSTRACT + + self.description_type = description_type + + def as_dict(self): + data = { + "description": f"{self.description}", + "descriptionType": f"{self.description_type}", + } + + return data + + +class DigitalObjectIdenfitierAlternateID(object): + """ + From the DataCite Metadata Schema V 4.4: + + 11 alternateIdentifier 0-n An identifier other than the + primary Identifier applied to the + resource being registered. This + may be any alphanumeric string + which is unique within its + domain of issue. May be used for + local identifiers. The + AlternateIdentifier should be an + additional identifier for the same + instance of the resource (i.e., + same location, same file). + Free text + *** + Example: + E-GEOD-34814 + + 11.a alternateIdentifierType + 1 The type of the + AlternateIdentifier + Free text + *** + If alternateIdentifier is used, + alternateIdentifierType is + mandatory. For the above + example, the + alternateIdentifierType would + be "A local accession number" + """ + + def __init__(self, alternate_id, alternate_id_type): + self.alternate_id = alternate_id + self.alternate_id_type = alternate_id_type + + def as_dict(self): + data = { + "alternateIdentifier": f"{self.alternate_id}", + "alternateIdentifierType": f"{self.alternate_id_type}", + } + + return data diff --git a/gen3/external/__init__.py b/gen3/external/__init__.py new file mode 100644 index 000000000..e93e5d8a0 --- /dev/null +++ b/gen3/external/__init__.py @@ -0,0 +1,9 @@ +""" +gen3.external + +For housing clients and wrappers against non-Gen3 APIs. At the moment, they +are usually used for gathering metadata. + +If you're adding a new metadata source, use the ExternalMetadataSourceInterface. +""" +from gen3.external.external import ExternalMetadataSourceInterface diff --git a/gen3/external/external.py b/gen3/external/external.py new file mode 100644 index 000000000..b8bcd50ff --- /dev/null +++ b/gen3/external/external.py @@ -0,0 +1,48 @@ +class ExternalMetadataSourceInterface(object): + """ + A simple interface for external metadata sources. The idea is to have + consistency that allows combining the outputs and making similar function + calls with similar input. + + test0 = dbgapFHIR() + metadata_0 = test0.get_metadata_for_ids(["foo", "bar"]) + + test1 = NIHReporter() + metadata_1 = test1.get_metadata_for_ids(["foo", "bar"]) + + test2 = dbgapDOI() + metadata_2 = test2.get_metadata_for_ids(["foo", "bar"]) + + test3 = somethingElse() + metadata_3 = test3.get_metadata_for_ids(["foo", "bar"]) + + all_metadata = metadata_0 + metadata_1 + metadata_2 + metadata_3 + """ + + def __init__( + self, + api="", + auth_provider=None, + ): + self.api = api + self._auth_provider = auth_provider + + def get_metadata_for_ids(ids): + """ + Returns a dictionary with the id as the key and associated metadata + as another dictionary of values. + + Example, given: ["foo", "bar"], return: + { + "foo": {"name": "Foo", "description": "this is something"}, + "bar": {"name": "Bar", "description": "this is also something"}, + } + + Args: + ids (List[str]): list of IDs to query for + + Returns: + Dict[dict]: metadata for each of the provided IDs (which + are the keys in the returned dict) + """ + raise NotImplementedError() diff --git a/.secinclude b/gen3/external/nih/__init__.py similarity index 100% rename from .secinclude rename to gen3/external/nih/__init__.py diff --git a/gen3/external/nih/dbgap_doi.py b/gen3/external/nih/dbgap_doi.py new file mode 100644 index 000000000..ea8366b86 --- /dev/null +++ b/gen3/external/nih/dbgap_doi.py @@ -0,0 +1,304 @@ +from cdislogging import get_logger + +from gen3.doi import ( + DigitalObjectIdentifierCreator, + DigitalObjectIdentifierFundingReference, + DigitalObjectIdentifierDescription, + DigitalObjectIdentifierTitle, + DigitalObjectIdenfitierAlternateID, +) +from gen3.external import ExternalMetadataSourceInterface +from gen3.external.nih.dbgap_study_registration import dbgapStudyRegistration +from gen3.external.nih.dbgap_fhir import dbgapFHIR +from gen3.external.nih.utils import get_dbgap_accession_as_parts + +logging = get_logger("__name__") + + +class dbgapDOI(ExternalMetadataSourceInterface): + """ + Class for interacting with various National Center for + Biotechnology Information (NCBI)'s database of Genotypes and Phenotypes (dbGaP) + APIs to get necessary information for a DOI. + + Example Usage: + + ``` + from gen3.external.nih.dbgap_doi import dbgapDOI + + + def main(): + studies = [ + "phs000007.v32", + "phs000179.v1.p1.c1", + ] + + dbgap_doi = dbgapDOI(publisher="Gen3 Foobar Instance") + all_doi_data = dbgap_doi.get_metadata_for_ids(ids=studies) + + print(metadata) + + + if __name__ == "__main__": + main() + ``` + + See doi.py module for more information on how to use this DOI metadata to + actually interact with Datacite's API and mint DOIs. + + """ + + def __init__( + self, + publisher, + ): + """ + Initiatilize the class for interacting with dbgap APIs to get + DOI information. + + Args: + publisher (str): The DOI Publisher that should be added as the + 'Publisher' in the DOI Metadata. Per the Datacite docs, this is: + "The name of the entity that holds, archives, publishes prints, + distributes, releases, issues, or produces the resource. This + property will be used to formulate the citation, so consider the + prominence of the role. For software, use Publisher for the code + repository. If there is an entity other than a code repository, + that "holds, archives, publishes, prints, distributes, releases, + issues, or produces" the code, use the property + Contributor/contributorType/ hostingInstitution for the code + repository." + """ + self.publisher = publisher + + def get_metadata_for_ids(self, ids): + """ + Return DOI metadata for each of the provided IDs. + + Args: + ids (List[str]): list of IDs to query for + + Returns: + Dict[dict]: metadata for each of the provided IDs (which + are the keys in the returned dict) + """ + logging.info("Getting dbGaP DOI metadata...") + logging.debug(f"Provided ids for dbGaP DOI metadata: {ids}") + + dbgap_study_registration = dbgapStudyRegistration() + dbgap_fhir = dbgapFHIR() + + dbgap_study_registration_metadata = ( + dbgap_study_registration.get_metadata_for_ids(ids) + ) + dbgap_fhir_metadata = dbgap_fhir.get_metadata_for_ids(ids) + + all_doi_metadata = {} + + for phsid in ids: + if not dbgap_fhir_metadata.get(phsid): + logging.error( + f"{phsid} is missing dbGaP FHIR metadata. Cannot " + f"continue creating a DOI without it. Skipping..." + ) + continue + + if not dbgap_study_registration_metadata.get(phsid): + logging.error( + f"{phsid} is missing dbGaP Study Registration " + f"metadata. Cannot continue creating a DOI without it. Skipping..." + ) + continue + + doi_metadata = {} + + # 1) required fields + doi_metadata["creators"] = dbgapDOI._get_doi_creators( + phsid, dbgap_study_registration_metadata + ) + doi_metadata["titles"] = dbgapDOI._get_doi_title(phsid, dbgap_fhir_metadata) + doi_metadata["publication_year"] = dbgapDOI._get_doi_publication_year( + phsid, dbgap_fhir_metadata + ) + doi_metadata["doi_type_general"] = "Dataset" + + # publisher is provided + doi_metadata["publisher"] = self.publisher + + # NOTE: This does NOT include the required landing page URL + # b/c this requires the final ID (which should be generated + # elsewhere). + # doi_metadata["url"] = None + + # 2) optional fields + doi_metadata["version"] = dbgapDOI._get_doi_version( + phsid, dbgap_fhir_metadata + ) + doi_metadata["contributors"] = dbgapDOI._get_doi_contributors( + phsid, dbgap_study_registration_metadata, dbgap_fhir_metadata + ) + doi_metadata["descriptions"] = dbgapDOI._get_doi_descriptions( + phsid, dbgap_fhir_metadata + ) + doi_metadata[ + "alternateIdentifiers" + ] = dbgapDOI._get_doi_alternate_identifiers(phsid, dbgap_fhir_metadata) + doi_metadata["fundingReferences"] = dbgapDOI._get_doi_funding( + phsid, dbgap_fhir_metadata + ) + + all_doi_metadata[phsid] = doi_metadata + + return all_doi_metadata + + @staticmethod + def _get_doi_creators(phsid, dbgap_study_registration_metadata): + result = [] + + persons = ( + dbgap_study_registration_metadata.get(phsid, {}) + .get("Authority", {}) + .get("Persons", {}) + .get("Person", []) + ) + for person in persons: + # dbgap's API is inconsistent. Sometimes this is represented + # like this: {'@allow_direct_access': 'true', '#text': 'PI'} and sometimes + # it's just a string like "PI". This handles both cases to determine + # the PI + if person.get("Role") == "PI" or ( + "#text" in person.get("Role") + and person.get("Role").get("#text") == "PI" + ): + creator = DigitalObjectIdentifierCreator( + name=person.get("@lname", "") + ", " + person.get("@fname", ""), + name_type=DigitalObjectIdentifierCreator.NAME_TYPE_PERSON, + given_name=person.get("@fname", ""), + family_name=person.get("@lname", ""), + ) + result.append(creator.as_dict()) + + return result + + @staticmethod + def _get_doi_title(phsid, dbgap_fhir_metadata): + result = [] + + title = DigitalObjectIdentifierTitle( + dbgap_fhir_metadata.get(phsid, {}).get("Title") + ) + + result.append(title.as_dict()) + + return result + + @staticmethod + def _get_doi_publication_year(phsid, dbgap_fhir_metadata): + date = dbgap_fhir_metadata.get(phsid, {}).get("ReleaseDate") + + if not date: + logging.debug(f"dbgap_fhir_metadata: {dbgap_fhir_metadata}") + raise Exception( + f"ReleaseDate from dbgap FHIR does not match expected pattern " + f"YYYY-MM-DD: '{date}'. Unable to parse." + ) + + if date: + date = date.split("-")[0] + + if len(date) != 4: + logging.debug(f"dbgap_fhir_metadata: {dbgap_fhir_metadata}") + raise Exception( + f"ReleaseDate from dbgap FHIR does not match expected pattern " + f"YYYY-MM-DD: '{date}'. Unable to parse." + ) + + return date + + @staticmethod + def _get_doi_contributors( + phsid, dbgap_study_registration_metadata, dbgap_fhir_metadata + ): + result = [] + + persons = ( + dbgap_study_registration_metadata.get(phsid, {}) + .get("Authority", {}) + .get("Persons", {}) + .get("Person", []) + ) + for person in persons: + # dbgap's API is inconsistent. Sometimes this is represented + # like this: {'@allow_direct_access': 'true', '#text': 'PI'} and sometimes + # it's just a string like "PI". This handles both cases to determine + # the PI and PI_ASSIST persons + if ( + person.get("Role") == "PI" + or person.get("Role") == "PI_ASSIST" + or ( + "#text" in person.get("Role") + and ( + person.get("Role").get("#text") == "PI" + or person.get("Role").get("#text") == "PI_ASSIST" + ) + ) + ): + creator = DigitalObjectIdentifierCreator( + name=person.get("@lname", "") + ", " + person.get("@fname", ""), + name_type=DigitalObjectIdentifierCreator.NAME_TYPE_PERSON, + given_name=person.get("@fname", ""), + family_name=person.get("@lname", ""), + ) + result.append(creator.as_dict()) + + if person.get("Organization"): + creator = DigitalObjectIdentifierCreator( + name=person.get("Organization"), + name_type=DigitalObjectIdentifierCreator.NAME_TYPE_ORGANIZATION, + ) + result.append(creator.as_dict()) + + return result + + @staticmethod + def _get_doi_version(phsid, dbgap_fhir_metadata): + version = 1 + ids = dbgap_fhir_metadata.get(phsid, {}).get("Identifier") + for phsid in ids: + standardized_phsid_parts = get_dbgap_accession_as_parts(phsid) + + # if there is a phsid parsed, then this Identifier matches + # the pattern of the full phsid, so we can parse the version out + if standardized_phsid_parts["phsid"]: + version = standardized_phsid_parts["version_number"] + + return version + + @staticmethod + def _get_doi_descriptions(phsid, dbgap_fhir_metadata): + result = [] + + description = DigitalObjectIdentifierDescription( + description=dbgap_fhir_metadata.get(phsid, {}).get("Description") + ) + result.append(description.as_dict()) + + return result + + @staticmethod + def _get_doi_alternate_identifiers(phsid, dbgap_fhir_metadata): + result = [] + + for alternate_id in dbgap_fhir_metadata.get(phsid, {}).get("Identifier"): + alternate_id_obj = DigitalObjectIdenfitierAlternateID( + alternate_id=alternate_id, alternate_id_type="dbGaP" + ) + result.append(alternate_id_obj.as_dict()) + + return result + + @staticmethod + def _get_doi_funding(phsid, dbgap_fhir_metadata): + return DigitalObjectIdentifierFundingReference( + name=dbgap_fhir_metadata.get(phsid, {}).get("Sponsor") + ).as_dict() diff --git a/gen3/external/nih/dbgap_fhir.py b/gen3/external/nih/dbgap_fhir.py new file mode 100644 index 000000000..8cd5c2fd2 --- /dev/null +++ b/gen3/external/nih/dbgap_fhir.py @@ -0,0 +1,571 @@ +import backoff +import collections +import copy +import csv +import time + +from cdislogging import get_logger +import fhirclient.models.researchstudy as researchstudy +from fhirclient import client +from fhirclient.models.fhirreference import FHIRReference +from fhirclient.models.identifier import Identifier +from fhirclient.models.meta import Meta + +from gen3.external import ExternalMetadataSourceInterface +from gen3.external.nih.utils import get_dbgap_accession_as_parts +from gen3.tools.metadata.discovery import sanitize_tsv_row, BASE_CSV_PARSER_SETTINGS +from gen3.utils import DEFAULT_BACKOFF_SETTINGS + +logging = get_logger("__name__") + + +class dbgapFHIR(ExternalMetadataSourceInterface): + """ + Class for interacting with National Center for + Biotechnology Information (NCBI)'s database of Genotypes and Phenotypes (dbGaP) + FHIR API + + Example Usage: + + ``` + from gen3.external.nih.dbgap_fhir import dbgapFHIR + + + def main(): + studies = [ + "phs000007", + "phs000166.c3", + "phs000179.v1.p1.c1", + ] + dbgapfhir = dbgapFHIR() + simplified_data = dbgapfhir.get_metadata_for_ids(ids=studies) + + file_name = "data_file.tsv" + dbgapFHIR.write_data_to_file(simplified_data, file_name) + + + if __name__ == "__main__": + main() + ``` + + This provides utilities for getting public study-level data using a third-party + FHIR client library behind the scenes. This also provides some opinionated methods + for transforming the raw dbGaP data into a "simplified" format. + + dbGaP's FHIR naming conventions and organization doesn't translate well to simple + key-value pairs. We want to translate the info provided to simplify its understanding + and allow ingest into our Metadata API as denormalized as possible, in other words, reduce + the verbosity and nesting. + + This code attempts to remain the least "hard-coded" as possible, prefering to + add special cases for known deviations of structure rather than writing code to literally + parse every field we want. + + Note that either way, if dbGaP changes their structure or we want additional information, + some of these functions may need to get reworked (or calling functions will need to do + "hard-coded" parsing in addition to using the raw FHIR output objects / FHIR library). + + Known dbGaP FHIR fields interpretted as Lists: + identifier + keyword + Citers + condition + StudyConsents + partOf + + Known dbGaP FHIR fields interpretted as Strings: + description + id + status + resourceType + title + sponsor + StudyOverviewUrl + ReleaseDate + focus + enrollment + category + + Known dbGaP FHIR fields interpretted as Strings but generally represent Integers: + NumMolecularDatasets + NumSubjects + NumSubStudies + NumPhenotypeDatasets + NumSamples + NumAnalyses + NumVariables + NumDocuments + + Attributes: + api (str): URL to dbGaP's FHIR API + DBGAP_SLEEP_TIME_TO_AVOID_RATE_LIMITS (float): Time to sleep in seconds between + requests to dbGaP's FHIR server. This was tuned to avoid rate limiting + experienced with smaller values. + + TODO: implement exponential backoff using backoff library used elsewhere + fhir_client (fhirclient.client.FHIRClient): client class for interacting with FHIR + SUSPECTED_SINGLE_ITEM_LIST_FIELDS (List[str]): dbGaP FHIR fields that are lists + in the API, but in all testing only yield (and logicially should only yield) + a single result. The single item in the list will be pulled out so that the + final field is NOT a list. + UNNECESSARY_FIELDS(List[str]): fields to remove in final result + """ + + # this is necessary in addition to exponential backoff to reduce the number + # of forced backoff requests (too many requests in a timeframe seem to trip + # some rate limiting on NIH's side) + DBGAP_SLEEP_TIME_TO_AVOID_RATE_LIMITS = 0.6 + + SUSPECTED_SINGLE_ITEM_LIST_FIELDS = [ + "sponsor", + "StudyOverviewUrl", + "ReleaseDate", + "focus", + "enrollment", + "category", + ] + + UNNECESSARY_FIELDS = [ + "meta", + "StudyMarkersets", + "security", + "ComputedAncestry", + "MolecularDataTypes", + ] + + DISCLAIMER = ( + "This information was retrieved from dbGaP's FHIR API for " + "discoverability purposes and may not contain fully up-to-date " + "information. Please refer to the official dbGaP FHIR server for up-to-date " + "FHIR data." + ) + + def __init__( + self, + api="https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1", + auth_provider=None, + fhir_app_id="gen3_sdk", + suspected_single_item_list_fields=None, + unnecessary_fields=None, + disclaimer=None, + ): + """ + Inializate an instance of the class + + Args: + api (str, optional): URL to dbGaP's FHIR API + auth_provider (None, optional): Description + fhir_app_id (str, optional): name of app_id to pass into the FHIR client library + """ + super(dbgapFHIR, self).__init__(api, auth_provider) + + fhir_client_settings = { + "app_id": fhir_app_id, + "api_base": api, + } + self.fhir_client = client.FHIRClient(settings=fhir_client_settings) + self.suspected_single_item_list_fields = ( + suspected_single_item_list_fields + or dbgapFHIR.SUSPECTED_SINGLE_ITEM_LIST_FIELDS + ) + self.unnecessary_fields = unnecessary_fields or dbgapFHIR.UNNECESSARY_FIELDS + self.disclaimer = disclaimer or dbgapFHIR.DISCLAIMER + + def get_metadata_for_ids(self, ids): + """ + Return simplified FHIR metadata for each of the provided IDs. + + NOTE: This is NOT the raw metadata from the dbGaP FHIR server. This is a + denormalized and simplified representation of that data intended + to both reduce the nesting and ease the understanding of the + information. + + Args: + ids (List[str]): list of IDs to query FHIR for + + Returns: + Dict[dict]: metadata for each of the provided IDs (which + are the keys in the returned dict) + """ + logging.info("Getting dbGaP FHIR metadata...") + logging.debug("Provided ids for dbGaP FHIR metadata: {ids}") + + simplified_data = {} + + original_phsid_to_standardized = {} + + standardized_phsids = [] + for phsid in ids: + phsid_parts = get_dbgap_accession_as_parts(phsid) + + # allow form of ONLY "phs000123", dbGaP FHIR API cannot handle + # isolating a specific version + standardized_phsid = phsid_parts["phsid"] + + # we want the final returned value to include whatever format was + # used in the original call, so even though we are using the standardized + # phs against the API, we need to convert BACK to the original + # before returning. This dict maintains that mapping. + original_phsid_to_standardized[phsid] = standardized_phsid + + standardized_phsids.append(standardized_phsid) + + all_data = self.get_dbgap_fhir_objects_for_studies(standardized_phsids) + + standardized_phsids_data = {} + for phsid in ids: + standardized_phsid = original_phsid_to_standardized[phsid] + + # it's possible we've already simplified the data for this phsid + # (ex: phs00007.p1.v1.c1 AND phs00007.p1.v1.c2 rely on data for the + # overall study, phs00007. So there's no need to parse this twice ) + # + # NOTE: This is because dbGaP has metadata at the STUDY level, not + # consent group level (which is usually how we organize + # datasets in Gen3) + if standardized_phsid in standardized_phsids_data: + data = standardized_phsids_data[standardized_phsid] + else: + # error should be logged by `get_dbgap_fhir_objects_for_studies` + # so just skip here + if not standardized_phsid in all_data: + continue + + data = self.get_simplified_data_from_object( + all_data[standardized_phsid] + ) + + # custom fields + data["ResearchStudyURL"] = ( + self.api.rstrip("/") + "/ResearchStudy/" + standardized_phsid + ) + data["Disclaimer"] = self.disclaimer + + logging.debug(f"simplified {phsid} study data: {data}") + standardized_phsids_data[standardized_phsid] = data + simplified_data[phsid] = data + + return simplified_data + + def get_dbgap_fhir_objects_for_studies(self, ids): + """ + Return FHIR Objects + + Args: + ids (List[str]): list of IDs to query FHIR for + + Returns: + Dict[fhirclient.models.ResearchStudy]: FHIR objects for each of the + provided IDs (which are the keys in the returned dict) + """ + all_data = {} + for study_id in ids: + try: + study = self._get_dbgap_fhir_objects_for_study(study_id) + except Exception as exc: + logging.error(f"unable to get {study_id}, skipping. Error: {exc}") + continue + + # dbGaP API rate limits if we go too fast + # with "429 Client Error: Too Many Requests for url" + if dbgapFHIR.DBGAP_SLEEP_TIME_TO_AVOID_RATE_LIMITS > 0: + logging.debug( + f"sleeping for {dbgapFHIR.DBGAP_SLEEP_TIME_TO_AVOID_RATE_LIMITS} seconds so we don't make dbGaP's API mad." + ) + time.sleep(dbgapFHIR.DBGAP_SLEEP_TIME_TO_AVOID_RATE_LIMITS) + + logging.debug(f"raw study data: {study.as_json()}") + all_data[study_id] = study + + return all_data + + @backoff.on_exception( + backoff.expo, + Exception, + max_tries=7, + **{ + key: value + for key, value in DEFAULT_BACKOFF_SETTINGS.items() + if key != "max_tries" + }, + ) + def _get_dbgap_fhir_objects_for_study(self, phsid): + logging.info(f"Getting {phsid} from dbGaP FHIR API...") + study = None + + try: + study = researchstudy.ResearchStudy.read(phsid, self.fhir_client.server) + except Exception as exc: + logging.warning(f"Unable to get {phsid}, skipping. Error: {exc}") + raise + + return study + + @staticmethod + def write_data_to_file(all_data, file_name): + """ + Write the values of every key in the provided dictionary to a tabular file (TSV). + + This will convert any top level fields that are Dicts to a JSON representation + such that a single all_data[key] becomes a single row in the outputed TSV. + + Args: + all_data (Dict[Dict]): study metadata + file_name (str): output file name + """ + logging.info(f"Beginning to write data to file: {file_name}") + data_file = open(file_name, "w") + + headers = set() + + for study_id, study_data in all_data.items(): + for item in study_data.keys(): + headers.add(item) + + csv_writer = csv.DictWriter( + data_file, + **{ + **BASE_CSV_PARSER_SETTINGS, + "fieldnames": sorted(headers), + "extrasaction": "ignore", + }, + ) + csv_writer.writeheader() + + for study_id, study_data in all_data.items(): + # Writing data of CSV file + csv_writer.writerow(sanitize_tsv_row(study_data)) + + logging.info(f"Done writing data to file: {file_name}") + + def get_simplified_data_from_object(self, fhir_object): + """ + An attempt at simplifying the representation of dbGaP's FHIR data to something + more easily readable and more flat. + + Args: + fhir_object (fhirclient.models.*): Any FHIR object + + Returns: + dict: dictionary of all simplified data + + Raises: + Exception: If an extension has more than 1 value attributes. + """ + all_data = {} + + # special handling for FHIR "extensions", which are terms in the response + # that are not part of the standard FHIR model (in other words, they are + # custom fields that dbGaP has added) + for extension in getattr(fhir_object, "extension", None) or []: + for potential_value_type in dir(extension): + if potential_value_type == "extension" and extension.extension: + ext_name = extension.url.split("/")[-1].split("-")[-1] + if not all_data.get(ext_name): + all_data[ext_name] = [] + + all_data[ext_name].append( + self.get_simplified_data_from_object(extension) + ) + + for potential_value_type in dir(extension): + found_value = False + if potential_value_type.startswith("value") and getattr( + extension, potential_value_type, None + ): + if found_value: + raise Exception( + f"Found 2 value attributes for extension: {extension.url}, can only " + f"handle one. First: {all_data[extension.url]} " + f"Second: {potential_value_type}: {getattr(extension, potential_value_type, None)}" + ) + value = getattr(extension, potential_value_type, None) + # it's possible the value is another FHIR class, so try to represent it as json + try: + value = value.as_json() + if value.get("value"): + value = value["value"] + elif value.get("display"): + value = value["display"] + elif value.get("code"): + value = value["code"] + except AttributeError: + # assume we're dealing with a default Python type and continue + pass + + ext_name = extension.url.split("/")[-1].split("-")[-1] + # if it's a Mapping, we weren't able to simplify the value, + # so just leave the existing entry in all_data + if not isinstance(value, collections.abc.Mapping): + if not all_data.get(ext_name): + all_data[ext_name] = [] + + all_data[ext_name].append(value) + + found_value = True + + # use libraries built-in parsing for standard FHIR fields + non_extension_data = fhir_object.as_json() + + # The library attempts to parse extensions, but we already handled + # the dbGaP extension data above, so remove the raw info from the library + # and replace with our parsing + del non_extension_data["extension"] + all_data.update(non_extension_data) + + # simplify and clean up everything + simplified_data = dbgapFHIR._get_simplified_data(fhir_object) + all_data.update(simplified_data) + self._flatten_relevant_fields(all_data) + self._remove_unecessary_fields(all_data) + self._capitalize_top_level_keys(all_data) + + return all_data + + @staticmethod + def _get_simplified_data(fhir_object): + simplified_data = {} + + variables_to_simplify = set( + [ + "category", + "condition", + "keyword", + "focus", + "identifier", + "security", + "sponsor", + "security", + ] + ) + + # per docs, .elementProperties() returns: + # Returns a list of tuples, one tuple for each property that should be + # serialized, as: ("name", "json_name", type, is_list, "of_many", not_optional) + for item in fhir_object.elementProperties(): + variables_to_simplify.add(item[0]) + + for var in variables_to_simplify: + simplified_var = dbgapFHIR._get_simple_text_from_fhir_object( + fhir_object=fhir_object, list_variable=var + ) + if simplified_var: + simplified_data[var] = simplified_var + + return simplified_data + + @staticmethod + def _get_simple_text_from_fhir_object(fhir_object, list_variable): + output = [] + if type(getattr(fhir_object, list_variable, None)) is list: + for item in getattr(fhir_object, list_variable, None) or []: + simple_representation = getattr(item, "display", {}) + simple_representation = simple_representation or getattr( + item, "value", {} + ) + simple_representation = simple_representation or getattr( + item, "text", {} + ) + simple_representation = simple_representation or getattr( + item, "reference", {} + ) + simple_representation = ( + simple_representation + or dbgapFHIR._get_simple_text_from_fhir_object( + getattr(item, "coding", []), "coding" + ) + ) + if simple_representation: + output.append(simple_representation) + # ignore non lists unless it's a FHIR object we know how to parse + elif type(getattr(fhir_object, list_variable, None)) == FHIRReference: + simple_representation = getattr(fhir_object, list_variable, None).display + if simple_representation: + output.append(simple_representation) + elif type(getattr(fhir_object, list_variable, None)) == Meta: + # ignore meta info + pass + elif type(getattr(fhir_object, list_variable, None)) == Identifier: + simple_representation = dbgapFHIR._get_simple_text_from_fhir_object( + getattr(fhir_object, list_variable, None), "identifier" + ) + if simple_representation: + output.append(simple_representation) + # elif ... add any more FHIR objects we can simplify and parse here + else: + logging.debug( + f"could not parse FHIR object `{fhir_object}` to simple text, ignoring" + ) + + return output + + def _flatten_relevant_fields(self, dictionary): + for item in dictionary.get("Content", []): + for item in dictionary["Content"]: + for key, value in item.items(): + if ( + isinstance(value, collections.abc.Iterable) + and not type(value) is str + ): + if len(value) > 1: + logging.warning( + f"Content field {key} contains more than 1 value: {value} " + "(which is unexpected), using 1st item ONLY." + ) + dictionary[key] = str(value[0]) + + try: + del dictionary["Content"] + except KeyError: + pass + + if dictionary.get("StudyConsents", []): + for item in dictionary["StudyConsents"]: + consents = item.get("StudyConsent") + if consents: + dictionary["StudyConsents"] = consents + + if dictionary.get("Citers", []): + citers = [] + for item in dictionary.get("Citers", []): + for citer in item.get("Citer", []): + """ + ex: + + {'Title': ['A novel variational Bayes multiple locus Z-statistic ' + 'for genome-wide association studies with Bayesian ' + 'model averaging'], + 'Url': 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3381972'} + """ + citer_sanitized = { + "Title": citer.get("Title", [""])[0], + "Url": citer.get("Url", [""]), + } + citers.append(citer_sanitized) + dictionary["Citers"] = citers + + for item in self.suspected_single_item_list_fields: + if dictionary.get(item) and len(dictionary.get(item, [])) == 1: + dictionary[item] = dictionary[item][0] + elif dictionary.get(item) and len(dictionary.get(item, [])) > 1: + logging.warning( + f"expected {item} in dict to have single " + f"item list. it has more: {dictionary.get(item)}" + ) + + def _remove_unecessary_fields(self, all_data): + # remove some fields deemed unnecessary or not typically populated + for field in self.unnecessary_fields: + try: + del all_data[field] + except KeyError: + pass + + @staticmethod + def _capitalize_top_level_keys(all_data): + for key, value in copy.deepcopy(all_data).items(): + capitalized_key = key[:1].upper() + key[1:] + all_data[capitalized_key] = all_data[key] + + if key != capitalized_key: + del all_data[key] diff --git a/gen3/external/nih/dbgap_study_registration.py b/gen3/external/nih/dbgap_study_registration.py new file mode 100644 index 000000000..ce447b89a --- /dev/null +++ b/gen3/external/nih/dbgap_study_registration.py @@ -0,0 +1,146 @@ +import requests + +from cdislogging import get_logger +import xmltodict + +from gen3.external import ExternalMetadataSourceInterface +from gen3.external.nih.utils import get_dbgap_accession_as_parts +from gen3.utils import append_query_params + +logging = get_logger("__name__") + + +class dbgapStudyRegistration(ExternalMetadataSourceInterface): + """ + Class for interacting with National Center for + Biotechnology Information (NCBI)'s database of Genotypes and Phenotypes (dbGaP) + Study Registration API. The Study Registration API contains + public information about studies that are registered in dbGaP with things like + who the PI is, what is the funding institution, what child studies are there, + etc. + + Example Usage: + + ``` + from gen3.external.nih.dbgap_study_registration import dbgapStudyRegistration + + + def main(): + studies = [ + "phs000007.v32", + "phs000179.v1.p1.c1", + ] + dbgap_study_registration = dbgapStudyRegistration() + metadata = dbgap_study_registration.get_metadata_for_ids(ids=studies) + print(metadata) + + + if __name__ == "__main__": + main() + ``` + """ + + def __init__( + self, + api="https://dbgap.ncbi.nlm.nih.gov/ss/dbgapssws.cgi", + auth_provider=None, + ): + super(dbgapStudyRegistration, self).__init__(api, auth_provider) + + def get_metadata_for_ids(self, ids): + """ + Return dbGaP Study Registration metadata for each of the provided IDs. + + Args: + ids (List[str]): list of IDs to query for + + Returns: + Dict[dict]: metadata for each of the provided IDs (which + are the keys in the returned dict) + """ + logging.info("Getting dbGaP Study Registration metadata...") + logging.debug("Provided ids for dbGaP Study Registration metadata: {ids}") + + metadata_for_ids = {} + + for phsid in ids: + standardized_phsid_parts = get_dbgap_accession_as_parts(phsid) + + if not standardized_phsid_parts["version_number"]: + logging.warning( + f"ID provided '{phsid}' does not specify a version. This will " + f"still return data without specifying the version. However, " + f"ensure the version returned is appropriate. The default " + f"version when not specified is usually the latest version in dbGaP." + ) + + request_url = append_query_params( + self.api, + request="Study", + phs=standardized_phsid_parts["phsid_number"], + ) + if standardized_phsid_parts["version_number"]: + request_url = append_query_params( + request_url, + v=standardized_phsid_parts["version_number"], + ) + + logging.debug(f"GET: {request_url}") + raw_xml_response = requests.get(request_url) + logging.debug( + f"Got XML response: {raw_xml_response.text}, converting to JSON..." + ) + + # this library has an opinionated way to convert XML to JSON that + # preserves attributes on tags by appending them with '@'. + # The parsing follows this standard: + # https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html + try: + response = xmltodict.parse(raw_xml_response.text) + except Exception as exc: + logging.error( + f"{phsid} has an invalid dbGaP Study Registration metadata " + "response. Cannot continue without it. Skipping..." + ) + continue + + logging.debug(f"Got full JSON: {response}") + + study = response.get("dbgapss", {}).get("Study", []) + if type(study) == list: + if len(study) > 1: + logging.warning( + f"Multiple studies found from {request_url}, using first one ONLY..." + ) + study = study[0] + elif len(study) == 0: + logging.warning(f"No study found from {request_url}. Skipping...") + continue + + logging.debug(f"Got study JSON: {study}") + + metadata_for_ids[study["StudyInfo"]["@accession"]] = study + + return metadata_for_ids + + def get_child_studies_for_ids(self, ids): + """ + Returns the dbGaP child studies, if any, for each of the provided dbGaP study IDs. + + Args: + ids (List[str]): list of IDs to query for + + Returns: + Dict[dict]: list of children IDs for each of the provided IDs (which + are the keys in the returned dict) + """ + parents = self.get_metadata_for_ids(ids) + result = {} + for parent, metadata in parents.items(): + children = metadata["StudyInfo"].get("childAccession", []) + # dbGaP returns a string if there's only one child, so force it into a list here so the dict is consistent + if isinstance(metadata["StudyInfo"].get("childAccession", []), list): + result[parent] = children + else: + result[parent] = [children] + return result diff --git a/gen3/external/nih/utils.py b/gen3/external/nih/utils.py new file mode 100644 index 000000000..e01eb304f --- /dev/null +++ b/gen3/external/nih/utils.py @@ -0,0 +1,80 @@ +import re + +from cdislogging import get_logger + +logging = get_logger("__name__") + +# For more details about this regex, see the function that uses it +DBGAP_ACCESSION_REGEX = ( + "(?Pphs(?P[0-9]+))" + "(.(?Pp(?P[0-9]+))){0,1}" + "(.(?Pv(?P[0-9]+))){0,1}" + "(.(?Pc(?P[0-9]+)+)){0,1}" +) + + +def get_dbgap_accession_as_parts(phsid): + """ + Return a dictionary containing the various parts of the provided + dbGaP Accession (AKA phsid). + + Uses a regex to match an assession number that has information in forms like: + phs000123.c1 + phs000123.v3.p1.c3 + phs000123.c3 + phs000123.v3.p4.c1 + phs000123 + + This separates out each part of the accession with named groups and includes + parts that include only the numbered value (which is needed in some NIH APIs) + + A "picture" is worth a 1000 words: + + Example for `phs000123.c1`: + Named groups + phsid phs000123 + phsid_number 000123 + version None + version_number None + participant_set None + participant_set_number None + consent c1 + consent_number 1 + + Args: + phsid (str): The dbGaP Accession (AKA phsid) + + Returns: + dict[str]: A standardized dictionary (you can always expect these keys) + with the values parsed from the provided dbGaP Accession + Example if provided `phs000123.c1`: { + "phsid": "phs000123", + "phsid_number": "000123", + "version": "", + "version_number": "", + "participant_set": "", + "participant_set_number": "", + "consent": "c1", + "consent_number": "1", + } + + NOTE: the "*_number" fields are still represented as strings. + NOTE2: the regex groups that return None will be represented + as empty strings (for easier upstream str concat-ing) + """ + access_number_matcher = re.compile(DBGAP_ACCESSION_REGEX) + raw_phs_match = access_number_matcher.match(phsid) + phs_match = {} + + if raw_phs_match: + phs_match = raw_phs_match.groupdict() + + standardized_phs_match = {} + for key, value in phs_match.items(): + if value is None: + standardized_phs_match[key] = "" + continue + + standardized_phs_match[key] = value + + return standardized_phs_match diff --git a/gen3/file.py b/gen3/file.py old mode 100755 new mode 100644 index 77289d6b1..751615744 --- a/gen3/file.py +++ b/gen3/file.py @@ -1,9 +1,26 @@ import json import requests +import json +import asyncio +import aiohttp +import aiofiles +import time +from tqdm import tqdm +from types import SimpleNamespace as Namespace +import os +import requests +from pathlib import Path + +from cdislogging import get_logger +from gen3.index import Gen3Index +from gen3.utils import DEFAULT_BACKOFF_SETTINGS, raise_for_status_and_print_error +from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse -class Gen3FileError(Exception): - pass +logging = get_logger("__name__") + + +MAX_RETRIES = 3 class Gen3File: @@ -28,6 +45,7 @@ def __init__(self, endpoint=None, auth_provider=None): # auth_provider legacy interface required endpoint as 1st arg self._auth_provider = auth_provider or endpoint self._endpoint = self._auth_provider.endpoint + self.unsuccessful_downloads = [] def get_presigned_url(self, guid, protocol=None): """Generates a presigned URL for a file. @@ -46,13 +64,13 @@ def get_presigned_url(self, guid, protocol=None): api_url = "{}/user/data/download/{}".format(self._endpoint, guid) if protocol: api_url += "?protocol={}".format(protocol) - output = requests.get(api_url, auth=self._auth_provider).text + resp = requests.get(api_url, auth=self._auth_provider) + raise_for_status_and_print_error(resp) try: - data = json.loads(output) + return resp.json() except: - return output - return data + return resp.text def delete_file(self, guid): """ @@ -84,7 +102,9 @@ def delete_file_locations(self, guid): return output - def upload_file(self, file_name, authz=None, protocol=None, expires_in=None): + def upload_file( + self, file_name, authz=None, protocol=None, expires_in=None, bucket=None + ): """ Get a presigned url for a file to upload @@ -96,6 +116,9 @@ def upload_file(self, file_name, authz=None, protocol=None, expires_in=None): expires_in (int): Amount in seconds that the signed url will expire from datetime.utcnow(). Be sure to use a positive integer. This value will also be treated as <= MAX_PRESIGNED_URL_TTL in the fence configuration. + bucket (str): Bucket to upload to. The bucket must be configured in the Fence instance's + `ALLOWED_DATA_UPLOAD_BUCKETS` setting. If not specified, Fence defaults to the + `DATA_UPLOAD_BUCKET` setting. Returns: Document: json representation for the file upload """ @@ -109,14 +132,130 @@ def upload_file(self, file_name, authz=None, protocol=None, expires_in=None): body["expires_in"] = expires_in if file_name: body["file_name"] = file_name + if bucket: + body["bucket"] = bucket headers = {"Content-Type": "application/json"} - output = requests.post( + resp = requests.post( api_url, auth=self._auth_provider, json=body, headers=headers - ).text + ) + raise_for_status_and_print_error(resp) try: - data = json.loads(output) + data = json.loads(resp.text) except: - return output + return resp.text return data + + def _ensure_dirpath_exists(path: Path) -> Path: + """Utility to create a directory if missing. + Returns the path so that the call can be inlined in another call + Args: + path (Path): path to create + Returns + path of created directory + """ + assert path + out_path: Path = path + + if not out_path.exists(): + out_path.mkdir(parents=True, exist_ok=True) + + return out_path + + def download_single(self, object_id, path): + """ + Download a single file using its GUID. + + Args: + object_id (str): The file's unique ID + path (str): Path to store the downloaded file at + """ + try: + url = self.get_presigned_url(object_id) + except Exception as e: + logging.critical(f"Unable to get a presigned URL for download: {e}") + return False + + response = requests.get(url["url"], stream=True) + if response.status_code != 200: + logging.error(f"Response code: {response.status_code}") + if response.status_code >= 500: + for _ in range(MAX_RETRIES): + logging.info("Retrying now...") + # NOTE could be updated with exponential backoff + time.sleep(1) + response = requests.get(url["url"], stream=True) + if response.status == 200: + break + if response.status != 200: + logging.critical("Response status not 200, try again later") + return False + else: + return False + + response.raise_for_status() + + total_size_in_bytes = int(response.headers.get("content-length")) + total_downloaded = 0 + + index = Gen3Index(self._auth_provider) + record = index.get_record(object_id) + + filename = record["file_name"] + + out_path = Gen3File._ensure_dirpath_exists(Path(path)) + + with open(os.path.join(out_path, filename), "wb") as f: + for data in response.iter_content(4096): + total_downloaded += len(data) + f.write(data) + + if total_size_in_bytes == total_downloaded: + logging.info(f"File {filename} downloaded successfully") + + else: + logging.error(f"File {filename} not downloaded successfully") + return False + + return True + + def upload_file_to_guid( + self, guid, file_name, protocol=None, expires_in=None, bucket=None + ): + """ + Get a presigned url for a file to upload to the specified existing GUID + + Args: + file_name (str): file_name to use for upload + protocol (str): Storage protocol to use for upload: "s3", "az". + If this isn't set, the default will be "s3" + expires_in (int): Amount in seconds that the signed url will expire from datetime.utcnow(). + Be sure to use a positive integer. + This value will also be treated as <= MAX_PRESIGNED_URL_TTL in the fence configuration. + bucket (str): Bucket to upload to. The bucket must be configured in the Fence instance's + `ALLOWED_DATA_UPLOAD_BUCKETS` setting. If not specified, Fence defaults to the + `DATA_UPLOAD_BUCKET` setting. + Returns: + Document: json representation for the file upload + """ + url = f"{self._endpoint}/user/data/upload/{guid}" + params = {} + if protocol: + params["protocol"] = protocol + if expires_in: + params["expires_in"] = expires_in + if file_name: + params["file_name"] = file_name + if bucket: + params["bucket"] = bucket + + url_parts = list(urlparse(url)) + query = dict(parse_qsl(url_parts[4])) + query.update(params) + url_parts[4] = urlencode(query) + url = urlunparse(url_parts) + + resp = requests.get(url, auth=self._auth_provider) + raise_for_status_and_print_error(resp) + return resp.json() diff --git a/gen3/index.py b/gen3/index.py index 29d7ccbfe..cdafa6355 100755 --- a/gen3/index.py +++ b/gen3/index.py @@ -473,30 +473,39 @@ async def async_create_record( urls = [] json = { - "urls": urls, "form": "object", "hashes": hashes, "size": size, - "file_name": file_name, - "metadata": metadata, - "urls_metadata": urls_metadata, - "baseid": baseid, - "acl": acl, - "authz": authz, - "version": version, + "urls": urls or [], } - if did: json["did"] = did + if file_name: + json["file_name"] = file_name + if metadata: + json["metadata"] = metadata + if baseid: + json["baseid"] = baseid + if acl: + json["acl"] = acl + if urls_metadata: + json["urls_metadata"] = urls_metadata + if version: + json["version"] = version + if authz: + json["authz"] = authz + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self.client.auth._get_auth_value()} async with session.post( f"{self.client.url}/index/", json=json, - headers={"content-type": "application/json"}, + headers=headers, ssl=_ssl, - auth=self.client.auth, ) as response: - raise_for_status_and_print_error(response) + assert response.status == 200, await response.json() response = await response.json() return response @@ -715,6 +724,8 @@ async def async_update_record( acl=None, authz=None, urls_metadata=None, + _ssl=None, + **kwargs, ): """ Asynchronous function to update a record in indexd. @@ -736,21 +747,38 @@ async def async_update_record( "authz": authz, "urls_metadata": urls_metadata, } - record = await async_get_record(guid) + record = await self.async_get_record(guid) revision = record.get("rev") for key, value in updatable_attrs.items(): if value is not None: record[key] = value + del record["created_date"] + del record["rev"] + del record["updated_date"] + del record["version"] + del record["uploader"] + del record["form"] + del record["urls_metadata"] + del record["baseid"] + del record["size"] + del record["hashes"] + del record["did"] + + logging.info(f"PUT-ing record: {record}") + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self.client.auth._get_auth_value()} + async with session.put( - f"{self.client.url}/index/{guid}/rev={revision}", + f"{self.client.url}/index/{guid}?rev={revision}", json=record, - headers={"content-type": "application/json"}, + headers=headers, ssl=_ssl, - auth=self.client.auth, ) as response: - raise_for_status_and_print_error(response) + assert response.status == 200, await response.json() response = await response.json() return response diff --git a/gen3/metadata.py b/gen3/metadata.py index 01b835203..32c11c73e 100644 --- a/gen3/metadata.py +++ b/gen3/metadata.py @@ -322,8 +322,8 @@ def batch_create(self, metadata_list, overwrite=True, **kwargs): return response.json() - @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) - def create(self, guid, metadata, overwrite=False, **kwargs): + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def create(self, guid, metadata, aliases=None, overwrite=False, **kwargs): """ Create the metadata associated with the guid @@ -333,6 +333,8 @@ def create(self, guid, metadata, overwrite=False, **kwargs): attached to the provided GUID as metadata overwrite (bool, optional): whether or not to overwrite existing data """ + aliases = aliases or [] + url = self.admin_endpoint + f"/metadata/{guid}" url_with_params = append_query_params(url, overwrite=overwrite, **kwargs) @@ -343,9 +345,20 @@ def create(self, guid, metadata, overwrite=False, **kwargs): ) response.raise_for_status() + if aliases: + try: + self.create_aliases(guid=guid, aliases=aliases, merge=overwrite) + except Exception: + logging.error( + "Error while attempting to create aliases: " + f"'{aliases}' to GUID: '{guid}' with merge={overwrite}. " + "GUID metadata record was created successfully and " + "will NOT be deleted." + ) + return response.json() - @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) async def async_create( self, guid, @@ -366,7 +379,7 @@ async def async_create( _ssl (None, optional): whether or not to use ssl """ aliases = aliases or [] - # todo handle aliases + async with aiohttp.ClientSession() as session: url = self.admin_endpoint + f"/metadata/{guid}" url_with_params = append_query_params(url, overwrite=overwrite, **kwargs) @@ -383,10 +396,24 @@ async def async_create( response.raise_for_status() response = await response.json() + if aliases: + logging.info(f"creating aliases: {aliases}") + try: + await self.async_create_aliases( + guid=guid, aliases=aliases, _ssl=_ssl + ) + except Exception: + logging.error( + "Error while attempting to create aliases: " + f"'{aliases}' to GUID: '{guid}'. " + "GUID metadata record was created successfully and " + "will NOT be deleted." + ) + return response @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) - def update(self, guid, metadata, **kwargs): + def update(self, guid, metadata, aliases=None, merge=False, **kwargs): """ Update the metadata associated with the guid @@ -395,6 +422,8 @@ def update(self, guid, metadata, **kwargs): metadata (Dict): dictionary representing what will end up a JSON blob attached to the provided GUID as metadata """ + aliases = aliases or [] + url = self.admin_endpoint + f"/metadata/{guid}" url_with_params = append_query_params(url, **kwargs) @@ -405,6 +434,17 @@ def update(self, guid, metadata, **kwargs): ) response.raise_for_status() + if aliases: + try: + self.update_aliases(guid=guid, aliases=aliases, merge=merge) + except Exception: + logging.error( + "Error while attempting to update aliases: " + f"'{aliases}' to GUID: '{guid}'. " + "GUID metadata record was created successfully and " + "will NOT be deleted." + ) + return response.json() @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) @@ -418,14 +458,17 @@ async def async_update( guid (str): guid to use metadata (Dict): dictionary representing what will end up a JSON blob attached to the provided GUID as metadata + aliases (list[str], optional): List of aliases to update the GUID with + merge (bool, optional): Whether or not to merge metadata AND aliases + with existing values _ssl (None, optional): whether or not to use ssl + **kwargs: Description """ - # TODO handle aliases + aliases = aliases or [] + async with aiohttp.ClientSession() as session: url = self.admin_endpoint + f"/metadata/{guid}" - if merge: - url += "?merge=True" - url_with_params = append_query_params(url, **kwargs) + url_with_params = append_query_params(url, merge=merge, **kwargs) # aiohttp only allows basic auth with their built in auth, so we # need to manually add JWT auth header @@ -437,6 +480,19 @@ async def async_update( response.raise_for_status() response = await response.json() + if aliases: + try: + await self.async_update_aliases( + guid=guid, aliases=aliases, merge=merge, _ssl=_ssl + ) + except Exception: + logging.error( + "Error while attempting to update aliases: " + f"'{aliases}' to GUID: '{guid}' with merge={merge}. " + "GUID metadata record was created successfully and " + "will NOT be deleted." + ) + return response @backoff.on_exception(backoff.expo, Exception, **DEFAULT_BACKOFF_SETTINGS) @@ -456,6 +512,331 @@ def delete(self, guid, **kwargs): return response.json() + # + # Alias Support + # + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def get_aliases(self, guid, **kwargs): + """ + Get Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to get aliases + """ + url = self.endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.get(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_get_aliases(self, guid, _ssl=None, **kwargs): + """ + Asyncronously get Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to get aliases + """ + async with aiohttp.ClientSession() as session: + url = self.endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.get( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_alias(self, guid, alias, **kwargs): + """ + Delete single Alias for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_alias(self, guid, alias, _ssl=None, **kwargs): + """ + Asyncronously delete single Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def create_aliases(self, guid, aliases, **kwargs): + """ + Create Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + **kwargs: additional query params + + Returns: + requests.Response: response from the request to create aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + response = requests.post(url_with_params, json=data, auth=self._auth_provider) + response.raise_for_status() + + return response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_create_aliases(self, guid, aliases, _ssl=None, **kwargs): + """ + Asyncronously create Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to create aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + async with session.post( + url_with_params, json=data, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + return await response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def update_aliases(self, guid, aliases, merge=False, **kwargs): + """ + Update Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + merge (bool, optional): Whether or not to aliases with existing values + **kwargs: additional query params + + Returns: + requests.Response: response from the request to update aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, merge=merge, **kwargs) + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + response = requests.put(url_with_params, json=data, auth=self._auth_provider) + response.raise_for_status() + + return response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_update_aliases( + self, guid, aliases, merge=False, _ssl=None, **kwargs + ): + """ + Asyncronously update Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + aliases (list[str]): Aliases to set for the guid + merge (bool, optional): Whether or not to aliases with existing values + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to update aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, merge=merge, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + data = {"aliases": aliases} + + logging.debug(f"hitting: {url_with_params}") + logging.debug(f"data: {data}") + async with session.put( + url_with_params, json=data, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.json() + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_aliases(self, guid, **kwargs): + """ + Delete all Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.text + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_aliases(self, guid, _ssl=None, **kwargs): + """ + Asyncronously delete all Aliases for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.text + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + def delete_alias(self, guid, alias, **kwargs): + """ + Delete single Alias for the given guid + + Args: + guid (TYPE): Globally unique ID for the metadata blob + alias (str): alternative identifier (alias) to delete + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + logging.debug(f"hitting: {url_with_params}") + response = requests.delete(url_with_params, auth=self._auth_provider) + response.raise_for_status() + + return response.text + + @backoff.on_exception(backoff.expo, Exception, **BACKOFF_NO_LOG_IF_NOT_RETRIED) + async def async_delete_alias(self, guid, alias, _ssl=None, **kwargs): + """ + Asyncronously delete single Aliases for the given guid + + Args: + guid (str): Globally unique ID for the metadata blob + alias (str): alternative identifier (alias) to delete + _ssl (None, optional): whether or not to use ssl + **kwargs: additional query params + + Returns: + requests.Response: response from the request to delete aliases + """ + async with aiohttp.ClientSession() as session: + url = self.admin_endpoint + f"/metadata/{guid}/aliases/{alias}" + url_with_params = append_query_params(url, **kwargs) + + # aiohttp only allows basic auth with their built in auth, so we + # need to manually add JWT auth header + headers = {"Authorization": self._auth_provider._get_auth_value()} + + logging.debug(f"hitting: {url_with_params}") + async with session.delete( + url_with_params, headers=headers, ssl=_ssl + ) as response: + response.raise_for_status() + + return await response.text + def _prepare_metadata( self, metadata, indexd_doc, force_metadata_columns_even_if_empty ): diff --git a/gen3/submission.py b/gen3/submission.py index 123b6aac6..0f898682f 100755 --- a/gen3/submission.py +++ b/gen3/submission.py @@ -567,7 +567,6 @@ def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): # Start the chunking loop: while (start + len(chunk)) <= len(df): - timeout = False valid_but_failed = [] invalid = [] @@ -599,7 +598,6 @@ def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): or "Connection aborted." in response or "service failure - try again later" in response ): # time-out, response is not valid JSON at the moment - print("\t Reducing Chunk Size: {}".format(response)) results["responses"].append("Reducing Chunk Size: {}".format(response)) timeout = True @@ -631,7 +629,6 @@ def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): ) elif json_res["code"] == 200: # success - entities = json_res.get("entities", []) print("\t Succeeded: {} entities.".format(len(entities))) results["responses"].append( @@ -643,14 +640,12 @@ def submit_file(self, project_id, filename, chunk_size=30, row_offset=0): results["succeeded"].append(sid) elif json_res["code"] == 500: # internal server error - print("\t Internal Server Error: {}".format(response)) results["responses"].append( "Internal Server Error: {}".format(response) ) else: # failure (400, 401, 403, 404...) - entities = json_res.get("entities", []) print( "\tChunk Failed (status code {}): {} entities.".format( diff --git a/gen3/tools/diff.py b/gen3/tools/diff.py index 05a364af6..766f1aad9 100644 --- a/gen3/tools/diff.py +++ b/gen3/tools/diff.py @@ -53,28 +53,22 @@ def manifest_diff( files.sort() - try: - content = _precheck_manifests( - allow_additional_columns=allow_additional_columns, - files=files, - key_column=key_column, - ) + content = _precheck_manifests( + allow_additional_columns=allow_additional_columns, + files=files, + key_column=key_column, + ) - diff_content = _compare_manifest_columns( - allow_additional_columns=allow_additional_columns, - manifest_content=content, - ) + diff_content = _compare_manifest_columns( + allow_additional_columns=allow_additional_columns, + manifest_content=content, + ) - _write_csv( - output_manifest_file_delimiter=output_manifest_file_delimiter, - output_manifest=output_manifest, - diff_content=diff_content, - ) - except Exception as e: - exc_info = sys.exc_info() - traceback.print_exception(*exc_info) - logging.error("Detail {}", e) - return None + _write_csv( + output_manifest_file_delimiter=output_manifest_file_delimiter, + output_manifest=output_manifest, + diff_content=diff_content, + ) def _precheck_manifests( @@ -111,7 +105,7 @@ def _precheck_manifests( logging.info(f"Prechecking manifest files: {files}") if not len(files) == 2: - raise Exception("Must take difference of two files") + raise Exception("Must take difference of two files, check dir for hidden files") tsv_files = [file_name for file_name in files if ".tsv" in file_name.lower()] csv_files = [file_name for file_name in files if ".csv" in file_name.lower()] @@ -120,7 +114,7 @@ def _precheck_manifests( elif len(csv_files) == len(files): file_delimiter = "," else: - raise Exception("Not all files have the same extension type") + raise ValueError("Not all files have the same extension type") headers = [] manifest_content = [] @@ -140,6 +134,9 @@ def _precheck_manifests( content = {} for row in csv_reader: + for column in row: + if column == "acl": + row[column] = str(sorted(eval(row[column]))) content[row[key_column]] = row manifest_content.append(content) diff --git a/gen3/tools/download/__init__.py b/gen3/tools/download/__init__.py index 8b1378917..e69de29bb 100644 --- a/gen3/tools/download/__init__.py +++ b/gen3/tools/download/__init__.py @@ -1 +0,0 @@ - diff --git a/gen3/tools/download/drs_download.py b/gen3/tools/download/drs_download.py index 761aff1c3..e22752395 100644 --- a/gen3/tools/download/drs_download.py +++ b/gen3/tools/download/drs_download.py @@ -47,7 +47,7 @@ # package formats we handle for unpacking PACKAGE_EXTENSIONS = [".zip"] -logger = get_logger("drs-pull", log_level="warning") +logger = get_logger("__name__") @dataclass_json(letter_case=LetterCase.SNAKE) @@ -613,7 +613,6 @@ def parse_drs_identifier(drs_candidate: str) -> Tuple[str, str, str]: matches = re.findall(drs_regex, drs_candidate, re.UNICODE) if len(matches) == 1: # this could be a hostname DRS id - hostname_regex = ( r"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*" r"([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" @@ -734,7 +733,7 @@ def get_download_url_using_drs( logger.critical(f"Was unable to download: {object_id}. Timeout Error.") except requests.exceptions.HTTPError as exc: logger.critical( - f"HTTP Error ({exc.response.status_code}): requesting download url from {access_method}" + f"HTTP Error ({exc.response.status_code}) when requesting download url from {access_method}" ) return None @@ -1050,8 +1049,14 @@ def download( if delete_unpacked_packages: filepath.unlink() - - completed[entry.object_id].status = "downloaded" if res else "error" + if res: + completed[entry.object_id].status = "downloaded" + logger.debug( + f"object {entry.object_id} has been successfully downloaded." + ) + else: + completed[entry.object_id].status = "error" + logger.debug(f"object {entry.object_id} has failed to be downloaded.") completed[entry.object_id].end_time = datetime.now(timezone.utc) return completed @@ -1133,7 +1138,7 @@ def _download( def _download_obj( hostname, auth, - object_id, + object_ids, output_dir=".", show_progress=False, unpack_packages=True, @@ -1144,7 +1149,7 @@ def _download_obj( Args: hostname (str): hostname of Gen3 commons to use for access and WTS auth: Gen3 Auth instance - object_id (str): DRS object id + object_ids (List[str]): DRS object id output_dir: directory to save downloaded files to show_progress: show progress bar unpack_packages (bool): set to False to disable the unpacking of downloaded packages @@ -1159,7 +1164,7 @@ def _download_obj( logger.critical(f"Unable to authenticate your credentials with {hostname}") return None - object_list = [Downloadable(object_id=object_id)] + object_list = [Downloadable(object_id=object_id) for object_id in object_ids] downloader = DownloadManager( hostname=hostname, auth=auth, @@ -1343,10 +1348,10 @@ def download_files_in_drs_manifest( ) -def download_drs_object( +def download_drs_objects( hostname, auth, - object_id, + object_ids, output_dir, show_progress=True, unpack_packages=True, @@ -1357,7 +1362,7 @@ def download_drs_object( Args: hostname (str): hostname of Gen3 commons to use for access and WTS auth: Gen3 Auth instance - object_id (str): DRS object id + object_ids (List[str]): DRS object ids output_dir: directory to save downloaded files to unpack_packages (bool): set to False to disable the unpacking of downloaded packages delete_unpacked_packages (bool): set to True to delete package files after unpacking them @@ -1365,10 +1370,10 @@ def download_drs_object( Returns: List of DownloadStatus objects for the DRS object """ - _download_obj( + return _download_obj( hostname, auth, - object_id, + object_ids, output_dir, show_progress, unpack_packages, diff --git a/gen3/tools/expansion.py b/gen3/tools/expansion.py new file mode 100644 index 000000000..301a3f7b4 --- /dev/null +++ b/gen3/tools/expansion.py @@ -0,0 +1,301 @@ +import requests, json, fnmatch, os, os.path, sys, subprocess, glob, ntpath, copy, re, operator, csv +from os import path +import gen3 +from gen3.auth import Gen3Auth +from gen3.submission import Gen3Submission +from gen3.file import Gen3File + +from pandas import json_normalize +import pandas as pd + + +class Gen3Error(Exception): + pass + + +class Gen3Expansion: + """Advanced scripts for interacting with the Gen3 submission, query and index APIs + Args: + endpoint (str): The URL of the data commons. + auth_provider (Gen3Auth): A Gen3Auth class instance. + + Examples: + This generates the Gen3Expansion class pointed at the sandbox commons while + using the credentials.json downloaded from the commons profile page. + + >>> endpoint = "https://nci-crdc-demo.datacommons.io" + ... auth = Gen3Auth(endpoint, refresh_file="credentials.json") + ... exp = Gen3Expansion(endpoint, auth) + + """ + + def __init__(self, endpoint, auth_provider): + self._auth_provider = auth_provider + self._endpoint = endpoint + self.sub = Gen3Submission(endpoint, auth_provider) + + # Functions for downloading metadata in TSVs + + def get_project_ids(self, node=None, name=None): + """Get a list of project_ids you have access to in a data commons. + + Args: + node(str): The node you want projects to have at least one record in. + name(str): The name of the programs to get projects in, or the submitter_id of a particular record. + + Example: + get_project_ids() + get_project_ids(node='demographic') + get_project_ids(node='program',name='training') + get_project_ids(node='case',name='case-01') + """ + project_ids = [] + queries = [] + # Return all project_ids in the data commons if no node is provided or if node is program but no name provided + if name is None and ((node is None) or (node is "program")): + print("Getting all project_ids you have access to in the data commons.") + if node == "program": + print( + """Specify a list of program names (name = ['myprogram1','myprogram2']) to get only project_ids in particular programs.""" + ) + queries.append("""{project (first:0){project_id}}""") + elif name is not None and node == "program": + if isinstance(name, list): + print( + """"Getting all project_ids in the programs '%s'""" + % (",".join(name)) + ) + for program_name in name: + queries.append( + """{project (first:0, with_path_to:{type:"program",name:"%s"}){project_id}}""" + % (program_name) + ) + elif isinstance(name, str): + print("Getting all project_ids in the program '" + name + "'") + queries.append( + """{project (first:0, with_path_to:{type:"program",name:"%s"}){project_id}}""" + % (name) + ) + elif isinstance(node, str) and isinstance(name, str): + print( + """Getting all project_ids for projects with a path to record '%s' in node '%s'""" + % (node, name) + ) + queries.append( + """{project (first:0, with_path_to:{type:"%s",submitter_id:"%s"}){project_id}}""" + % (node, name) + ) + elif isinstance(node, str) and name is None: + print( + """Getting all project_ids for projects with at least one record in the node '%s'""" + % (node) + ) + query = """{node (first:0,of_type:"%s"){project_id}}""" % (node) + # Need separate logic because we are looking at res["data"]["node"] + res = self.sub.query(query) + new_project_ids = list(set([x["project_id"] for x in res["data"]["node"]])) + project_ids = project_ids + new_project_ids + + if len(queries) > 0: + for query in queries: + res = self.sub.query(query) + new_project_ids = list( + set([x["project_id"] for x in res["data"]["project"]]) + ) + project_ids = project_ids + new_project_ids + my_ids = sorted(project_ids, key=str.lower) + print(my_ids) + return my_ids + + def get_node_tsvs( + self, + node, + projects=None, + overwrite=False, + remove_empty=True, + outdir="node_tsvs", + ): + """Gets a TSV of the structured data from particular node for each project specified. + Also creates a master TSV of merged data from each project for the specified node. + Returns a DataFrame containing the merged data for the specified node. + + Args: + node (str): The name of the node to download structured data from. + projects (list): The projects to download the node from. If "None", downloads data from each project user has access to. + + Example: + >>> df = get_node_tsvs('demographic') + + """ + + if not os.path.exists(outdir): + os.makedirs(outdir) + mydir = "{}/{}_tsvs".format(outdir, node) + if not os.path.exists(mydir): + os.makedirs(mydir) + + if projects is None: # if no projects specified, get node for all projects + projects = sorted( + list( + set( + x["project_id"] + for x in self.sub.query("""{project (first:0){project_id}}""")[ + "data" + ]["project"] + ) + ) + ) + elif isinstance(projects, str): + projects = [projects] + + header = "" + output = "" + data_count = 0 + + for project in projects: + filename = str(mydir + "/" + project + "_" + node + ".tsv") + if (os.path.isfile(filename)) and (overwrite is False): + print("File previously downloaded.") + else: + prog, proj = project.split("-", 1) + self.sub.export_node(prog, proj, node, "tsv", filename) + + with open(filename) as tsv_file: + count = 0 + lines = tsv_file.readlines() + # if file contains actual data and not just header row + if len(lines) > 1: + for line in lines: + count += 1 + # If header is empty and we are at the first line, set the header + if len(header) == 0 and count == 1: + header = line + elif count > 1: + output = output + line + count -= 1 + data_count += count + print(filename + " has " + str(count) + " records.") + + if remove_empty is True: + if count == 0: + print("Removing empty file: " + filename) + cmd = ["rm", filename] # look in the download directory + try: + output = subprocess.check_output( + cmd, stderr=subprocess.STDOUT + ).decode("UTF-8") + except Exception as e: + output = e.output.decode("UTF-8") + print("ERROR deleting file: " + output) + print("length of all data: " + str(data_count)) + nodefile = str("master_" + node + ".tsv") + # Append header to the beginning of TSV + output = header + output + with open(nodefile, "w+") as master_tsv: + master_tsv.write(output) + print( + "Master node TSV with " + + str(data_count) + + " total records written to " + + nodefile + + "." + ) + return output + + def get_project_tsvs( + self, + projects=None, + nodes=None, + outdir="project_tsvs", + overwrite=False, + save_empty=False, + remove_nodes=["program", "project", "root", "data_release"], + ): + """Function gets a TSV for every node in a specified project. + Exports TSV files into a directory "project_tsvs/". + Function returns a list of the contents of the directory. + Args: + projects (str/list): The project_id(s) of the project(s) to download. Can be a single project_id or a list of project_ids. + nodes(str/list): The nodes to download from each project. If None, will try to download all nodes in the data model. + overwrite (boolean): If False, the TSV file is not downloaded if there is an existing file with the same name. + save_empty(boolean): If True, TSVs with no records, i.e., downloads an empty TSV template, will be downloaded. + remove_nodes(list): A list of nodes in the data model that should not be downloaded per project. + Example: + >>> get_project_tsvs(projects = ['internal-test']) + + """ + if nodes is None: + # get all the 'node_id's in the data model + nodes = sorted( + list( + set( + x["id"] + for x in self.sub.query("""{_node_type (first:-1) {id}}""")[ + "data" + ]["_node_type"] + ) + ) + ) + elif isinstance(nodes, str): + nodes = [nodes] + + for node in remove_nodes: + if node in nodes: + nodes.remove(node) + + if projects is None: # if no projects specified, get node for all projects + projects = sorted( + list( + set( + x["project_id"] + for x in self.sub.query("""{project (first:0){project_id}}""")[ + "data" + ]["project"] + ) + ) + ) + elif isinstance(projects, str): + projects = [projects] + + for project_id in projects: + mydir = "{}/{}_tsvs".format( + outdir, project_id + ) # create the directory to store TSVs + + if not os.path.exists(mydir): + os.makedirs(mydir) + + for node in nodes: + filename = str(mydir + "/" + project_id + "_" + node + ".tsv") + if (os.path.isfile(filename)) and (overwrite is False): + print("\tPreviously downloaded: '{}'".format(filename)) + else: + query_txt = """{_%s_count (project_id:"%s")}""" % (node, project_id) + res = self.sub.query( + query_txt + ) # {'data': {'_acknowledgement_count': 0}} + count = res["data"][str("_" + node + "_count")] # count=int(0) + if count > 0 or save_empty is True: + print( + "\nDownloading {} records in node '{}' of project '{}'.".format( + count, node, project_id + ) + ) + prog, proj = project_id.split("-", 1) + self.sub.export_node(prog, proj, node, "tsv", filename) + else: + print( + "\t{} records in node '{}' of project '{}'.".format( + count, node, project_id + ) + ) + + cmd = ["ls", mydir] # look in the download directory + try: + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode( + "UTF-8" + ) + except Exception as e: + output = "ERROR:" + e.output.decode("UTF-8") + + return output diff --git a/gen3/tools/indexing/__init__.py b/gen3/tools/indexing/__init__.py index 8b9c57cc4..a573f95ac 100644 --- a/gen3/tools/indexing/__init__.py +++ b/gen3/tools/indexing/__init__.py @@ -1,3 +1,4 @@ from gen3.tools.indexing.download_manifest import async_download_object_manifest from gen3.tools.indexing.verify_manifest import async_verify_object_manifest from gen3.tools.indexing.validate_manifest_format import is_valid_manifest_format +from gen3.tools.indexing.index_manifest import index_object_manifest diff --git a/gen3/tools/indexing/download_manifest.py b/gen3/tools/indexing/download_manifest.py index 1276717fb..98a84e348 100644 --- a/gen3/tools/indexing/download_manifest.py +++ b/gen3/tools/indexing/download_manifest.py @@ -64,6 +64,7 @@ async def async_download_object_manifest( num_processes=4, max_concurrent_requests=MAX_CONCURRENT_REQUESTS, input_manifest=None, + python_subprocess_command="python", ): """ Download all file object records into a manifest csv @@ -79,6 +80,10 @@ async def async_download_object_manifest( input_manifest (str): Input file. Read available object data from objects in this file instead of reading everything in indexd. This will attempt to query indexd for only the records identified in this manifest. + python_subprocess_command (str, optional): Command used to execute a + python process. By default you should not need to change this, but + if you are running something like MacOS and only installed Python 3.x + you may need to specify "python3". """ start_time = time.perf_counter() logging.info(f"start time: {start_time}") @@ -108,6 +113,7 @@ async def async_download_object_manifest( num_processes, max_concurrent_requests, input_manifest, + python_subprocess_command, ) end_time = time.perf_counter() @@ -116,7 +122,12 @@ async def async_download_object_manifest( async def _write_all_index_records_to_file( - commons_url, output_filename, num_processes, max_concurrent_requests, input_manifest + commons_url, + output_filename, + num_processes, + max_concurrent_requests, + input_manifest, + python_subprocess_command, ): """ Spins up number of processes provided to parse indexd records and eventually @@ -189,7 +200,6 @@ async def _write_all_index_records_to_file( input_record_chunks = ( "|||".join(map(json.dumps, record_chunks[x])) if record_chunks else "|||" ) - print(input_record_chunks) # write record_checksum chunks to temporary files since the size can overload # command line arguments @@ -202,7 +212,7 @@ async def _write_all_index_records_to_file( # call the cli function below and pass in chunks of pages for each process command = ( - f"python {CURRENT_DIR}/download_manifest.py --commons_url " + f"{python_subprocess_command} {CURRENT_DIR}/download_manifest.py --commons_url " f"{commons_url} --pages {pages} --input-record-chunks-file {input_records_chunk_filename} " f"--num_processes {num_processes} --max_concurrent_requests {max_concurrent_requests}" ) diff --git a/gen3/tools/merge.py b/gen3/tools/merge.py index c2375961c..7699feca6 100644 --- a/gen3/tools/merge.py +++ b/gen3/tools/merge.py @@ -9,6 +9,8 @@ from datetime import datetime from cdislogging import get_logger +from gen3.utils import get_delimiter_from_extension + logging = get_logger("__name__") @@ -72,7 +74,7 @@ def get_guids_for_manifest_row_partial_match( # the key from the row to use for the partial match against the keys in # data_from_indexing_manifest row_key = config.get("row_column_name") - key_from_row = row.get(row_key).strip() + key_from_row = row.get(row_key, "").strip() matching_guids = [] matching_keys = [] @@ -128,8 +130,6 @@ def _get_data_from_indexing_manifest( if include_all_indexing_cols_in_output: value_column_names = value_column_names + csvReader.fieldnames - print(f"getting indexing columns: {value_column_names}") - for row in csvReader: key = str(row[key_column_name]).strip() column_to_matching_rows.setdefault(key, []).append( @@ -164,15 +164,15 @@ def merge_guids_into_metadata( include_all_indexing_cols_in_output=True, ): start_time = time.perf_counter() - logging.info(f"start time: {start_time}") + logging.debug(f"start time: {start_time}") # if delimiter not specified, try to get based on file ext if not indexing_manifest_file_delimiter: - indexing_manifest_file_delimiter = _get_delimiter_from_extension( + indexing_manifest_file_delimiter = get_delimiter_from_extension( indexing_manifest ) if not metadata_manifest_file_delimiter: - metadata_manifest_file_delimiter = _get_delimiter_from_extension( + metadata_manifest_file_delimiter = get_delimiter_from_extension( metadata_manifest ) @@ -230,7 +230,10 @@ def merge_guids_into_metadata( rows_to_add = data_from_indexing_manifest.get(key_id_from_row, {}) for new_row in rows_to_add: - new_row.update(row) + for key, value in row.items(): + # only replace if there's content + if value: + new_row.update({key: value}) append_row_to_file( filename=output_filename, row=new_row, @@ -255,7 +258,10 @@ def merge_guids_into_metadata( key_id_from_row = row.get(row_key, "").strip() for new_row in data_from_indexing_manifest.get(key_id_from_row, {}): if new_row.get("guid") == guid: - new_row.update(row) + for key, value in row.items(): + # only replace if there's content + if value: + new_row.update({key: value}) append_row_to_file( filename=output_filename, row=new_row, @@ -271,20 +277,10 @@ def merge_guids_into_metadata( ) end_time = time.perf_counter() - logging.info(f"end time: {end_time}") - logging.info(f"run time: {end_time-start_time}") - - logging.info(f"output file:\n{os.path.abspath(output_filename)}") - + logging.debug(f"end time: {end_time}") + logging.debug(f"run time: {end_time-start_time}") -def _get_delimiter_from_extension(filename): - file_ext = os.path.splitext(filename) - if file_ext[-1].lower() == ".tsv": - file_delimiter = "\t" - else: - # default, assume CSV - file_delimiter = "," - return file_delimiter + logging.debug(f"output file:\n{os.path.abspath(output_filename)}") def write_header_to_file(filename, fieldnames, delimiter="\t"): diff --git a/gen3/tools/metadata/discovery.py b/gen3/tools/metadata/discovery.py index 951a8b9c0..8fcc4bfc5 100644 --- a/gen3/tools/metadata/discovery.py +++ b/gen3/tools/metadata/discovery.py @@ -1,6 +1,6 @@ import csv +import copy import json -import datetime from cdislogging import get_logger import tempfile import asyncio @@ -10,8 +10,16 @@ import requests.exceptions from gen3.metadata import Gen3Metadata -from gen3.tools import metadata -from gen3.utils import raise_for_status_and_print_error + +from gen3.tools.merge import ( + merge_guids_into_metadata, + manifest_row_parsers, + manifests_mapping_config, + get_guids_for_manifest_row_partial_match, + get_delimiter_from_extension, +) + +from gen3.utils import make_folders_for_filename MAX_GUIDS_PER_REQUEST = 2000 MAX_CONCURRENT_REQUESTS = 5 @@ -21,16 +29,39 @@ "quoting": csv.QUOTE_NONE, "escapechar": "\\", } +CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) logging = get_logger("__name__") async def output_expanded_discovery_metadata( - auth, endpoint=None, limit=500, use_agg_mds=False + auth, + endpoint=None, + limit=500, + use_agg_mds=False, + guid_type="discovery_metadata", + output_format="tsv", + output_filename_suffix="", ): """ - fetch discovery metadata from a commons and output to {commons}-discovery-metadata.tsv + fetch discovery metadata from a commons and output to {commons}-{guid_type}.tsv or {commons}-{guid_type}.json + + Args: + auth (Gen3Auth): a Gen3Auth object + endpoint (str): HOSTNAME of a Gen3 environment, defaults to None + limit (int): max number of records in one operation, defaults to 500 + use_agg_mds (bool): whether to use AggMDS during export, defaults to False + guid_type (str): intended GUID type for query, defaults to discovery_metadata + output_format (str): format of output file (can only be either tsv or json), defaults to tsv + output_filename_suffix (str): additional suffix for the output file name, defaults to "" """ + + if output_format != "tsv" and output_format != "json": + logging.error( + f"Unsupported output file format {output_format}! Only tsv or json is allowed" + ) + raise ValueError(f"Unsupported output file format {output_format}") + if endpoint: mds = Gen3Metadata( auth_provider=auth, @@ -43,86 +74,313 @@ async def output_expanded_discovery_metadata( service_location="mds/aggregate" if use_agg_mds else "mds", ) - count = 0 with tempfile.TemporaryDirectory() as metadata_cache_dir: - all_fields = set() - num_tags = 0 - - for offset in range(0, limit, MAX_GUIDS_PER_REQUEST): - partial_metadata = mds.query( - "_guid_type=discovery_metadata", - return_full_metadata=True, - limit=min(limit, MAX_GUIDS_PER_REQUEST), - offset=offset, - use_agg_mds=use_agg_mds, - ) + partial_metadata, all_fields, num_tags = read_mds_into_cache( + limit, + MAX_GUIDS_PER_REQUEST, + mds, + guid_type, + use_agg_mds, + metadata_cache_dir, + ) - # if agg MDS we will flatten the results as they are in "common" : dict format - # However this can result in duplicates as the aggregate mds is namespaced to - # handle this, therefore prefix the commons in front of the guid - if use_agg_mds: - partial_metadata = { - f"{c}__{i}": d - for c, y in partial_metadata.items() - for x in y - for i, d in x.items() - } + # output as TSV + if output_format == "tsv": + output_filename = _create_metadata_output_filename( + auth, guid_type, output_filename_suffix, ".tsv" + ) + output_columns = ( + ["guid"] + # "tags" is flattened to _tag_0 through _tag_n + + sorted(list(all_fields - set(["tags"]))) + + [f"_tag_{n}" for n in range(num_tags)] + ) + base_schema = {column: "" for column in output_columns} + with open(output_filename, "w+", encoding="utf-8") as output_file: + writer = csv.DictWriter( + output_file, + **{**BASE_CSV_PARSER_SETTINGS, "fieldnames": output_columns}, + ) + writer.writeheader() + + for guid in sorted(os.listdir(metadata_cache_dir)): + with open(f"{metadata_cache_dir}/{guid}", encoding="utf-8") as f: + fetched_metadata = json.load(f) + flattened_tags = { + f"_tag_{tag_num}": f"{tag['category']}: {tag['name']}" + for tag_num, tag in enumerate( + fetched_metadata.pop("tags", []) + ) + } - if len(partial_metadata): - for guid, guid_metadata in partial_metadata.items(): - with open( - f"{metadata_cache_dir}/{guid.replace('/', '_')}", "w+" - ) as cached_guid_file: - guid_discovery_metadata = guid_metadata["gen3_discovery"] - json.dump(guid_discovery_metadata, cached_guid_file) - all_fields |= set(guid_discovery_metadata.keys()) - num_tags = max( - num_tags, len(guid_discovery_metadata.get("tags", [])) + true_guid = guid + if use_agg_mds: + true_guid = guid.split("__")[1] + output_metadata = sanitize_tsv_row( + { + **base_schema, + **fetched_metadata, + **flattened_tags, + "guid": true_guid, + } ) - else: - break + writer.writerow(output_metadata) + else: + # output as JSON + output_filename = _create_metadata_output_filename( + auth, guid_type, output_filename_suffix, ".json" + ) + output_metadata = [] + for guid, metadata in partial_metadata.items(): + true_guid = guid + if use_agg_mds: + true_guid = guid.split("__")[1] + output_metadata.append({"guid": true_guid, **metadata}) + + with open(output_filename, "w+", encoding="utf-8") as output_file: + output_file.write(json.dumps(output_metadata, indent=4)) + + return output_filename + + +def read_mds_into_cache( + limit, max_guids_per_request, mds, guid_type, use_agg_mds, metadata_cache_dir +): + """ + Queries an mds instance for all metadata of a guid_type, and writes the data for each guid to a file in metadata_cache_dir + + Args: + limit (int): max number of records in one operation + max_guids_per_request (int): max number records for one request to mds + mds (Gen3Metadata): an instance of Gen3Metadata for an endpoint + guid_type (str): intended GUID type for query, defaults to discovery_metadata + use_agg_mds (bool): whether to use AggMDS during export, defaults to False + metadata_cache_dir (TemporaryDirectory): the temporary directory to write the mds query results to + """ + all_fields = set() + num_tags = 0 + + for offset in range(0, limit, max_guids_per_request): + partial_metadata = mds.query( + f"_guid_type={guid_type}", + return_full_metadata=True, + limit=min(limit, max_guids_per_request), + offset=offset, + use_agg_mds=use_agg_mds, + ) + + # if agg MDS we will flatten the results as they are in "common" : dict format + # However this can result in duplicates as the aggregate mds is namespaced to + # handle this, therefore prefix the commons in front of the guid + if use_agg_mds: + partial_metadata = { + f"{c}__{i}": d + for c, y in partial_metadata.items() + for x in y + for i, d in x.items() + } + + if len(partial_metadata): + for guid, guid_metadata in partial_metadata.items(): + with open( + f"{metadata_cache_dir}/{guid.replace('/', '_')}", + "w+", + encoding="utf-8", + ) as cached_guid_file: + guid_discovery_metadata = guid_metadata["gen3_discovery"] + json.dump(guid_discovery_metadata, cached_guid_file) + all_fields |= set(guid_discovery_metadata.keys()) + num_tags = max( + num_tags, len(guid_discovery_metadata.get("tags", [])) + ) + else: + break + return (partial_metadata, all_fields, num_tags) + + +def combine_discovery_metadata( + current_discovery_metadata, + metadata_file_to_combine, + discovery_column_to_map_on, + metadata_column_to_map, + output_filename, + metadata_prefix=None, + exact_match=False, +): + """ + Combine the provided metadata manifest with the existing Discovery metadata + in a commons. + + Args: + current_discovery_metadata (str): filename of TSV containing the current + discovery metadata + metadata_file_to_combine (str): filename of TSV containing the metadata + to combine with the discovery metadata + discovery_column_to_map_on (str): The column in the current discovery + metadata to use to map on + metadata_column_to_map (str): The column in the provided metadata file + to use to map/merge into the current Discovery metadata + metadata_prefix (str): Prefix to add to the column names in the provided + metadata file before final output + output_filename (str): filename to output combined metadata + exact_match (str): whether or not the content of discovery_column_to_map_on + is an EXACT match of the content in metadata_column_to_map. + Setting this to True when applicable improves the runtime of the + overall combination. + """ + + logging.info( + f"Combining '{metadata_file_to_combine}' with '{current_discovery_metadata}' " + f"by mapping " + f"'{metadata_column_to_map}' column (in '{metadata_file_to_combine}') to " + f"current discovery " + f"metadata's '{discovery_column_to_map_on}' column. Prefixing added " + f"metadata with: '{metadata_prefix}'. Output will be: {output_filename}" + ) - output_columns = ( - ["guid"] - # "tags" is flattened to _tag_0 through _tag_n - + sorted(list(all_fields - set(["tags"]))) - + [f"_tag_{n}" for n in range(num_tags)] + # First we need to add a prefix if it was provided + temporary_prefixed_filename = None + if metadata_prefix: + temporary_prefixed_filename = ( + CURRENT_DIR.rstrip("/") + + "/temp_" + + os.path.basename(metadata_file_to_combine) ) - base_schema = {column: "" for column in output_columns} - - output_filename = _metadata_file_from_auth(auth) - with open( - output_filename, - "w+", - ) as output_file: - writer = csv.DictWriter( - output_file, - **{**BASE_CSV_PARSER_SETTINGS, "fieldnames": output_columns}, - ) - writer.writeheader() - - for guid in sorted(os.listdir(metadata_cache_dir)): - with open(f"{metadata_cache_dir}/{guid}") as f: - fetched_metadata = json.load(f) - flattened_tags = { - f"_tag_{tag_num}": f"{tag['category']}: {tag['name']}" - for tag_num, tag in enumerate(fetched_metadata.pop("tags", [])) - } - - true_guid = guid - if use_agg_mds: - true_guid = guid.split("__")[1] - output_metadata = _sanitize_tsv_row( + delimiter = get_delimiter_from_extension(metadata_file_to_combine) + with open(metadata_file_to_combine, encoding="utf-8") as metadata_file: + reader = csv.DictReader(metadata_file, delimiter=delimiter) + + new_headers = [] + for header in reader.fieldnames: + new_headers.append(metadata_prefix + header) + + with open( + temporary_prefixed_filename, "w", encoding="utf-8" + ) as prefixed_metadata_file: + writer = csv.DictWriter( + prefixed_metadata_file, fieldnames=new_headers, delimiter=delimiter + ) + + # write the new header out + writer.writeheader() + + for row in reader: + writer.writerow( { - **base_schema, - **fetched_metadata, - **flattened_tags, - "guid": true_guid, + metadata_prefix + key: value + for (key, value) in row.items() + if key } ) - writer.writerow(output_metadata) - return output_filename + # Now we need to associate the provided metadata with a Discovery GUID + + custom_manifests_mapping_config = copy.deepcopy(manifests_mapping_config) + custom_manifest_row_parsers = copy.deepcopy(manifest_row_parsers) + + # what column to use as the final GUID for metadata (this MUST exist in the + # indexing file) + custom_manifests_mapping_config["guid_column_name"] = "guid" + + # what column from the "metadata file" to use for mapping + custom_manifests_mapping_config["row_column_name"] = ( + metadata_prefix + metadata_column_to_map + ) + custom_manifests_mapping_config[ + "indexing_manifest_column_name" + ] = discovery_column_to_map_on + + # by default, the functions for parsing the manifests and rows assumes a 1:1 + # mapping. There is an additional function provided for partial string matching + # which we can use here. + if not exact_match: + custom_manifest_row_parsers[ + "guids_for_manifest_row" + ] = get_guids_for_manifest_row_partial_match + + temporary_output_filename = ( + CURRENT_DIR.rstrip("/") + "/temp_" + os.path.basename(output_filename) + ) + + if exact_match: + merge_guids_into_metadata( + indexing_manifest=current_discovery_metadata, + metadata_manifest=temporary_prefixed_filename or metadata_file_to_combine, + output_filename=temporary_output_filename, + manifests_mapping_config=custom_manifests_mapping_config, + manifest_row_parsers=manifest_row_parsers, + include_all_indexing_cols_in_output=True, + ) + + output_filename = make_folders_for_filename( + output_filename, current_directory=CURRENT_DIR + ) + else: + merge_guids_into_metadata( + indexing_manifest=current_discovery_metadata, + metadata_manifest=temporary_prefixed_filename or metadata_file_to_combine, + output_filename=temporary_output_filename, + manifests_mapping_config=custom_manifests_mapping_config, + manifest_row_parsers=custom_manifest_row_parsers, + include_all_indexing_cols_in_output=False, + ) + + # Now the GUID exists in the output (Discovery GUID has been associated + # to the provided metadata), so we can easily merge that back + # into the discovery metadata + + custom_manifests_mapping_config["row_column_name"] = "guid" + custom_manifests_mapping_config["indexing_manifest_column_name"] = "guid" + + merge_guids_into_metadata( + indexing_manifest=temporary_output_filename, + metadata_manifest=current_discovery_metadata, + output_filename=temporary_output_filename, + manifests_mapping_config=custom_manifests_mapping_config, + manifest_row_parsers=manifest_row_parsers, + include_all_indexing_cols_in_output=True, + ) + + output_filename = make_folders_for_filename( + output_filename, current_directory=CURRENT_DIR + ) + + # remove rows with GUID of None (this means there was no matching + # metadata to update in Discovery) + with open( + temporary_output_filename, "rt", encoding="utf-8-sig" + ) as input_file, open(output_filename, "w", encoding="utf-8") as output_file: + delimiter = get_delimiter_from_extension(temporary_output_filename) + reader = csv.DictReader(input_file, delimiter=delimiter) + + writer = csv.DictWriter( + output_file, + **{ + **BASE_CSV_PARSER_SETTINGS, + "delimiter": delimiter, + "fieldnames": reader.fieldnames, + "extrasaction": "ignore", + }, + ) + writer.writeheader() + + for row in reader: + if row.get("guid"): + writer.writerow(row) + + # cleanup temporary files + for temporary_file in [ + temp_file + for temp_file in [temporary_output_filename, temporary_prefixed_filename] + if temp_file + ]: + try: + os.remove(temporary_file) + except Exception as exc: + pass + + logging.info(f"Done. Final combined output: {output_filename}") + return output_filename async def publish_discovery_metadata( @@ -134,9 +392,21 @@ async def publish_discovery_metadata( guid_field=None, is_unregistered_metadata=False, reset_unregistered_metadata=False, + update_registered_metadata=True, ): """ - Publish discovery metadata from a tsv file + Publish discovery metadata from a tsv or json file + + Args: + auth (Gen3Auth): a Gen3Auth object + metadata_filename (str): the file path of the local metadata file to be published, must be in either JSON or TSV format + endpoint (str): HOSTNAME of a Gen3 environment, defaults to None + omit_empty_values (bool): whether to exclude fields with empty values from the published discovery metadata, defaults to False + guid_type (str): intended GUID type for publishing, defaults to discovery_metadata + guid_field (str): specify a field from the metadata that will be used as GUIDs, if not specified, will try to find a field named "guid" from the metadata, if that field doesn't exists in a certain metadata record, that record will be skipped from publishing, defaults to None + is_unregistered_metadata (bool): (for use by "study registration" feature only) whether to publish metadata as unregistered study metadata, defaults to False + reset_unregistered_metadata (bool): (for use by "study registration" feature only) whether to reset existing study metadata back to unregistered study metadata if they exists in the local file, defaults to False + update_registered_metadata (bool): (for use by "study registration" feature only) whether to update existing study metadata with new values if they exists in the local file, defaults to True """ if endpoint: mds = Gen3Metadata(auth_provider=auth, endpoint=endpoint) @@ -144,42 +414,99 @@ async def publish_discovery_metadata( mds = Gen3Metadata(auth_provider=auth) if not metadata_filename: - metadata_filename = _metadata_file_from_auth(auth) + metadata_filename = _create_metadata_output_filename(auth, guid_type) + + if not ( + metadata_filename.endswith(".csv") + or metadata_filename.endswith(".tsv") + or metadata_filename.endswith(".json") + ): + logging.error( + f"Unsupported file type supplied {metadata_filename}! Only CSV/TSV/JSON are allowed." + ) + raise ValueError(f"Unsupported file type supplied {metadata_filename}") + + is_json_metadata = False + if metadata_filename.endswith(".json"): + is_json_metadata = True delimiter = "," if metadata_filename.endswith(".csv") else "\t" - with open(metadata_filename) as metadata_file: - csv_parser_setting = {**BASE_CSV_PARSER_SETTINGS, "delimiter": delimiter} - if is_unregistered_metadata: - csv_parser_setting["quoting"] = csv.QUOTE_MINIMAL - csv_parser_setting["quotechar"] = '"' - metadata_reader = csv.DictReader(metadata_file, **{**csv_parser_setting}) - tag_columns = [ - column for column in metadata_reader.fieldnames if "_tag_" in column - ] + with open(metadata_filename, encoding="utf-8") as metadata_file: + if is_json_metadata: + metadata_reader = json.load(metadata_file) + tag_columns = [] + else: + csv_parser_setting = {**BASE_CSV_PARSER_SETTINGS, "delimiter": delimiter} + if is_unregistered_metadata: + csv_parser_setting["quoting"] = csv.QUOTE_MINIMAL + csv_parser_setting["quotechar"] = '"' + metadata_reader = csv.DictReader(metadata_file, **{**csv_parser_setting}) + tag_columns = [ + column for column in metadata_reader.fieldnames if "_tag_" in column + ] pending_requests = [] + registered_metadata_guids = [] + registered_metadata = {} if is_unregistered_metadata: - registered_metadata_guids = mds.query( - f"_guid_type={guid_type}", limit=2000, offset=0 - ) - guid_type = f"unregistered_{guid_type}" + if not update_registered_metadata: + registered_metadata_guids = mds.query( + f"_guid_type={guid_type}", limit=2000, offset=0 + ) + else: + registered_metadata = mds.query( + f"_guid_type={guid_type}", + return_full_metadata=True, + limit=2000, + offset=0, + ) + registered_metadata_guids = registered_metadata.keys() for metadata_line in metadata_reader: - discovery_metadata = { - key: _try_parse(value) for key, value in metadata_line.items() - } + discovery_metadata = {} + extra_metadata = {} + if is_json_metadata: + if "gen3_discovery" in metadata_line: + # likely to be a JSON dump from the output_expanded_discovery_metadata() function + discovery_metadata = metadata_line.pop("gen3_discovery") + # remove unneeded fields + try: + del metadata_line["_guid_type"] + except KeyError: + pass + extra_metadata = metadata_line + # no 'gen3_discovery' in JSON, treat entire JSON as discovery metadata + else: + discovery_metadata = metadata_line + else: + discovery_metadata = { + key: _try_parse(value) for key, value in metadata_line.items() + } if guid_field is None: guid = discovery_metadata.pop("guid") else: guid = discovery_metadata[guid_field] - # when publishing unregistered metadata, skip those who are already registered if reset_unregistered_metadata is set to false + if not guid: + logging.warning( + f"{metadata_line} has no GUID information and has been skipped." + ) + continue + + # remove unneeded fields + if extra_metadata: + extra_metadata.pop("guid", None) + + # when publishing unregistered metadata, skip those who are already + # registered if both reset_unregistered_metadata and + # update_registered_metadata are set to false if ( - not reset_unregistered_metadata - and is_unregistered_metadata + is_unregistered_metadata and str(guid) in registered_metadata_guids + and not reset_unregistered_metadata + and not update_registered_metadata ): continue @@ -202,10 +529,36 @@ async def publish_discovery_metadata( if value not in ["", [], {}] } - metadata = { - "_guid_type": guid_type, - "gen3_discovery": discovery_metadata, - } + new_guid_type = guid_type + if is_unregistered_metadata: + if reset_unregistered_metadata or ( + str(guid) not in registered_metadata_guids + ): + # only set GUID type to "unregistered_discovery_metadata" + # for unregistered metadata, or reset_unregistered_metadata is set + new_guid_type = f"unregistered_{guid_type}" + elif str(guid) in registered_metadata_guids: + if update_registered_metadata: + existing_registered_metadata = {} + try: + existing_registered_metadata = registered_metadata.get( + str(guid) + ).get("gen3_discovery") + except AttributeError: + pass + discovery_metadata = { + **existing_registered_metadata, + **discovery_metadata, + } + else: + logging.warning(f"{guid} is not already registered. Skipping.") + continue + + metadata = get_discovery_metadata( + provided_metadata=discovery_metadata, guid_type=new_guid_type + ) + if extra_metadata: + metadata = {**metadata, **extra_metadata} pending_requests += [mds.async_create(guid, metadata, overwrite=True)] if len(pending_requests) == MAX_CONCURRENT_REQUESTS: @@ -215,6 +568,24 @@ async def publish_discovery_metadata( await asyncio.gather(*pending_requests) +def get_discovery_metadata( + provided_metadata, + guid_type="discovery_metadata", +): + """ + Return a metadata block representing Gen3 Discovery Metadata with the provided + metadata in the relevant block. + + Args: + provided_metadata (Dict): Metadata fields you want in Gen3 Discovery + guid_type (str, optional): value to override the default _guid_type + """ + return { + "_guid_type": guid_type, + "gen3_discovery": provided_metadata, + } + + def try_delete_discovery_guid(auth, guid): """ Deletes all discovery metadata under [guid] if it exists @@ -230,13 +601,26 @@ def try_delete_discovery_guid(auth, guid): logging.warning(e) -def _sanitize_tsv_row(tsv_row): +def sanitize_tsv_row(tsv_row, escape_new_lines=True): + """ + Cleanup dictionary (tsv_row) so that nested lists/dicts are represented + in valid JSON and if escape_new_lines, then \n are escaped. + + Args: + tsv_row (Dict): Dictionary representing a TSV row to write + escape_new_lines (bool, optional): Whether or not to escape \n as \\n + + Returns: + Dict: Sanitized input + """ sanitized = {} for k, v in tsv_row.items(): if type(v) in [list, dict]: sanitized[k] = json.dumps(v) - elif type(v) == str: + elif (type(v) == str) and escape_new_lines: sanitized[k] = v.replace("\n", "\\n") + elif type(v) == int: + sanitized[k] = v return sanitized @@ -250,7 +634,10 @@ def _try_parse(data): return "" -def _metadata_file_from_auth(auth): +def _create_metadata_output_filename(auth, guid_type, suffix="", file_extension=".tsv"): return ( - "-".join(urlparse(auth.endpoint).netloc.split(".")) + "-discovery_metadata.tsv" + "-".join(urlparse(auth.endpoint).netloc.split(".")) + + f"-{guid_type}" + + (f"-{suffix}" if suffix else "") + + file_extension ) diff --git a/gen3/tools/metadata/discovery_objects.py b/gen3/tools/metadata/discovery_objects.py new file mode 100644 index 000000000..8aa3831fd --- /dev/null +++ b/gen3/tools/metadata/discovery_objects.py @@ -0,0 +1,345 @@ +import csv +import json +import tempfile +import asyncio +import os +import requests.exceptions +from cdislogging import get_logger +from urllib.parse import urlparse + +from gen3.metadata import Gen3Metadata + +from gen3.tools.metadata.discovery import ( + MAX_GUIDS_PER_REQUEST, + MAX_CONCURRENT_REQUESTS, + BASE_CSV_PARSER_SETTINGS, + read_mds_into_cache, + get_discovery_metadata, + sanitize_tsv_row, +) + +REQUIRED_OBJECT_FIELDS = {"dataset_guid", "guid", "display_name"} +OPTIONAL_OBJECT_FIELDS = {"description", "type"} + +logging = get_logger("__name__") + + +async def output_discovery_objects( + auth, + dataset_guids=None, + endpoint=None, + limit=500, + use_agg_mds=False, + guid_type="discovery_metadata", + only_object_guids=False, + template=False, + output_format="tsv", + output_filename_suffix="", +): + """ + fetch discovery objects data from a commons and output to {commons}-discovery_objects.tsv or {commons}-discovery_objects.json + + Args: + auth (Gen3Auth): a Gen3Auth object + dataset_guids (list of str): a list of datasets to read objects from + endpoint (str): HOSTNAME of a Gen3 environment, defaults to None + limit (int): max number of records in one operation, defaults to 500 + use_agg_mds (bool): whether to use AggMDS during export, defaults to False + guid_type (str): intended GUID type for query, defaults to discovery_metadata + only_objects_guids (bool): whether to output guids to command line such that they can be piped to another command + template (bool): whether to output a file with just required headers, to be filled out and then published + output_format (str): format of output file (can only be either tsv or json), defaults to tsv + output_filename_suffix (str): additional suffix for the output file name, defaults to "" + """ + if template: + output_filename = _create_discovery_objects_filename(auth, "TEMPLATE", ".tsv") + object_fields = list(REQUIRED_OBJECT_FIELDS) + object_fields.remove("dataset_guid") + object_fields.remove("guid") + object_fields = ( + ["dataset_guid", "guid"] + + object_fields + + sorted(list(OPTIONAL_OBJECT_FIELDS)) + ) + with open(output_filename, "w+", encoding="utf-8") as output_file: + writer = csv.DictWriter( + output_file, + **{**BASE_CSV_PARSER_SETTINGS, "fieldnames": object_fields}, + ) + writer.writeheader() + return output_filename + + if output_format.lower() != "tsv" and output_format != "json": + logging.error( + f"Unsupported output file format {output_format}! Only tsv or json is allowed" + ) + raise ValueError(f"Unsupported output file format {output_format}") + + if endpoint: + mds = Gen3Metadata( + auth_provider=auth, + endpoint=endpoint, + service_location="mds/aggregate" if use_agg_mds else "mds", + ) + else: + mds = Gen3Metadata( + auth_provider=auth, + service_location="mds/aggregate" if use_agg_mds else "mds", + ) + + with tempfile.TemporaryDirectory() as metadata_cache_dir: + partial_metadata, all_fields, num_tags = read_mds_into_cache( + limit, + MAX_GUIDS_PER_REQUEST, + mds, + guid_type, + use_agg_mds, + metadata_cache_dir, + ) + + # output to command line + if only_object_guids: + return_objects = [] + for guid in sorted(os.listdir(metadata_cache_dir)): + if (not dataset_guids) or (guid in dataset_guids): + with open(f"{metadata_cache_dir}/{guid}", encoding="utf-8") as f: + fetched_metadata = json.load(f) + return_objects += ( + fetched_metadata["objects"] + if "objects" in fetched_metadata.keys() + else [] + ) + return return_objects + + # output as TSV + elif output_format == "tsv": + output_filename = _create_discovery_objects_filename( + auth, output_filename_suffix, ".tsv" + ) + object_fields = REQUIRED_OBJECT_FIELDS.copy() + all_objects = [] + + for guid in sorted(os.listdir(metadata_cache_dir)): + if (not dataset_guids) or (guid in dataset_guids): + with open(f"{metadata_cache_dir}/{guid}", encoding="utf-8") as f: + fetched_metadata = json.load(f) + curr_objects = ( + fetched_metadata["objects"] + if ("objects" in fetched_metadata.keys()) + else [] + ) + for obj in curr_objects: + object_fields |= set(obj.keys()) + obj["dataset_guid"] = guid + all_objects += curr_objects + object_fields.remove("guid") + object_fields.remove("dataset_guid") + object_fields.remove("display_name") + object_fields = sorted(object_fields) + object_fields = ["dataset_guid", "guid", "display_name"] + object_fields + + with open(output_filename, "w+", encoding="utf-8") as output_file: + writer = csv.DictWriter( + output_file, + **{**BASE_CSV_PARSER_SETTINGS, "fieldnames": object_fields}, + ) + writer.writeheader() + for obj in all_objects: + output_metadata = sanitize_tsv_row(obj) + writer.writerow(output_metadata) + + else: + # output as JSON + output_filename = _create_discovery_objects_filename( + auth, output_filename_suffix, ".json" + ) + output_metadata = [] + dataset_guids = dataset_guids if dataset_guids else partial_metadata.keys() + for guid in dataset_guids: + true_guid = guid + if use_agg_mds: + true_guid = guid.split("__")[1] + metadata = ( + partial_metadata[guid]["gen3_discovery"]["objects"] + if "objects" in partial_metadata[guid]["gen3_discovery"].keys() + else [] + ) + for obj in metadata: + output_metadata.append({"dataset_guid": true_guid, **obj}) + + with open(output_filename, "w+", encoding="utf-8") as output_file: + output_file.write(json.dumps(output_metadata, indent=4)) + + return output_filename + + +async def publish_discovery_object_metadata( + auth, + metadata_filename, + endpoint=None, + guid_type="discovery_metadata", + overwrite=False, +): + """ + Publish discovery objects from a TSV file + + Args: + auth (Gen3Auth): a Gen3Auth object + metadata_filename (str): the file path of the local objects file to be published, must be in TSV format + endpoint (str): HOSTNAME of a Gen3 environment, defaults to None + guid_type (str): intended GUID type for publishing, defaults to discovery_metadata + overwrite (bool): whether to allow replacing objects to a dataset_guid instead of appending + """ + if not is_valid_object_manifest(metadata_filename): + raise ValueError(f"Invalid objects file supplied {metadata_filename}") + if endpoint: + mds = Gen3Metadata(auth_provider=auth, endpoint=endpoint) + else: + mds = Gen3Metadata(auth_provider=auth) + + if not metadata_filename.endswith(".tsv"): + logging.error( + f"Unsupported file type supplied {metadata_filename}! Only TSV are allowed." + ) + raise ValueError(f"Unsupported file type supplied {metadata_filename}") + + delimiter = "\t" + with open(metadata_filename, encoding="utf-8") as metadata_file: + csv_parser_setting = {**BASE_CSV_PARSER_SETTINGS, "delimiter": delimiter} + metadata_reader = csv.DictReader(metadata_file, **{**csv_parser_setting}) + pending_requests = [] + dataset_dict = {} + + for obj_line in metadata_reader: + # if required fields are missing, display error + required_fields = list(REQUIRED_OBJECT_FIELDS) + missing_fields = [] + for field in required_fields: + if not obj_line[field]: + missing_fields.append(field) + if missing_fields: + logging.error(f"Missing required field(s) {missing_fields}.") + raise ValueError(f"Required field(s) missing: {missing_fields}") + + dataset_guid = obj_line.pop("dataset_guid") + if dataset_guid not in dataset_dict: + dataset_dict[dataset_guid] = {"objects": []} + dataset_dict[dataset_guid]["objects"].append(obj_line) + + for dataset_guid in dataset_dict.keys(): + # if dataset_guid already exists, update (noting the use of --overwrite), if it doesn’t already exist, create it + try: + curr_dataset_metadata = mds.get(dataset_guid) + except requests.exceptions.HTTPError as e: + if e.response.status_code == 404: + curr_dataset_metadata = get_discovery_metadata( + provided_metadata={}, guid_type=guid_type + ) + else: + raise + + # allow replacing instead of appending + if overwrite or not ( + "objects" in curr_dataset_metadata["gen3_discovery"].keys() + ): + curr_dataset_metadata["gen3_discovery"]["objects"] = dataset_dict[ + dataset_guid + ]["objects"] + else: + curr_dataset_dict = { + curr_obj["guid"]: curr_obj + for curr_obj in curr_dataset_metadata["gen3_discovery"]["objects"] + } + for new_obj in dataset_dict[dataset_guid]["objects"]: + curr_dataset_dict[new_obj["guid"]] = new_obj + + curr_dataset_metadata["gen3_discovery"]["objects"] = list( + curr_dataset_dict.values() + ) + + pending_requests += [ + mds.async_create(dataset_guid, curr_dataset_metadata, overwrite=True) + ] + if len(pending_requests) == MAX_CONCURRENT_REQUESTS: + await asyncio.gather(*pending_requests) + pending_requests = [] + logging.info(f"Updated objects for Discovery Dataset: {dataset_guid}") + await asyncio.gather(*pending_requests) + + +def try_delete_discovery_objects_from_dict(auth, delete_objs): + """ + Delete discovery objects from a dictionary with schema {: [, , ...]} + + Args: + auth (Gen3Auth): a Gen3Auth object + delete_objs (dict): a dict of dataset_guid keys with a list of object_guid values + """ + mds = Gen3Metadata(auth_provider=auth) + for dataset_guid, objects_to_delete in delete_objs.items(): + try: + metadata = mds.get(dataset_guid) + if "objects" in metadata["gen3_discovery"].keys(): + curr_objects = metadata["gen3_discovery"]["objects"] + curr_objects = [ + obj + for obj in curr_objects + if (obj["guid"] not in objects_to_delete) + ] + metadata["gen3_discovery"]["objects"] = curr_objects + mds.create(dataset_guid, metadata, overwrite=True) + logging.info(f"Deleted objects for Discovery Dataset: {dataset_guid}") + except requests.exceptions.HTTPError as e: + logging.warning(e) + + +def try_delete_discovery_objects(auth, guids): + """ + Delete all discovery objects from one or more datasets + + Args: + auth (Gen3Auth): a Gen3Auth object + guids (tuple of str): a tuple of datasets + """ + mds = Gen3Metadata(auth_provider=auth) + for arg in guids: + # delete all objects from dataset_guid + try: + metadata = mds.get(arg) + if metadata["_guid_type"] == "discovery_metadata": + if "objects" in metadata["gen3_discovery"].keys(): + metadata["gen3_discovery"]["objects"] = [] + mds.create(arg, metadata, overwrite=True) + logging.info(f"Deleted objects for Discovery Dataset: {arg}") + else: + logging.warning(f"{guid} is not discovery metadata. Skipping.") + except requests.exceptions.HTTPError as e: + logging.warning(e) + + +def is_valid_object_manifest(filename): + """ + Checks a file for required object fields, used for publishing or deleting discovery objects + + Args: + filename (str): the file to perform validation on + """ + delimiter = "\t" + with open(filename, encoding="utf-8") as object_manifest: + csv_parser_setting = {**BASE_CSV_PARSER_SETTINGS, "delimiter": delimiter} + objects_reader = csv.DictReader(object_manifest, **{**csv_parser_setting}) + columns = set(objects_reader.fieldnames) + required_fields = REQUIRED_OBJECT_FIELDS.copy() + missing_columns = required_fields - columns + if missing_columns: + logging.error(f"Missing required column(s) {missing_columns}.") + return REQUIRED_OBJECT_FIELDS.issubset(columns) + + +def _create_discovery_objects_filename(auth, suffix="", file_extension=".tsv"): + return ( + "-".join(urlparse(auth.endpoint).netloc.split(".")) + + "-discovery_objects" + + (f"-{suffix}" if suffix else "") + + file_extension + ) diff --git a/gen3/utils.py b/gen3/utils.py index bb34a1ab8..869969525 100644 --- a/gen3/utils.py +++ b/gen3/utils.py @@ -4,6 +4,8 @@ import sys import re import requests +import random +import string import os from urllib.parse import urlunsplit @@ -25,6 +27,47 @@ AUTHZ_FORMAT = r"^.*$" +def get_random_alphanumeric(length): + # end up with roughly the same amount of numbers as letters + letters = string.ascii_lowercase + "".join([str(item) for item in range(0, 10)]) * 3 + return "".join(random.choice(letters) for i in range(length)) + + +def make_folders_for_filename(filename, current_directory=None): + """ + Make the directories up to the filename provided. Relative paths are supported. + Ensure you supply the current directory you want relative paths to be + based off of. Returns the absolute path for the file with the folders + created. This does NOT create the actual file. + + Example: + output = make_folders_for_filename( + "../test/temp/output.txt", + current_directory="/home/me/foobar" + ) + print(output) + >>> /home/me/test/temp/output.txt + + Args: + filename (str): path to desired file + current_directory (str, optional): current directory you want relative paths to be + based off of + + Returns: + str: the absolute path for the file with the folders created + """ + current_directory = os.path.dirname(os.path.realpath(__file__)) + directory = os.path.dirname(os.path.abspath(filename)) + if not os.path.exists(directory): + os.makedirs(directory) + + absolute_path_filename = ( + directory.rstrip("/") + "/" + os.path.abspath(filename).split("/")[-1] + ) + + return absolute_path_filename + + def get_or_create_event_loop_for_thread(): """ Asyncio helper function to attempt to get a currently running loop and @@ -48,6 +91,9 @@ def get_or_create_event_loop_for_thread(): def raise_for_status_and_print_error(response): + """ + This only works for sync requests + """ try: response.raise_for_status() except requests.HTTPError as exception: @@ -155,16 +201,48 @@ def log_backoff_giveup_except_on_no_retries(details): ) -def exception_do_not_retry(error): - def _is_status(code): - return ( - str(getattr(error, "code", None)) == code - or str(getattr(error, "status", None)) == code - or str(getattr(error, "status_code", None)) == code - or str(getattr(getattr(error, "response", {}), "status_code", "")) == code - ) +def get_delimiter_from_extension(filename): + """ + Return the file delimter based on the extension. + + Args: + filename (str): file name with extension - if _is_status("409") or _is_status("404"): + Returns: + str: delimeter character, either \t or , + """ + file_ext = os.path.splitext(filename) + if file_ext[-1].lower() == ".tsv": + file_delimiter = "\t" + else: + # default, assume CSV + file_delimiter = "," + return file_delimiter + + +def is_status_code(error, code): + """ + Args: + error (object): Ideally a requests.Response, this safely checks for + known attributes where the status code might be + code (str): The status code you want to check for in the error. ex: 404 + + Returns: + bool: Whether or not the error object contains the status code specified + """ + code = str(code) + return ( + str(getattr(error, "code", None)) == code + or str(getattr(error, "status", None)) == code + or str(getattr(error, "status_code", None)) == code + or str(getattr(getattr(error, "response", {}), "code", "")) == code + or str(getattr(getattr(error, "response", {}), "status", "")) == code + or str(getattr(getattr(error, "response", {}), "status_code", "")) == code + ) + + +def exception_do_not_retry(error): + if is_status_code(error, "409") or is_status_code(error, "404"): return True return False @@ -269,7 +347,7 @@ def deep_dict_update(a, b): "logger": None, "on_backoff": log_backoff_retry, "on_giveup": log_backoff_giveup, - "max_tries": os.environ.get("GEN3SDK_MAX_RETRIES", 3), + "max_tries": int(os.environ.get("GEN3SDK_MAX_RETRIES", 3)), "giveup": exception_do_not_retry, } @@ -279,6 +357,6 @@ def deep_dict_update(a, b): "logger": None, "on_backoff": log_backoff_retry, "on_giveup": log_backoff_giveup_except_on_no_retries, - "max_tries": os.environ.get("GEN3SDK_MAX_RETRIES", 3), + "max_tries": int(os.environ.get("GEN3SDK_MAX_RETRIES", 3)), "giveup": exception_do_not_retry, } diff --git a/poetry.lock b/poetry.lock index 4d3e1b9e4..80cca0730 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,119 +1,226 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + [[package]] name = "aiofiles" version = "0.8.0" description = "File support for asyncio." -category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "aiofiles-0.8.0-py3-none-any.whl", hash = "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937"}, + {file = "aiofiles-0.8.0.tar.gz", hash = "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"}, +] [[package]] name = "aiohttp" -version = "3.8.1" +version = "3.9.0" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c"}, + {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc"}, + {file = "aiohttp-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b"}, + {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff"}, + {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9"}, + {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd"}, + {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8"}, + {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b"}, + {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932"}, + {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075"}, + {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986"}, + {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94"}, + {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30"}, + {file = "aiohttp-3.9.0-cp310-cp310-win32.whl", hash = "sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3"}, + {file = "aiohttp-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd"}, + {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844"}, + {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218"}, + {file = "aiohttp-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318"}, + {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208"}, + {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f"}, + {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911"}, + {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896"}, + {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d"}, + {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113"}, + {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7"}, + {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7"}, + {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411"}, + {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192"}, + {file = "aiohttp-3.9.0-cp311-cp311-win32.whl", hash = "sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea"}, + {file = "aiohttp-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b"}, + {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d"}, + {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994"}, + {file = "aiohttp-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4"}, + {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940"}, + {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d"}, + {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded"}, + {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982"}, + {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8"}, + {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029"}, + {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253"}, + {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe"}, + {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3"}, + {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8"}, + {file = "aiohttp-3.9.0-cp312-cp312-win32.whl", hash = "sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80"}, + {file = "aiohttp-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202"}, + {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af"}, + {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b"}, + {file = "aiohttp-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814"}, + {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb"}, + {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456"}, + {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985"}, + {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73"}, + {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf"}, + {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4"}, + {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305"}, + {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8"}, + {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11"}, + {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887"}, + {file = "aiohttp-3.9.0-cp38-cp38-win32.whl", hash = "sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f"}, + {file = "aiohttp-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40"}, + {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf"}, + {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8"}, + {file = "aiohttp-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2"}, + {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735"}, + {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31"}, + {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f"}, + {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787"}, + {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8"}, + {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd"}, + {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76"}, + {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d"}, + {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9"}, + {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e"}, + {file = "aiohttp-3.9.0-cp39-cp39-win32.whl", hash = "sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454"}, + {file = "aiohttp-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f"}, + {file = "aiohttp-3.9.0.tar.gz", hash = "sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d"}, +] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["cchardet", "brotli", "aiodns"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" -version = "1.2.0" +version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] [package.dependencies] frozenlist = ">=1.1.0" [[package]] name = "anyio" -version = "3.6.1" +version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.6.2" +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 = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16)"] +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 = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] [[package]] name = "asyncio" version = "3.4.3" description = "reference implementation of PEP 3156" -category = "main" optional = false python-versions = "*" +files = [ + {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"}, + {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"}, + {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"}, + {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"}, +] [[package]] name = "atomicwrites" version = "1.4.1" description = "Atomic file writes." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" -version = "22.1.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] -tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] -docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] -dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "authlib" -version = "0.11" -description = "The ultimate Python library in building OAuth and OpenID Connect servers." -category = "dev" +version = "1.2.1" +description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false python-versions = "*" +files = [ + {file = "Authlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:c88984ea00149a90e3537c964327da930779afa4564e354edfd98410bea01911"}, + {file = "Authlib-1.2.1.tar.gz", hash = "sha256:421f7c6b468d907ca2d9afede256f068f87e34d23dd221c07d13d4c234726afb"}, +] [package.dependencies] -cryptography = "*" -requests = "*" +cryptography = ">=3.2" [[package]] name = "authutils" -version = "6.2.1" +version = "6.2.3" description = "Gen3 auth utility functions" -category = "dev" optional = false python-versions = ">=3.9,<4.0" +files = [ + {file = "authutils-6.2.3-py3-none-any.whl", hash = "sha256:8c4e7e24183cbc1055ab91eaf9d2966f0da5b739be0fabfe380749674ba3057e"}, + {file = "authutils-6.2.3.tar.gz", hash = "sha256:c44e1f309b2b5b6db1276f69e1e18ec5c6be1ae33bfe52608a30049b8669ff7b"}, +] [package.dependencies] -authlib = "0.11.0" +authlib = ">=1.1.0" cached-property = ">=1.4,<2.0" cdiserrors = "<2.0.0" httpx = ">=0.23.0,<1.0.0" @@ -121,32 +228,41 @@ pyjwt = {version = ">=2.4.0,<3.0", extras = ["crypto"]} xmltodict = ">=0.9,<1.0" [package.extras] -flask = ["Flask (>=0.10.1)"] fastapi = ["fastapi (>=0.65.2,<0.66.0)"] +flask = ["Flask (<=2.3.3)"] [[package]] name = "backoff" version = "1.11.1" description = "Function decoration for backoff and retry" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, + {file = "backoff-1.11.1.tar.gz", hash = "sha256:ccb962a2378418c667b3c979b504fdeb7d9e0d29c0579e3b13b86467177728cb"}, +] [[package]] name = "cached-property" version = "1.5.2" description = "A decorator for caching properties in classes." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] [[package]] name = "cdiserrors" version = "1.0.0" description = "Gen3 shared exceptions and utilities." -category = "dev" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "cdiserrors-1.0.0-py3-none-any.whl", hash = "sha256:2e188645832e8c98468267af3e54bc5d3a298078b9869899256251e54dc1599d"}, + {file = "cdiserrors-1.0.0.tar.gz", hash = "sha256:d6e56b0a9f6cc0104f4344f837b735fefb2caf8d0c4ef50569881dc140ebfc4a"}, +] [package.dependencies] cdislogging = ">=1.0.0,<2.0.0" @@ -158,17 +274,19 @@ flask = ["Flask (>=1.1.2,<2.0.0)"] name = "cdislogging" version = "1.1.1" description = "Standardized logging tool and format for cdis applications" -category = "main" optional = false python-versions = "*" +files = [ + {file = "cdislogging-1.1.1.tar.gz", hash = "sha256:77e11648244cda3a8094b8ae6081435a2303f259612846c49ef8825c7be141e3"}, +] [[package]] name = "cdisutilstest" version = "0.2.4" description = "Collection of test data and tools" -category = "dev" optional = false python-versions = "*" +files = [] develop = false [package.source] @@ -179,57 +297,260 @@ resolved_reference = "bdfdeb05e45407e839fd954ce6d195d847cd8024" [[package]] name = "certifi" -version = "2022.6.15" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "dev" optional = false -python-versions = "*" +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"}, +] [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" version = "7.1.2" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "coverage" -version = "6.4.3" +version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +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"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -239,30 +560,59 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "37.0.4" +version = "41.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797"}, + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d"}, + {file = "cryptography-41.0.5-cp37-abi3-win32.whl", hash = "sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936"}, + {file = "cryptography-41.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84"}, + {file = "cryptography-41.0.5.tar.gz", hash = "sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"}, +] [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)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.5.7" +version = "0.5.9" description = "Easily serialize dataclasses to and from JSON" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "dataclasses-json-0.5.9.tar.gz", hash = "sha256:e9ac87b73edc0141aafbce02b44e93553c3123ad574958f0fe52a534b6707e8e"}, + {file = "dataclasses_json-0.5.9-py3-none-any.whl", hash = "sha256:1280542631df1c375b7bc92e5b86d39e06c44760d7e3571a537b3b8acabf2f0c"}, +] [package.dependencies] marshmallow = ">=3.3.0,<4.0.0" @@ -270,29 +620,31 @@ marshmallow-enum = ">=1.5.1,<2.0.0" typing-inspect = ">=0.4.0" [package.extras] -dev = ["types-dataclasses", "simplejson", "flake8", "portray", "hypothesis", "mypy (>=0.710)", "ipython", "pytest (>=6.2.3)"] +dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "setuptools", "simplejson", "twine", "types-dataclasses", "wheel"] [[package]] name = "dictionaryutils" -version = "3.0.2" -description = "" -category = "main" +version = "3.4.10" +description = "Python wrapper and metaschema for datadictionary." optional = false -python-versions = "*" +python-versions = ">=3.9,<4" +files = [ + {file = "dictionaryutils-3.4.10.tar.gz", hash = "sha256:5f4ebf1a78fdb97ab7172bdbd574a1756f5689fc72e85d0b298de9419c4e47b7"}, +] [package.dependencies] -cdislogging = ">=1.0,<2.0" -jsonschema = ">=3.2,<4.0" -PyYAML = ">=5.1,<6.0" +cdislogging = ">=1.0.0,<2.0.0" +jsonschema = ">=2.5,<4" +PyYAML = "*" requests = ">=2.18,<3.0" [[package]] name = "doiclient" version = "0.1" description = "" -category = "dev" optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -308,9 +660,9 @@ resolved_reference = "1a5f4b2a0b04577f31f3dcec511ade117d9f4ba1" name = "dosclient" version = "0.1" description = "" -category = "dev" optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -326,9 +678,11 @@ resolved_reference = "38c0f1ab42edf3efb1ad6348d7dbdff81b131360" name = "drsclient" version = "0.2.3" description = "GA4GH DRS Client" -category = "main" optional = false python-versions = ">=3.9,<4.0" +files = [ + {file = "drsclient-0.2.3.tar.gz", hash = "sha256:679061eacfb04f7fdccf709924f03b907af024481eb4c9ff123d87080cf4f344"}, +] [package.dependencies] asyncio = ">=3.4.3,<4.0.0" @@ -336,27 +690,91 @@ backoff = ">=1.10.0,<2.0.0" httpx = ">=0.23.0,<0.24.0" requests = ">=2.23.0,<3.0.0" +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "fastavro" -version = "1.5.4" +version = "1.8.4" description = "Fast read/write of AVRO files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "fastavro-1.8.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7afe1475e8a967c04e2b0ef4d33bc10bffa66b4fa6e08bd2ee9d91b6768cba2a"}, + {file = "fastavro-1.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5fd73609f3c1ac0d90ae3179d2fb9d788f842245db2656ff9225fce871fc5b7"}, + {file = "fastavro-1.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fdf1ba47e43146af72ac48d7b2247a06c4f2d95dfdaad6129c481014b07a6b"}, + {file = "fastavro-1.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d950542b3263653f00b695cbc728b5c60ab9ea6df32a7017ad9a6a67235386e7"}, + {file = "fastavro-1.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ce2ccfa9aff8df6da683c48542b7b2a216dde6d3a4d1c505c5e1b8ca2ec0abbb"}, + {file = "fastavro-1.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:f12f9914d6196695d3208ea348145a80d0defefe16b8a226373fe8ce68f66139"}, + {file = "fastavro-1.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d353aec9c000b96c33ad285651a2cba0f87fe50fcdecc6120689996af427194d"}, + {file = "fastavro-1.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eaed91d6e1fb06c172e0aaf4b1ca1fd019c3f4a481e314bf783a4c74f6b7015"}, + {file = "fastavro-1.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9293b303955acd34a6f69dd4ef3465bd575dbde0cd3e3f00227a0ba5012430b4"}, + {file = "fastavro-1.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b79baefd61554d9f03c4beaebbe638ef175d0efc1fb01f25e88ee6ae97985ab3"}, + {file = "fastavro-1.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:14d7cd3df019d41c66733b8bf5d983af9e1f601d4cb162853a49238a4087d6b0"}, + {file = "fastavro-1.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:c8fb27001b7023910969f15bee2c9205c4e9f40713929d6c1dca8f470fc8fc80"}, + {file = "fastavro-1.8.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e331229acef15f858d9863ced7b629ebef4bd5f80766d367255e51cbf44f8dab"}, + {file = "fastavro-1.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e26b3ba288bd423f25630a3b9bd70cc61b46c6f6161de35e398a6fc8f260f0"}, + {file = "fastavro-1.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6281f4555659ed658b195d1618a637504013e57b680d6cbad7c726e9a4e2cf0b"}, + {file = "fastavro-1.8.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3201880149e1fb807d616ab46b338a26788173a9f4e8a3396ae145e86af878a1"}, + {file = "fastavro-1.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:39771719fa04b8321eeebfb0813eaa2723c20e5bf570bcca3f53f1169099a0d7"}, + {file = "fastavro-1.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7095ae37a5c46dacb7ef430092e5f94650f576be281487b72050c1cf12e4ee20"}, + {file = "fastavro-1.8.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:eb76f5bfcde91cde240c93594dae47670cdf1a95d7e5d0dc3ccdef57c6c1c183"}, + {file = "fastavro-1.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71ebe1cf090f800ca7d4c64d50c81c2a88c56e6ef6aa5eb61ec425e7ae723617"}, + {file = "fastavro-1.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f0ef601943ea11cd02a59c57f5588cea3e300ac67608f53c904ec7aeddd232"}, + {file = "fastavro-1.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1060318f3ab31bcc4b2184cea3763305b773163381601e304000da81a2f7e11f"}, + {file = "fastavro-1.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01c8c7f22172174f2c2c0922801b552fbca75758f84b0ad3cd6f3e505a76ed05"}, + {file = "fastavro-1.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:bc8a1af80b8face4a41d8526a34b6474a874f7367a900d0b14752eacebb7a2b8"}, + {file = "fastavro-1.8.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:687a2f8fa83a76906c4ec35c9d0500e13a567fc631845f0e47646c48233c7725"}, + {file = "fastavro-1.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b921c63fcfb9149a32c40a9cd27b0e900fcda602455cbce4d773300019b9ce2"}, + {file = "fastavro-1.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2610a8683b10be7aaa532ddddbcb719883ee2d6f09dafd4a4a7b46d5d719fc07"}, + {file = "fastavro-1.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:94448dc749d098f846f6a6d82d59f85483bd6fcdecfb6234daac5f4494ae4156"}, + {file = "fastavro-1.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2d39c6b5db7014a3722a7d206310874430486f4895161911b6b6574cb1a6c48f"}, + {file = "fastavro-1.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:3b73472e8da33bcbf08ec989996637aea04eaca71058bb6d45def6fa4168f541"}, + {file = "fastavro-1.8.4.tar.gz", hash = "sha256:dae6118da27e81abf5957dc79a6d778888fc1bbf67645f52959cb2faba95beff"}, +] [package.extras] -codecs = ["python-snappy", "zstandard", "lz4"] +codecs = ["lz4", "python-snappy", "zstandard"] lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] +[[package]] +name = "fhirclient" +version = "4.1.0" +description = "A flexible client for FHIR servers supporting the SMART on FHIR protocol" +optional = true +python-versions = "*" +files = [ + {file = "fhirclient-4.1.0-py2.py3-none-any.whl", hash = "sha256:4f64f7967c9fe5f74cce068f29b0e5e4485848a73ec327765a8f3c188b9948a4"}, + {file = "fhirclient-4.1.0.tar.gz", hash = "sha256:fe9c92b3649a4d2829d91c40cd7765c6f729971d12d1dec39a7ee6e81f83384c"}, +] + +[package.dependencies] +isodate = "*" +requests = "*" + [[package]] name = "flask" version = "2.0.3" description = "A simple framework for building complex web applications." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "Flask-2.0.3-py3-none-any.whl", hash = "sha256:59da8a3170004800a2837844bfa84d49b022550616070f7cb1a659682b2e7c9f"}, + {file = "Flask-2.0.3.tar.gz", hash = "sha256:e1120c228ca2f553b470df4a5fa927ab66258467526069981b3eb0a91902687d"}, +] [package.dependencies] click = ">=7.1.2" @@ -370,32 +788,84 @@ dotenv = ["python-dotenv"] [[package]] name = "frozenlist" -version = "1.3.1" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false -python-versions = ">=3.7" - -[[package]] -name = "gdcdictionary" -version = "1.2.0" -description = "Gen3 generic data dictionary" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -dictionaryutils = "*" -jsonschema = ">=2.5.1" -PyYAML = ">=5.1,<6.0" +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"}, +] [[package]] name = "gen3authz" version = "1.5.1" description = "Gen3 authz client" -category = "dev" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "gen3authz-1.5.1-py3-none-any.whl", hash = "sha256:249ab21471e1ae3c283a30f3e32819db218aaa63d8d7151ac7b6b83496ac3518"}, + {file = "gen3authz-1.5.1.tar.gz", hash = "sha256:897f804a2f9d29181a6074fa14335fc9f18e757dd2e5dcec2a68bb9a008bfcb8"}, +] [package.dependencies] backoff = ">=1.6,<2.0" @@ -403,21 +873,54 @@ cdiserrors = "<2.0.0" httpx = ">=0.20.0,<1.0.0" six = ">=1.16.0,<2.0.0" +[[package]] +name = "gen3dictionary" +version = "2.0.3" +description = "" +optional = false +python-versions = ">=3.9,<4.0" +files = [ + {file = "gen3dictionary-2.0.3.tar.gz", hash = "sha256:46a704e202a79be96ec08969d28885794d4825b94394103dca08e3637bd6cb82"}, +] + +[package.dependencies] +dictionaryutils = "*" +jsonschema = "*" +PyYAML = "*" + +[[package]] +name = "gen3users" +version = "1.0.2" +description = "Utils for Gen3 Commons user management" +optional = false +python-versions = ">=3.9,<4.0" +files = [ + {file = "gen3users-1.0.2.tar.gz", hash = "sha256:642e249a10a36197dae257efcbf68f87f41be95f221db6b8fb3b688abb19a4b3"}, +] + +[package.dependencies] +cdislogging = ">=1,<2" +click = "*" +pyyaml = ">=6,<7" + [[package]] name = "h11" -version = "0.12.0" +version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false -python-versions = ">=3.6" +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 = "hsclient" version = "0.1" description = "" -category = "dev" optional = false python-versions = "*" +files = [] develop = false [package.dependencies] @@ -431,68 +934,100 @@ resolved_reference = "f122072ee245216da5e4260f718d6f886db81773" [[package]] name = "httpcore" -version = "0.15.0" +version = "0.16.3" description = "A minimal low-level HTTP client." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] [package.dependencies] -anyio = ">=3.0.0,<4.0.0" +anyio = ">=3.0,<5.0" certifi = "*" -h11 = ">=0.11,<0.13" -sniffio = ">=1.0.0,<2.0.0" +h11 = ">=0.13,<0.15" +sniffio = "==1.*" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "httpx" -version = "0.23.0" +version = "0.23.3" description = "The next generation HTTP client." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] [package.dependencies] certifi = "*" -httpcore = ">=0.15.0,<0.16.0" +httpcore = ">=0.15.0,<0.17.0" rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} sniffio = "*" [package.extras] -brotli = ["brotlicffi", "brotli"] -cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10,<13)", "pygments (>=2.0.0,<3.0.0)"] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "humanfriendly" version = "10.0" description = "Human friendly output for text interfaces using Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] [package.dependencies] pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["rst.linker", "sphinx"] +testing = ["importlib-resources (>=1.3)", "packaging", "pep517"] [[package]] name = "indexclient" -version = "2.1.0" +version = "2.2.1" description = "" -category = "main" optional = false python-versions = "*" +files = [ + {file = "indexclient-2.2.1.tar.gz", hash = "sha256:d0374128a340b42042fc2d7c2484a8b1f36b90e05199e6f8357ad764dd6673fd"}, +] [package.dependencies] requests = ">=2.5.2,<3.0.0" @@ -501,9 +1036,9 @@ requests = ">=2.5.2,<3.0.0" name = "indexd" version = "3.5.0" description = "Gen3 Indexing Service" -category = "dev" optional = false python-versions = "^3.9" +files = [] develop = false [package.dependencies] @@ -529,27 +1064,50 @@ resolved_reference = "119ff762f8432f29e1e29f86de432927fcc15d68" [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = true python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] + +[package.dependencies] +six = "*" [[package]] name = "itsdangerous" version = "2.1.2" description = "Safely pass data to untrusted environments and back." -category = "dev" 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 = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" 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"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -561,118 +1119,344 @@ i18n = ["Babel (>=2.7)"] name = "jsonschema" version = "3.2.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] [package.dependencies] attrs = ">=17.4.0" pyrsistent = ">=0.14.0" +setuptools = "*" six = ">=1.11.0" [package.extras] format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" +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-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.17.0" +version = "3.20.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false -python-versions = ">=3.7" +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 = ["pytest", "pytz", "simplejson", "mypy (==0.961)", "flake8 (==4.0.1)", "flake8-bugbear (==22.6.22)", "pre-commit (>=2.4,<3.0)", "tox"] -docs = ["sphinx (==4.5.0)", "sphinx-issues (==3.0.1)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.8)"] -lint = ["mypy (==0.961)", "flake8 (==4.0.1)", "flake8-bugbear (==22.6.22)", "pre-commit (>=2.4,<3.0)"] +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-enum" version = "1.5.1" description = "Enum field for Marshmallow" -category = "main" optional = false python-versions = "*" +files = [ + {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, + {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, +] [package.dependencies] marshmallow = ">=2.0.0" [[package]] name = "multidict" -version = "6.0.2" +version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" +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"}, +] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +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 = "numpy" -version = "1.23.1" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.8" +version = "1.26.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] [[package]] name = "packaging" -version = "21.3" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] [[package]] name = "pandas" -version = "1.4.3" +version = "2.1.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, + {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, + {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, + {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, + {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, + {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, + {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, + {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, + {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, + {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, + {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, +] [package.dependencies] numpy = [ - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, - {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, - {version = ">=1.18.5", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] -python-dateutil = ">=2.8.1" +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.1" [package.extras] -test = ["pytest-xdist (>=1.31)", "pytest (>=6.0)", "hypothesis (>=5.5.3)"] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -680,95 +1464,150 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "psycopg2" -version = "2.9.3" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, +] [[package]] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" 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 = "pyjwt" -version = "2.4.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] [package.dependencies] -cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""} - -[package.extras] -crypto = ["cryptography (>=3.3.1)"] -dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +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"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pypfb" -version = "0.5.0" +version = "0.5.27" description = "Python SDK for PFB format" -category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.9,<4" +files = [ + {file = "pypfb-0.5.27-py3-none-any.whl", hash = "sha256:91f11fdc5e7b51a3b38454af09176d13a578709e19de8e640715a791bfdefeb6"}, + {file = "pypfb-0.5.27.tar.gz", hash = "sha256:d83454c92cb80d09e78f6dc643545ef6e9d67323d348b1baa30b1ef6607fd03c"}, +] [package.dependencies] +aiohttp = ">=3.6.3,<4.0.0" click = ">=7.1.2,<8.0.0" -dictionaryutils = "<=3.0.2" -fastavro = ">=1.0.0,<2.0.0" -gdcdictionary = ">=1.2.0,<2.0.0" +dictionaryutils = ">=3.4.8,<4.0.0" +fastavro = ">=1.8.2,<1.9.0" +gen3 = ">=4.11.3,<5.0.0" +gen3dictionary = ">=2.0.3" +importlib_metadata = {version = ">=1.3.0,<2.0.0", markers = "python_full_version <= \"3.9.0\""} python-json-logger = ">=0.1.11,<0.2.0" -PyYAML = ">=5.3.1,<6.0.0" +PyYAML = ">=6.0.1,<7.0.0" [[package]] name = "pyreadline3" version = "3.4.1" description = "A python implementation of GNU readline." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] [[package]] name = "pyrsistent" -version = "0.18.1" +version = "0.20.0" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, + {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, + {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, + {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, + {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, + {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, + {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, +] [[package]] name = "pytest" version = "6.2.5" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -785,26 +1624,32 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-cov" -version = "3.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +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"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["virtualenv", "pytest-xdist", "six", "process-tests", "hunter", "fields"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -813,51 +1658,103 @@ six = ">=1.5" name = "python-json-logger" version = "0.1.11" description = "A python library adding a json log formatter" -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "python-json-logger-0.1.11.tar.gz", hash = "sha256:b7a31162f2a01965a5efb94453ce69230ed208468b0bbc7fdfc56e6d8df2e281"}, +] [[package]] name = "pytz" -version = "2022.1" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-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-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {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-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-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-mock" -version = "1.9.3" +version = "1.11.0" description = "Mock out responses from the requests package" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "requests-mock-1.11.0.tar.gz", hash = "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4"}, + {file = "requests_mock-1.11.0-py2.py3-none-any.whl", hash = "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15"}, +] [package.dependencies] requests = ">=2.3,<3" @@ -865,15 +1762,18 @@ six = "*" [package.extras] fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.18)", "testtools"] +test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] [[package]] name = "rfc3986" version = "1.5.0" description = "Validating URI References per RFC 3986" -category = "main" optional = false python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] [package.dependencies] idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} @@ -881,468 +1781,373 @@ idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} [package.extras] idna2008 = ["idna"] +[[package]] +name = "setuptools" +version = "69.0.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "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"] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sniffio" -version = "1.2.0" +version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false -python-versions = ">=3.5" +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"}, +] [[package]] name = "sqlalchemy" version = "1.3.24" description = "Database Abstraction Library" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, + {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, + {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, + {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, +] [package.extras] mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] mysql = ["mysqlclient"] oracle = ["cx-oracle"] postgresql = ["psycopg2"] -postgresql_pg8000 = ["pg8000 (<1.16.6)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] +postgresql-pg8000 = ["pg8000 (<1.16.6)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] [[package]] name = "sqlalchemy-utils" version = "0.37.9" description = "Various utility functions for SQLAlchemy." -category = "dev" optional = false python-versions = "~=3.4" +files = [ + {file = "SQLAlchemy-Utils-0.37.9.tar.gz", hash = "sha256:4667edbdcb1ece011076b69772ef524bfbb17cc97e03f11ee6b85d98e7741d61"}, + {file = "SQLAlchemy_Utils-0.37.9-py3-none-any.whl", hash = "sha256:bb6f4da8ac044cb0dd4d0278b1fb434141a5ee9d1881c757a076830ddbb04160"}, +] [package.dependencies] six = "*" SQLAlchemy = ">=1.0" [package.extras] -url = ["furl (>=0.4.1)"] -timezone = ["python-dateutil"] -test_all = ["backports.zoneinfo", "pytz (>=2014.2)", "python-dateutil (>=2.6)", "python-dateutil", "pytest (>=2.7.1)", "pyodbc", "pymysql", "psycopg2cffi (>=2.8.1)", "psycopg2 (>=2.5.1)", "phonenumbers (>=5.9.2)", "pg8000 (>=1.12.4)", "pendulum (>=2.0.5)", "passlib (>=1.6,<2.0)", "mock (==2.0.0)", "isort (>=4.2.2)", "intervals (>=0.7.1)", "furl (>=0.4.1)", "flexmock (>=0.9.7)", "flake8 (>=2.4.0)", "docutils (>=0.10)", "cryptography (>=0.6)", "colour (>=0.0.4)", "arrow (>=0.3.4)", "Pygments (>=1.2)", "Jinja2 (>=2.3)", "Babel (>=1.3)"] -test = ["backports.zoneinfo", "pyodbc", "isort (>=4.2.2)", "flake8 (>=2.4.0)", "pymysql", "python-dateutil (>=2.6)", "pytz (>=2014.2)", "pg8000 (>=1.12.4)", "psycopg2cffi (>=2.8.1)", "psycopg2 (>=2.5.1)", "mock (==2.0.0)", "flexmock (>=0.9.7)", "docutils (>=0.10)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "pytest (>=2.7.1)"] -phone = ["phonenumbers (>=5.9.2)"] -pendulum = ["pendulum (>=2.0.5)"] -password = ["passlib (>=1.6,<2.0)"] -intervals = ["intervals (>=0.7.1)"] -encrypted = ["cryptography (>=0.6)"] -color = ["colour (>=0.0.4)"] -babel = ["Babel (>=1.3)"] 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)", "mock (==2.0.0)", "pg8000 (>=1.12.4)", "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)", "mock (==2.0.0)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "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 = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tqdm" -version = "4.64.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -telegram = ["requests"] -slack = ["slack-sdk"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] -dev = ["wheel", "twine", "py-make (>=0.1.0)"] +slack = ["slack-sdk"] +telegram = ["requests"] [[package]] name = "typing-extensions" -version = "4.3.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] [[package]] name = "typing-inspect" -version = "0.7.1" +version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] [package.dependencies] mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "tzdata" +version = "2023.3" +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 = "urllib3" -version = "1.26.11" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -secure = ["ipaddress", "certifi", "idna (>=2.0.0)", "cryptography (>=1.3.4)", "pyOpenSSL (>=0.14)"] -brotli = ["brotlipy (>=0.6.0)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "werkzeug" -version = "2.2.2" +version = "2.3.8" description = "The comprehensive WSGI web application library." -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "werkzeug-2.3.8-py3-none-any.whl", hash = "sha256:bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748"}, + {file = "werkzeug-2.3.8.tar.gz", hash = "sha256:554b257c74bbeb7a0d254160a4f8ffe185243f52a52035060b761ca62d977f03"}, +] [package.dependencies] MarkupSafe = ">=2.1.1" [package.extras] -watchdog = ["watchdog"] +watchdog = ["watchdog (>=2.3)"] [[package]] name = "xmltodict" version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" -category = "dev" optional = false python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] [[package]] name = "yarl" -version = "1.8.1" +version = "1.9.3" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32435d134414e01d937cd9d6cc56e8413a8d4741dea36af5840c7750f04d16ab"}, + {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a5211de242754b5e612557bca701f39f8b1a9408dff73c6db623f22d20f470e"}, + {file = "yarl-1.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:525cd69eff44833b01f8ef39aa33a9cc53a99ff7f9d76a6ef6a9fb758f54d0ff"}, + {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc94441bcf9cb8c59f51f23193316afefbf3ff858460cb47b5758bf66a14d130"}, + {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e36021db54b8a0475805acc1d6c4bca5d9f52c3825ad29ae2d398a9d530ddb88"}, + {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0f17d1df951336a02afc8270c03c0c6e60d1f9996fcbd43a4ce6be81de0bd9d"}, + {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5f3faeb8100a43adf3e7925d556801d14b5816a0ac9e75e22948e787feec642"}, + {file = "yarl-1.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aed37db837ecb5962469fad448aaae0f0ee94ffce2062cf2eb9aed13328b5196"}, + {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:721ee3fc292f0d069a04016ef2c3a25595d48c5b8ddc6029be46f6158d129c92"}, + {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b8bc5b87a65a4e64bc83385c05145ea901b613d0d3a434d434b55511b6ab0067"}, + {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:dd952b9c64f3b21aedd09b8fe958e4931864dba69926d8a90c90d36ac4e28c9a"}, + {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c405d482c320a88ab53dcbd98d6d6f32ada074f2d965d6e9bf2d823158fa97de"}, + {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9df9a0d4c5624790a0dea2e02e3b1b3c69aed14bcb8650e19606d9df3719e87d"}, + {file = "yarl-1.9.3-cp310-cp310-win32.whl", hash = "sha256:d34c4f80956227f2686ddea5b3585e109c2733e2d4ef12eb1b8b4e84f09a2ab6"}, + {file = "yarl-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:cf7a4e8de7f1092829caef66fd90eaf3710bc5efd322a816d5677b7664893c93"}, + {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d61a0ca95503867d4d627517bcfdc28a8468c3f1b0b06c626f30dd759d3999fd"}, + {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73cc83f918b69110813a7d95024266072d987b903a623ecae673d1e71579d566"}, + {file = "yarl-1.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d81657b23e0edb84b37167e98aefb04ae16cbc5352770057893bd222cdc6e45f"}, + {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a1a8443091c7fbc17b84a0d9f38de34b8423b459fb853e6c8cdfab0eacf613"}, + {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe34befb8c765b8ce562f0200afda3578f8abb159c76de3ab354c80b72244c41"}, + {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c757f64afe53a422e45e3e399e1e3cf82b7a2f244796ce80d8ca53e16a49b9f"}, + {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a57b41a0920b9a220125081c1e191b88a4cdec13bf9d0649e382a822705c65"}, + {file = "yarl-1.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632c7aeb99df718765adf58eacb9acb9cbc555e075da849c1378ef4d18bf536a"}, + {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b0b8c06afcf2bac5a50b37f64efbde978b7f9dc88842ce9729c020dc71fae4ce"}, + {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1d93461e2cf76c4796355494f15ffcb50a3c198cc2d601ad8d6a96219a10c363"}, + {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4003f380dac50328c85e85416aca6985536812c082387255c35292cb4b41707e"}, + {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4d6d74a97e898c1c2df80339aa423234ad9ea2052f66366cef1e80448798c13d"}, + {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b61e64b06c3640feab73fa4ff9cb64bd8182de52e5dc13038e01cfe674ebc321"}, + {file = "yarl-1.9.3-cp311-cp311-win32.whl", hash = "sha256:29beac86f33d6c7ab1d79bd0213aa7aed2d2f555386856bb3056d5fdd9dab279"}, + {file = "yarl-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:f7271d6bd8838c49ba8ae647fc06469137e1c161a7ef97d778b72904d9b68696"}, + {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:dd318e6b75ca80bff0b22b302f83a8ee41c62b8ac662ddb49f67ec97e799885d"}, + {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4b1efb11a8acd13246ffb0bee888dd0e8eb057f8bf30112e3e21e421eb82d4a"}, + {file = "yarl-1.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f034386e5550b5dc8ded90b5e2ff7db21f0f5c7de37b6efc5dac046eb19c10"}, + {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd49a908cb6d387fc26acee8b7d9fcc9bbf8e1aca890c0b2fdfd706057546080"}, + {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa4643635f26052401750bd54db911b6342eb1a9ac3e74f0f8b58a25d61dfe41"}, + {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e741bd48e6a417bdfbae02e088f60018286d6c141639359fb8df017a3b69415a"}, + {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c86d0d0919952d05df880a1889a4f0aeb6868e98961c090e335671dea5c0361"}, + {file = "yarl-1.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d5434b34100b504aabae75f0622ebb85defffe7b64ad8f52b8b30ec6ef6e4b9"}, + {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79e1df60f7c2b148722fb6cafebffe1acd95fd8b5fd77795f56247edaf326752"}, + {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:44e91a669c43f03964f672c5a234ae0d7a4d49c9b85d1baa93dec28afa28ffbd"}, + {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3cfa4dbe17b2e6fca1414e9c3bcc216f6930cb18ea7646e7d0d52792ac196808"}, + {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:88d2c3cc4b2f46d1ba73d81c51ec0e486f59cc51165ea4f789677f91a303a9a7"}, + {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cccdc02e46d2bd7cb5f38f8cc3d9db0d24951abd082b2f242c9e9f59c0ab2af3"}, + {file = "yarl-1.9.3-cp312-cp312-win32.whl", hash = "sha256:96758e56dceb8a70f8a5cff1e452daaeff07d1cc9f11e9b0c951330f0a2396a7"}, + {file = "yarl-1.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:c4472fe53ebf541113e533971bd8c32728debc4c6d8cc177f2bff31d011ec17e"}, + {file = "yarl-1.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:126638ab961633f0940a06e1c9d59919003ef212a15869708dcb7305f91a6732"}, + {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99ddaddb2fbe04953b84d1651149a0d85214780e4d0ee824e610ab549d98d92"}, + {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dab30b21bd6fb17c3f4684868c7e6a9e8468078db00f599fb1c14e324b10fca"}, + {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:828235a2a169160ee73a2fcfb8a000709edf09d7511fccf203465c3d5acc59e4"}, + {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc391e3941045fd0987c77484b2799adffd08e4b6735c4ee5f054366a2e1551d"}, + {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51382c72dd5377861b573bd55dcf680df54cea84147c8648b15ac507fbef984d"}, + {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:28a108cb92ce6cf867690a962372996ca332d8cda0210c5ad487fe996e76b8bb"}, + {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8f18a7832ff85dfcd77871fe677b169b1bc60c021978c90c3bb14f727596e0ae"}, + {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:7eaf13af79950142ab2bbb8362f8d8d935be9aaf8df1df89c86c3231e4ff238a"}, + {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:66a6dbf6ca7d2db03cc61cafe1ee6be838ce0fbc97781881a22a58a7c5efef42"}, + {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a0a4f3aaa18580038cfa52a7183c8ffbbe7d727fe581300817efc1e96d1b0e9"}, + {file = "yarl-1.9.3-cp37-cp37m-win32.whl", hash = "sha256:946db4511b2d815979d733ac6a961f47e20a29c297be0d55b6d4b77ee4b298f6"}, + {file = "yarl-1.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2dad8166d41ebd1f76ce107cf6a31e39801aee3844a54a90af23278b072f1ccf"}, + {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bb72d2a94481e7dc7a0c522673db288f31849800d6ce2435317376a345728225"}, + {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9a172c3d5447b7da1680a1a2d6ecdf6f87a319d21d52729f45ec938a7006d5d8"}, + {file = "yarl-1.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2dc72e891672343b99db6d497024bf8b985537ad6c393359dc5227ef653b2f17"}, + {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8d51817cf4b8d545963ec65ff06c1b92e5765aa98831678d0e2240b6e9fd281"}, + {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53ec65f7eee8655bebb1f6f1607760d123c3c115a324b443df4f916383482a67"}, + {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cfd77e8e5cafba3fb584e0f4b935a59216f352b73d4987be3af51f43a862c403"}, + {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e73db54c967eb75037c178a54445c5a4e7461b5203b27c45ef656a81787c0c1b"}, + {file = "yarl-1.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09c19e5f4404574fcfb736efecf75844ffe8610606f3fccc35a1515b8b6712c4"}, + {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6280353940f7e5e2efaaabd686193e61351e966cc02f401761c4d87f48c89ea4"}, + {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c25ec06e4241e162f5d1f57c370f4078797ade95c9208bd0c60f484834f09c96"}, + {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7217234b10c64b52cc39a8d82550342ae2e45be34f5bff02b890b8c452eb48d7"}, + {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4ce77d289f8d40905c054b63f29851ecbfd026ef4ba5c371a158cfe6f623663e"}, + {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f74b015c99a5eac5ae589de27a1201418a5d9d460e89ccb3366015c6153e60a"}, + {file = "yarl-1.9.3-cp38-cp38-win32.whl", hash = "sha256:8a2538806be846ea25e90c28786136932ec385c7ff3bc1148e45125984783dc6"}, + {file = "yarl-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:6465d36381af057d0fab4e0f24ef0e80ba61f03fe43e6eeccbe0056e74aadc70"}, + {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2f3c8822bc8fb4a347a192dd6a28a25d7f0ea3262e826d7d4ef9cc99cd06d07e"}, + {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7831566595fe88ba17ea80e4b61c0eb599f84c85acaa14bf04dd90319a45b90"}, + {file = "yarl-1.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff34cb09a332832d1cf38acd0f604c068665192c6107a439a92abfd8acf90fe2"}, + {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe8080b4f25dfc44a86bedd14bc4f9d469dfc6456e6f3c5d9077e81a5fedfba7"}, + {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8535e111a064f3bdd94c0ed443105934d6f005adad68dd13ce50a488a0ad1bf3"}, + {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d155a092bf0ebf4a9f6f3b7a650dc5d9a5bbb585ef83a52ed36ba46f55cc39d"}, + {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:778df71c8d0c8c9f1b378624b26431ca80041660d7be7c3f724b2c7a6e65d0d6"}, + {file = "yarl-1.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f9cafaf031c34d95c1528c16b2fa07b710e6056b3c4e2e34e9317072da5d1a"}, + {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ca6b66f69e30f6e180d52f14d91ac854b8119553b524e0e28d5291a724f0f423"}, + {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0e7e83f31e23c5d00ff618045ddc5e916f9e613d33c5a5823bc0b0a0feb522f"}, + {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:af52725c7c39b0ee655befbbab5b9a1b209e01bb39128dce0db226a10014aacc"}, + {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0ab5baaea8450f4a3e241ef17e3d129b2143e38a685036b075976b9c415ea3eb"}, + {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d350388ba1129bc867c6af1cd17da2b197dff0d2801036d2d7d83c2d771a682"}, + {file = "yarl-1.9.3-cp39-cp39-win32.whl", hash = "sha256:e2a16ef5fa2382af83bef4a18c1b3bcb4284c4732906aa69422cf09df9c59f1f"}, + {file = "yarl-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:d92d897cb4b4bf915fbeb5e604c7911021a8456f0964f3b8ebbe7f9188b9eabb"}, + {file = "yarl-1.9.3-py3-none-any.whl", hash = "sha256:271d63396460b6607b588555ea27a1a02b717ca2e3f2cf53bdde4013d7790929"}, + {file = "yarl-1.9.3.tar.gz", hash = "sha256:4a14907b597ec55740f63e52d7fee0e9ee09d5b9d57a4f399a7423268e457b57"}, +] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "fd430f1365a6a395b3eeb90163c892925cfd21d22144862c2c612920fa2a58af" - -[metadata.files] -aiofiles = [] -aiohttp = [] -aiosignal = [] -anyio = [ - {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"}, - {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"}, -] -async-timeout = [] -asyncio = [] -atomicwrites = [] -attrs = [] -authlib = [ - {file = "Authlib-0.11-py2.py3-none-any.whl", hash = "sha256:3a226f231e962a16dd5f6fcf0c113235805ba206e294717a64fa8e04ae3ad9c4"}, - {file = "Authlib-0.11.tar.gz", hash = "sha256:9741db6de2950a0a5cefbdb72ec7ab12f7e9fd530ff47219f1530e79183cbaaf"}, -] -authutils = [ - {file = "authutils-6.2.1-py3-none-any.whl", hash = "sha256:57575520e7c8215ac730a16d2eed06018b7be43c4056c5f3df6ac1b9b9119166"}, - {file = "authutils-6.2.1.tar.gz", hash = "sha256:329679dd20e1251209a44b8b7b2f7f5598d2a2ef73497310fd79968554da36e6"}, -] -backoff = [ - {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, - {file = "backoff-1.11.1.tar.gz", hash = "sha256:ccb962a2378418c667b3c979b504fdeb7d9e0d29c0579e3b13b86467177728cb"}, -] -cached-property = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] -cdiserrors = [ - {file = "cdiserrors-1.0.0-py3-none-any.whl", hash = "sha256:2e188645832e8c98468267af3e54bc5d3a298078b9869899256251e54dc1599d"}, - {file = "cdiserrors-1.0.0.tar.gz", hash = "sha256:d6e56b0a9f6cc0104f4344f837b735fefb2caf8d0c4ef50569881dc140ebfc4a"}, -] -cdislogging = [ - {file = "cdislogging-1.1.1.tar.gz", hash = "sha256:77e11648244cda3a8094b8ae6081435a2303f259612846c49ef8825c7be141e3"}, -] -cdisutilstest = [] -certifi = [ - {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, - {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, -] -cffi = [] -charset-normalizer = [ - {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, - {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, -] -click = [] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -coverage = [] -cryptography = [] -dataclasses-json = [] -dictionaryutils = [] -doiclient = [] -dosclient = [] -drsclient = [] -fastavro = [] -flask = [] -frozenlist = [] -gdcdictionary = [] -gen3authz = [ - {file = "gen3authz-1.5.1-py3-none-any.whl", hash = "sha256:249ab21471e1ae3c283a30f3e32819db218aaa63d8d7151ac7b6b83496ac3518"}, - {file = "gen3authz-1.5.1.tar.gz", hash = "sha256:897f804a2f9d29181a6074fa14335fc9f18e757dd2e5dcec2a68bb9a008bfcb8"}, -] -h11 = [ - {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, - {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, -] -hsclient = [] -httpcore = [ - {file = "httpcore-0.15.0-py3-none-any.whl", hash = "sha256:1105b8b73c025f23ff7c36468e4432226cbb959176eab66864b8e31c4ee27fa6"}, - {file = "httpcore-0.15.0.tar.gz", hash = "sha256:18b68ab86a3ccf3e7dc0f43598eaddcf472b602aba29f9aa6ab85fe2ada3980b"}, -] -httpx = [ - {file = "httpx-0.23.0-py3-none-any.whl", hash = "sha256:42974f577483e1e932c3cdc3cd2303e883cbfba17fe228b0f63589764d7b9c4b"}, - {file = "httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef"}, -] -humanfriendly = [] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -indexclient = [] -indexd = [] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -itsdangerous = [] -jinja2 = [] -jsonschema = [] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -marshmallow = [] -marshmallow-enum = [] -multidict = [] -mypy-extensions = [] -numpy = [] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -psycopg2 = [] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pyjwt = [ - {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, - {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pypfb = [] -pyreadline3 = [] -pyrsistent = [ - {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, - {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, - {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, - {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-cov = [] -python-dateutil = [] -python-json-logger = [] -pytz = [] -pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-mock = [] -rfc3986 = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sniffio = [ - {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, - {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, - {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, -] -sqlalchemy-utils = [] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [] -tqdm = [] -typing-extensions = [] -typing-inspect = [] -urllib3 = [] -werkzeug = [] -xmltodict = [ - {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, - {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +[[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"}, ] -yarl = [] + +[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"] + +[extras] +fhir = ["fhirclient"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9, <4" +content-hash = "4f98d7b275b6768c5600b244c6051ce255dfcdd7e80767995f84b2e97241c353" diff --git a/pyproject.toml b/pyproject.toml index b06ad98cd..1e6405991 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "gen3" homepage = "https://gen3.org/" -version = "4.13.0" +version = "4.22.2" description = "Gen3 CLI and Python SDK" authors = ["Center for Translational Data Science at the University of Chicago "] license = "Apache-2.0" @@ -18,7 +18,7 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.9" +python = ">=3.9, <4" requests = "*" indexclient = "*" drsclient = "^0.2.2" @@ -27,14 +27,26 @@ backoff = "*" cdislogging = "^1.1.0" click = "*" jsonschema = "*" -dataclasses-json = "*" -pypfb = "<1.0.0" +# FIXME updating to >=0.6.0 breaks a few tests +dataclasses-json = "<=0.5.9" +pypfb = ">=0.5.27" tqdm = "^4.61.2" humanfriendly ="*" python-dateutil = "*" aiofiles = "^0.8.0" -pandas = "^1.4.2" +pandas = ">=1.4.2" +urllib3 = ">2.0.0" httpx = "*" +xmltodict = "^0.13.0" +pyyaml = ">=6.0.1" +gen3users = "*" + +# A list of all of the optional dependencies, some of which are included in the +# below `extras`. They can be opted into by apps. +fhirclient = { version = "*", optional = true } + +[tool.poetry.extras] +fhir = ["fhirclient"] [tool.poetry.dev-dependencies] pytest = "^6.0.0" @@ -42,14 +54,17 @@ pytest-cov = "*" requests-mock = "*" cdisutilstest = { git = "https://github.com/uc-cdis/cdisutils-test.git", tag = "1.0.0" } indexd = { git = "https://github.com/uc-cdis/indexd.git", tag = "3.5.0" } +# indexd has a version of flask that doesn't specify the werkzeug version, so we get +# 3.0.0 which breaks things. Force sub-dep version here for now +werkzeug = "<3.0.0" [tool.poetry.scripts] -gen3 = 'gen3.cli.__main__:main' +gen3 = "gen3.cli.__main__:main" [tool.poetry.plugins."gen3.plugins"] [build-system] -requires = ["poetry>=0.12"] +requires = ["poetry>=1.4.1"] build-backend = "poetry.masonry.api" [tool.pytest.ini_options] diff --git a/tests/conftest.py b/tests/conftest.py index 230d2a5a8..ddcd0fb9f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,6 +13,7 @@ clear_database, create_user, ) +from gen3.cli.auth import endpoint from indexd import get_app from indexd.default_settings import settings @@ -34,6 +35,9 @@ def __init__(self): self.refresh_token = {"api_key": "123"} self._token_info = {"sub": "42"} + def _get_auth_value(self): + return "foobar" + @property def __class__(self): """ diff --git a/tests/download_tests/test_async_download.py b/tests/download_tests/test_async_download.py new file mode 100644 index 000000000..f42442b3b --- /dev/null +++ b/tests/download_tests/test_async_download.py @@ -0,0 +1,266 @@ +from unittest.mock import patch +import json +import pytest +from pathlib import Path +import os +import shutil +from types import SimpleNamespace as Namespace + +from gen3.file import Gen3File +from gen3.utils import get_or_create_event_loop_for_thread + + +DIR = Path(__file__).resolve().parent +NO_DOWNLOAD_ACCESS_MESSAGE = """ +You do not have access to download data. +You need read permissions on the files specified in the manifest provided +""" + + +def _load_manifest(manifest_file_path): + + """ + Function to convert manifest to python objects, stored in a list. + + Args: + manifest_file_path (str): path to the manifest file. The manifest should be a JSON file + in the following format: + [ + { "object_id": "", "file_name"(optional): "" }, + ... + ] + + Returns: + List of objects + """ + + def dict_to_entry(d): + """ + Ensure the expected keys are in each manifest entry + """ + if not d.get("object_id"): + raise Exception(f"Manifest entry missing 'object_id': {d}") + if "file_name" not in d: + d["file_name"] = None + return Namespace(**d) + + try: + with open(manifest_file_path, "rt") as f: + data = json.load(f, object_hook=dict_to_entry) + return data + + except Exception as e: + print(f"Error in load manifest: {e}") + return None + + +# function to create temporary directory to download test files in +@pytest.fixture +def download_dir(tmpdir_factory): + path = tmpdir_factory.mktemp("async_download") + return path + + +# function to download test files +@pytest.fixture +def download_test_files(): + data = {} + with open(Path(DIR, "resources/download_test_data.json")) as fin: + data = json.load(fin) + for item in data.values(): + item["content_length"] = str(len(item["content"])) + return data + + +class Test_Async_Download: + """ + Class containing all test cases for `Gen3File.download_single` + """ + + manifest_file_path = Path(DIR, "resources/manifest_test_1.json") + + def iter_content( + chunk_size=4096, + content="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloreeu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.", + ): + rest = content + while rest: + chunk = rest[:chunk_size] + rest = rest[chunk_size:] + return chunk.encode("utf-8") + + def test_load_manifest(self, mock_gen3_auth): + """ + Testing the load_manifest function, which converts the manifest provided to list of python objects + Test passes if number of python objects created is equal to number of files specified in manifest + """ + manifest_list = _load_manifest(self.manifest_file_path) + f = open(self.manifest_file_path) + data = json.load(f) + assert len(data) == len(manifest_list) + + @patch("gen3.file.requests") + @patch("gen3.index.Gen3Index.get_record") + @pytest.mark.parametrize("download_dir_overwrite", [None, "sub/path"]) + def test_download_single( + self, + mock_index, + mock_get, + download_dir, + download_dir_overwrite, + download_test_files, + mock_gen3_auth, + ): + """ + Testing the download functionality (function - download_single) in manifest_downloader by comparing file + content of file to be downloaded and download performed by download_single + + Also checks if download_single function returns True; function returns true when + response content-length is equal to number of bytes downloaded + + Includes a test for downloading to a sub-directory that does not exist yet. + """ + file_tool = Gen3File(mock_gen3_auth) + download_path = ( + os.path.join(DIR, download_dir_overwrite) + if download_dir_overwrite + else download_dir + ) + + content = { + "file_name": "TestDataSet1.json", + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloreeu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.", + } + + mock_get.get().iter_content = lambda size: [ + Test_Async_Download.iter_content( + chunk_size=size, content=content["content"] + ) + ] + + file_tool.manifest_file_path = self.manifest_file_path + manifest_list = _load_manifest(self.manifest_file_path) + mock_get.get().status_code = 200 + file_tool._auth_provider._refresh_token = {"api_key": "123"} + mock_get.get().headers = {"content-length": str(len(content["content"]))} + mock_index.return_value = {"file_name": "TestDataSet1.sav"} + + result = file_tool.download_single(manifest_list[0].object_id, download_path) + + try: + with open( + os.path.join(DIR, download_path, (manifest_list[0].file_name)), "r" + ) as fin: + + assert ( + fin.read() + == download_test_files[ + "dg.XXTS/b96018c5-db06-4af8-a195-28e339ba815e" + ]["content"] + ) + + assert result == True + finally: + if download_dir_overwrite and os.path.exists(download_path): + shutil.rmtree(download_path) + + @patch("gen3.file.requests") + def test_download_single_no_auth(self, mock_get, download_dir, mock_gen3_auth): + + """ + Testing how download_single function reacts when it is given no authorisation details + Request(url) should return status_code = 403 and download function should return False + """ + file_tool = Gen3File(mock_gen3_auth) + + content = { + "file_name": "TestDataSet1.json", + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloreeu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.", + } + + mock_get.get().content.iter_content = lambda size: [ + Test_Async_Download.iter_content( + chunk_size=size, content=content["content"] + ) + ] + + file_tool.manifest_file_path = self.manifest_file_path + manifest_list = _load_manifest(self.manifest_file_path) + mock_get.get().status_code = 403 + file_tool._auth_provider._refresh_token = None + mock_get.get().headers = {"content-length": str(len(content["content"]))} + + result = file_tool.download_single(manifest_list[0].object_id, download_dir) + + assert result == False + + @patch("gen3.file.requests") + def test_download_single_wrong_auth(self, mock_get, download_dir, mock_gen3_auth): + + """ + Testing how download_single function reacts when it is given wrong authorisation details + Request(url) should return status_code = 403 and download function should return False + """ + file_tool = Gen3File(mock_gen3_auth) + + content = { + "file_name": "TestDataSet1.json", + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloreeu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.", + } + + mock_get.get().content.iter_content = lambda size: [ + Test_Async_Download.iter_content( + chunk_size=size, content=content["content"] + ) + ] + + file_tool.manifest_file_path = self.manifest_file_path + manifest_list = _load_manifest(self.manifest_file_path) + mock_get.get().status_code = 403 + file_tool._auth_provider._refresh_token = {"api_key": "wrong_auth"} + mock_get.get().headers = {"content-length": str(len(content["content"]))} + + result = file_tool.download_single(manifest_list[0].object_id, download_dir) + + assert result == False + + @patch("gen3.file.requests") + def test_download_single_bad_id(self, mock_get, download_dir, mock_gen3_auth): + + """ + Testing how download_single function reacts when it is given a manifest with bad id + Request(url) should return status_code = 404 (File not found) and download function should return False + """ + file_tool = Gen3File(mock_gen3_auth) + + content = { + "file_name": "TestDataSet1.json", + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloreeu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.", + } + + mock_get.get().content.iter_content = lambda size: [ + Test_Async_Download.iter_content( + chunk_size=size, content=content["content"] + ) + ] + + file_tool.manifest_file_path = Path(DIR, "resources/manifest_test_bad_id.json") + + manifest_list = _load_manifest(self.manifest_file_path) + mock_get.get().status_code = 404 + file_tool._auth_provider._refresh_token = {"api_key": "123"} + mock_get.get().headers = {"content-length": str(len(content["content"]))} + + result = file_tool.download_single(manifest_list[0].object_id, download_dir) + + assert result == False + + def test_load_manifest_bad_format(self): + + """ + Testing how load_manifest function reacts when it is given a manifest with bad format as input + Function should not load the manifest and should return an empty manifest_list + """ + + manifest_list = _load_manifest(Path(DIR, "resources/bad_format.json")) + assert manifest_list == None diff --git a/tests/download_tests/test_download.py b/tests/download_tests/test_download.py index 6918acc92..9b08d7cff 100644 --- a/tests/download_tests/test_download.py +++ b/tests/download_tests/test_download.py @@ -287,7 +287,6 @@ def test_get_external_wts_oidc(wts_oidc, hostname): def test_download_file_from_url_failures(download_dir): with requests_mock.Mocker() as m: - m.get( url=f"https://test.commons1.io/ga4gh/drs/v1/objects/blah/access/s3", headers={"content-length": "10"}, @@ -536,7 +535,7 @@ def test_download_objects( results = _download_obj( hostname, auth, - "dg.XXTS/b96018c5-db06-4af8-a195-28e339ba815e", + ["dg.XXTS/b96018c5-db06-4af8-a195-28e339ba815e"], download_dir.join("_download_obj"), ) for id, item in results.items(): @@ -640,7 +639,7 @@ def test_download_objects( results = _download_obj( hostname, auth, - "dg.XXTS/b96018c5-db06-4af8-a195-28e339ba815e", + ["dg.XXTS/b96018c5-db06-4af8-a195-28e339ba815e"], download_dir.join("_download_obj"), ) assert results is None @@ -844,7 +843,6 @@ def test_list_no_auth( manifest_file, expected, ): - test_key = { "api_key": "whatever." # pragma: allowlist secret + base64.urlsafe_b64encode( @@ -899,7 +897,6 @@ def test_unpackage_objects( download_test_files, hostname, ): - exp = time.time() + 300 test_key = { "api_key": "whatever." # pragma: allowlist secret diff --git a/tests/merge_manifests/discovery_combine/combined_discovery_metadata.tsv b/tests/merge_manifests/discovery_combine/combined_discovery_metadata.tsv new file mode 100644 index 000000000..dfa046fac --- /dev/null +++ b/tests/merge_manifests/discovery_combine/combined_discovery_metadata.tsv @@ -0,0 +1,6 @@ +guid __manifest _subjects_count authz code dbgap_accession dbgap_consent dbgap_consent_text dbgap_participant_set dbgap_phs dbgap_url dbgap_version full_name name null project_id released short_name study_description study_id _tag_0 _tag_1 _tag_2 _tag_3 _tag_4 DBGAP_FHIR_Category DBGAP_FHIR_Citers DBGAP_FHIR_Condition DBGAP_FHIR_Description DBGAP_FHIR_Disclaimer DBGAP_FHIR_Enrollment DBGAP_FHIR_Focus DBGAP_FHIR_Id DBGAP_FHIR_Identifier DBGAP_FHIR_Keyword DBGAP_FHIR_NumAnalyses DBGAP_FHIR_NumDocuments DBGAP_FHIR_NumMolecularDatasets DBGAP_FHIR_NumPhenotypeDatasets DBGAP_FHIR_NumSamples DBGAP_FHIR_NumSubStudies DBGAP_FHIR_NumSubjects DBGAP_FHIR_NumVariables DBGAP_FHIR_ReleaseDate DBGAP_FHIR_ResearchStudyURL DBGAP_FHIR_ResourceType DBGAP_FHIR_Sponsor DBGAP_FHIR_Status DBGAP_FHIR_StudyConsents DBGAP_FHIR_StudyOverviewUrl DBGAP_FHIR_Title +phs000007.v31.p12.c1 /programs/parent/projects/FHS_HMB-IRB-MDS_ FHS_HMB-IRB-MDS_ phs000007.v31.p12.c1 c1 HMB-IRB-MDS p12 phs000007 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 v31 Framingham Cohort FHS_HMB-IRB-MDS_ parent-FHS_HMB-IRB-MDS_ Yes FHS See Grouping of Framingham Phenotype Datasets Startup of Framingham Heart Study. Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic. The objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke. Design of Framingham Heart Study. In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University. Research Areas in the Framingham Heart Study. Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice. In addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases. Genetic Research in the Framingham Heart Study. While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip. Framingham Cohort Phenotype Data. The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. The Framingham Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. phs000342 Framingham SHARe phs000282 Framingham CARe phs000363 Framingham SABRe phs000307 Framingham Medical Resequencing phs000401 Framingham ESP Heart-GO phs000651 Framingham CHARGE-S phs000724 Framingham DNA Methylation phs001610 Framingham T2D-GENES The unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come. Study Weblinks: The Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 on 2021-03-25 and may not include exact formatting or images. phs000007.v31.p12.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP Prospective Longitudinal Cohort [{"Title": "Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk", "Url": "h"}, {"Title": "The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity", "Url": "h"}, {"Title": "Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort", "Url": "h"}, {"Title": "Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1", "Url": "h"}, {"Title": "Evaluating prognostic accuracy of biomarkers in nested case\\u00e2\\u0080\\u0093control studies", "Url": "h"}, {"Title": "Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Knowledge-Driven Analysis Identifies a Gene\\u00e2\\u0080\\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations", "Url": "h"}, {"Title": "Family-Based Association Studies for Next-Generation Sequencing", "Url": "h"}, {"Title": "Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study", "Url": "h"}, {"Title": "Prediction of Expected Years of Life Using Whole-Genome Markers", "Url": "h"}, {"Title": "Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality", "Url": "h"}, {"Title": "How Genes Influence Life Span: The Biodemography of Human Survival", "Url": "h"}, {"Title": "d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes", "Url": "h"}, {"Title": "Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans", "Url": "h"}, {"Title": "Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study", "Url": "h"}, {"Title": "Obesity\\u00e2\\u0080\\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice", "Url": "h"}, {"Title": "Genomics of human health and aging", "Url": "h"}, {"Title": "Inter-chromosomal level of genome organization and longevity-related phenotypes in humans", "Url": "h"}, {"Title": "The role of lipid-related genes, aging-related processes, and environment in healthspan", "Url": "h"}, {"Title": "A family-based joint test for mean and variance heterogeneity for quantitative traits", "Url": "h"}, {"Title": "A Systematic Heritability Analysis of the Human Whole Blood Transcriptome", "Url": "h"}, {"Title": "Assessment of Whole-Genome Regression for Type II Diabetes", "Url": "h"}, {"Title": "Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease", "Url": "h"}, {"Title": "The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits", "Url": "h"}, {"Title": "Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes", "Url": "h"}, {"Title": "Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies", "Url": "h"}, {"Title": "Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies", "Url": "h"}, {"Title": "Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease", "Url": "h"}, {"Title": "Genomic prediction of coronary heart disease", "Url": "h"}, {"Title": "KLB is associated with alcohol drinking, and its gene product \\u00c3\\u009f-Klotho is necessary for FGF21 regulation of alcohol preference", "Url": "h"}, {"Title": "Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits", "Url": "h"}, {"Title": "Using information of relatives in genomic prediction to apply effective stratified medicine", "Url": "h"}, {"Title": "Metabolomic profiles as reliable biomarkers of dietary composition", "Url": "h"}, {"Title": "Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies", "Url": "h"}, {"Title": "Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes", "Url": "h"}, {"Title": "Structural variants caused by Alu insertions are associated with risks for many human diseases", "Url": "h"}, {"Title": "An Exploration of Gene-Gene Interactions and Their Effects on Hypertension", "Url": "h"}, {"Title": "Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits", "Url": "h"}, {"Title": "Cytosolic proteome profiling of monocytes for male osteoporosis", "Url": "h"}, {"Title": "Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets", "Url": "h"}, {"Title": "Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "rqt: an R package for gene-level meta-analysis", "Url": "h"}, {"Title": "Strong impact of natural-selection\\u00e2\\u0080\\u0093free heterogeneity in genetics of age-related phenotypes", "Url": "h"}, {"Title": "Apolipoprotein E region molecular signatures of Alzheimer's disease", "Url": "h"}, {"Title": "The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study", "Url": "h"}, {"Title": "Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease", "Url": "h"}, {"Title": "Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms", "Url": "h"}, {"Title": "Genetic heterogeneity of Alzheimer\\u00e2\\u0080\\u0099s disease in subjects with and without hypertension", "Url": "h"}, {"Title": "The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports", "Url": "h"}, {"Title": "A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study", "Url": "h"}, {"Title": "Final Draft Status of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study", "Url": "h"}, {"Title": "SLEEP MEDICINE NEWS AND UPDATES", "Url": "h"}, {"Title": "Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study", "Url": "h"}, {"Title": "Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index", "Url": "h"}, {"Title": "GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA", "Url": "h"}, {"Title": "A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project", "Url": "h"}, {"Title": "Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009", "Url": "h"}, {"Title": "Current Perceptions of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Consent for Genetic Research in the Framingham Heart Study", "Url": "h"}, {"Title": "Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women", "Url": "h"}, {"Title": "Genetics of the Framingham Heart Study Population", "Url": "h"}, {"Title": "Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience", "Url": "h"}, {"Title": "Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?", "Url": "h"}, {"Title": "Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years", "Url": "h"}, {"Title": "Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study", "Url": "h"}, {"Title": "Heritability of pulmonary function estimated from pedigree and whole-genome markers", "Url": "h"}, {"Title": "Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction", "Url": "h"}, {"Title": "Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations", "Url": "h"}, {"Title": "Phenotypic extremes in rare variant study designs", "Url": "h"}, {"Title": "Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology", "Url": "h"}, {"Title": "Genome-wide association study of subclinical interstitial lung disease in MESA", "Url": "h"}, {"Title": "Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models", "Url": "h"}, {"Title": "A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking", "Url": "h"}, {"Title": "Protein Biomarkers of Cardiovascular Disease and Mortality in the Community", "Url": "h"}, {"Title": "Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes", "Url": "h"}, {"Title": "Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study", "Url": "h"}, {"Title": "Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\\u00e2\\u0080\\u0094The Framingham Heart Study", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis", "Url": "h"}, {"Title": "Whole-genome association study identifies STK39 as a hypertension susceptibility gene", "Url": "h"}, {"Title": "Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups", "Url": "h"}, {"Title": "Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15", "Url": "h"}, {"Title": "Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males", "Url": "h"}, {"Title": "Genetic Analysis of Variation in Human Meiotic Recombination", "Url": "h"}, {"Title": "Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway", "Url": "h"}, {"Title": "New Lesions Detected by Single Nucleotide Polymorphism Array\\u00e2\\u0080\\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia", "Url": "h"}, {"Title": "ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals", "Url": "h"}, {"Title": "Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis", "Url": "h"}, {"Title": "Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study", "Url": "h"}, {"Title": "Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "GWAF: an R package for genome-wide association analyses with family data", "Url": "h"}, {"Title": "Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data", "Url": "h"}, {"Title": "Natural selection in a contemporary human population", "Url": "h"}, {"Title": "Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology", "Url": "h"}, {"Title": "Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height", "Url": "h"}, {"Title": "A PCA-based method for ancestral informative markers selection in structured populations", "Url": "h"}, {"Title": "HMGA2 Is Confirmed To Be Associated with Human Adult Height", "Url": "h"}, {"Title": "Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies", "Url": "h"}, {"Title": "Joint influence of small-effect genetic variants on human longevity", "Url": "h"}, {"Title": "Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study", "Url": "h"}, {"Title": "A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study", "Url": "h"}, {"Title": "Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\\u00e2\\u0080\\u0099s disease risk loci and reveals interactions with APOE genotypes", "Url": "h"}, {"Title": "Beyond Missing Heritability: Prediction of Complex Traits", "Url": "h"}, {"Title": "Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests", "Url": "h"}, {"Title": "SNP array\\u00e2\\u0080\\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes", "Url": "h"}, {"Title": "Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women", "Url": "h"}, {"Title": "IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study", "Url": "h"}, {"Title": "Genome-Wide Association Study for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study", "Url": "h"}, {"Title": "Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD", "Url": "h"}, {"Title": "Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts", "Url": "h"}, {"Title": "Atrial natriuretic peptide is negatively regulated by microRNA-425", "Url": "h"}, {"Title": "A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension", "Url": "h"}, {"Title": "Genome-wide Identification of microRNA Expression Quantitative Trait Loci", "Url": "h"}, {"Title": "Subgroup specific incremental value of new markers for risk prediction", "Url": "h"}, {"Title": "Gene Expression Signatures of Coronary Heart Disease", "Url": "h"}, {"Title": "Evaluating incremental values from new predictors with net reclassification improvement in survival analysis", "Url": "h"}, {"Title": "Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design", "Url": "h"}, {"Title": "Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study", "Url": "h"}, {"Title": "Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity", "Url": "h"}, {"Title": "Resampling Procedures for Making Inference under Nested Case-control Studies", "Url": "h"}, {"Title": "Adopting nested case\\u00e2\\u0080\\u0093control quota sampling designs for the evaluation of risk markers", "Url": "h"}, {"Title": "Multistage genome-wide association meta-analyses identified two new loci for bone mineral density", "Url": "h"}, {"Title": "Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development", "Url": "h"}, {"Title": "Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates", "Url": "h"}, {"Title": "Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations", "Url": "h"}, {"Title": "Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics", "Url": "h"}, {"Title": "The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets", "Url": "h"}, {"Title": "Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis", "Url": "h"}, {"Title": "FTO association and interaction with time spent sitting", "Url": "h"}, {"Title": "Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene", "Url": "h"}, {"Title": "Understanding multicellular function and disease with human tissue-specific networks", "Url": "h"}, {"Title": "Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants", "Url": "h"}, {"Title": "Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1", "Url": "h"}, {"Title": "GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium", "Url": "h"}, {"Title": "Identification of polymorphisms in cancer patients that differentially affect survival with age", "Url": "h"}, {"Title": "Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship", "Url": "h"}, {"Title": "Integrative network analysis reveals molecular mechanisms of blood pressure regulation", "Url": "h"}, {"Title": "Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes", "Url": "h"}, {"Title": "Diverse human extracellular RNAs are widely detected in human plasma", "Url": "h"}, {"Title": "An exome array study of the plasma metabolome", "Url": "h"}, {"Title": "Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors", "Url": "h"}, {"Title": "Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population", "Url": "h"}, {"Title": "Genetic architecture of gene expression traits across diverse populations", "Url": "h"}, {"Title": "Pathway-based analysis of genome-wide association study of circadian phenotypes", "Url": "h"}, {"Title": "Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function", "Url": "h"}, {"Title": "Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis", "Url": "h"}, {"Title": "Genome-wide analysis of genetic predisposition to Alzheimer\\u00e2\\u0080\\u0099s disease and related sex disparities", "Url": "h"}, {"Title": "Independent associations of TOMM40 and APOE variants with body mass index", "Url": "h"}, {"Title": "Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries", "Url": "h"}, {"Title": "Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)", "Url": "h"}, {"Title": "Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes", "Url": "h"}, {"Title": "An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction", "Url": "h"}, {"Title": "Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density", "Url": "h"}, {"Title": "The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees", "Url": "h"}, {"Title": "Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups", "Url": "h"}, {"Title": "Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid", "Url": "h"}, {"Title": "Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci", "Url": "h"}, {"Title": "Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\\u00e2\\u0080\\u0099s Disease", "Url": "h"}, {"Title": "Integrative analysis of multiple diverse omics datasets by sparse group multitask regression", "Url": "h"}, {"Title": "Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles", "Url": "h"}, {"Title": "Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases", "Url": "h"}, {"Title": "Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality", "Url": "h"}] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] \\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\\n\\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\\n\\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\\n\\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\\n\\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\\n\\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\\n\\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. \\n\\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \\n\\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 ["phs000007.v32.p13"] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB-IRB-MDS", "HMB-IRB-NPU-MDS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort +phs000007.v31.p12.c2 /programs/parent/projects/FHS_HMB-IRB-NPU-MDS_ FHS_HMB-IRB-NPU-MDS_ phs000007.v31.p12.c2 c2 HMB-IRB-NPU-MDS p12 phs000007 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 v31 Framingham Cohort FHS_HMB-IRB-NPU-MDS_ parent-FHS_HMB-IRB-NPU-MDS_ Yes FHS See Grouping of Framingham Phenotype Datasets Startup of Framingham Heart Study. Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic. The objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke. Design of Framingham Heart Study. In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University. Research Areas in the Framingham Heart Study. Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice. In addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases. Genetic Research in the Framingham Heart Study. While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip. Framingham Cohort Phenotype Data. The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. The Framingham Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. phs000342 Framingham SHARe phs000282 Framingham CARe phs000363 Framingham SABRe phs000307 Framingham Medical Resequencing phs000401 Framingham ESP Heart-GO phs000651 Framingham CHARGE-S phs000724 Framingham DNA Methylation phs001610 Framingham T2D-GENES The unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come. Study Weblinks: The Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 on 2021-03-25 and may not include exact formatting or images. phs000007.v31.p12.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP Prospective Longitudinal Cohort [{"Title": "Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk", "Url": "h"}, {"Title": "The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity", "Url": "h"}, {"Title": "Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort", "Url": "h"}, {"Title": "Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1", "Url": "h"}, {"Title": "Evaluating prognostic accuracy of biomarkers in nested case\\u00e2\\u0080\\u0093control studies", "Url": "h"}, {"Title": "Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Knowledge-Driven Analysis Identifies a Gene\\u00e2\\u0080\\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations", "Url": "h"}, {"Title": "Family-Based Association Studies for Next-Generation Sequencing", "Url": "h"}, {"Title": "Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study", "Url": "h"}, {"Title": "Prediction of Expected Years of Life Using Whole-Genome Markers", "Url": "h"}, {"Title": "Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality", "Url": "h"}, {"Title": "How Genes Influence Life Span: The Biodemography of Human Survival", "Url": "h"}, {"Title": "d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes", "Url": "h"}, {"Title": "Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans", "Url": "h"}, {"Title": "Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study", "Url": "h"}, {"Title": "Obesity\\u00e2\\u0080\\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice", "Url": "h"}, {"Title": "Genomics of human health and aging", "Url": "h"}, {"Title": "Inter-chromosomal level of genome organization and longevity-related phenotypes in humans", "Url": "h"}, {"Title": "The role of lipid-related genes, aging-related processes, and environment in healthspan", "Url": "h"}, {"Title": "A family-based joint test for mean and variance heterogeneity for quantitative traits", "Url": "h"}, {"Title": "A Systematic Heritability Analysis of the Human Whole Blood Transcriptome", "Url": "h"}, {"Title": "Assessment of Whole-Genome Regression for Type II Diabetes", "Url": "h"}, {"Title": "Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease", "Url": "h"}, {"Title": "The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits", "Url": "h"}, {"Title": "Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes", "Url": "h"}, {"Title": "Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies", "Url": "h"}, {"Title": "Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies", "Url": "h"}, {"Title": "Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease", "Url": "h"}, {"Title": "Genomic prediction of coronary heart disease", "Url": "h"}, {"Title": "KLB is associated with alcohol drinking, and its gene product \\u00c3\\u009f-Klotho is necessary for FGF21 regulation of alcohol preference", "Url": "h"}, {"Title": "Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits", "Url": "h"}, {"Title": "Using information of relatives in genomic prediction to apply effective stratified medicine", "Url": "h"}, {"Title": "Metabolomic profiles as reliable biomarkers of dietary composition", "Url": "h"}, {"Title": "Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies", "Url": "h"}, {"Title": "Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes", "Url": "h"}, {"Title": "Structural variants caused by Alu insertions are associated with risks for many human diseases", "Url": "h"}, {"Title": "An Exploration of Gene-Gene Interactions and Their Effects on Hypertension", "Url": "h"}, {"Title": "Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits", "Url": "h"}, {"Title": "Cytosolic proteome profiling of monocytes for male osteoporosis", "Url": "h"}, {"Title": "Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets", "Url": "h"}, {"Title": "Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "rqt: an R package for gene-level meta-analysis", "Url": "h"}, {"Title": "Strong impact of natural-selection\\u00e2\\u0080\\u0093free heterogeneity in genetics of age-related phenotypes", "Url": "h"}, {"Title": "Apolipoprotein E region molecular signatures of Alzheimer's disease", "Url": "h"}, {"Title": "The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study", "Url": "h"}, {"Title": "Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease", "Url": "h"}, {"Title": "Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms", "Url": "h"}, {"Title": "Genetic heterogeneity of Alzheimer\\u00e2\\u0080\\u0099s disease in subjects with and without hypertension", "Url": "h"}, {"Title": "The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports", "Url": "h"}, {"Title": "A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study", "Url": "h"}, {"Title": "Final Draft Status of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study", "Url": "h"}, {"Title": "SLEEP MEDICINE NEWS AND UPDATES", "Url": "h"}, {"Title": "Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study", "Url": "h"}, {"Title": "Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index", "Url": "h"}, {"Title": "GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA", "Url": "h"}, {"Title": "A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project", "Url": "h"}, {"Title": "Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009", "Url": "h"}, {"Title": "Current Perceptions of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Consent for Genetic Research in the Framingham Heart Study", "Url": "h"}, {"Title": "Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women", "Url": "h"}, {"Title": "Genetics of the Framingham Heart Study Population", "Url": "h"}, {"Title": "Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience", "Url": "h"}, {"Title": "Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?", "Url": "h"}, {"Title": "Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years", "Url": "h"}, {"Title": "Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study", "Url": "h"}, {"Title": "Heritability of pulmonary function estimated from pedigree and whole-genome markers", "Url": "h"}, {"Title": "Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction", "Url": "h"}, {"Title": "Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations", "Url": "h"}, {"Title": "Phenotypic extremes in rare variant study designs", "Url": "h"}, {"Title": "Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology", "Url": "h"}, {"Title": "Genome-wide association study of subclinical interstitial lung disease in MESA", "Url": "h"}, {"Title": "Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models", "Url": "h"}, {"Title": "A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking", "Url": "h"}, {"Title": "Protein Biomarkers of Cardiovascular Disease and Mortality in the Community", "Url": "h"}, {"Title": "Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes", "Url": "h"}, {"Title": "Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study", "Url": "h"}, {"Title": "Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\\u00e2\\u0080\\u0094The Framingham Heart Study", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis", "Url": "h"}, {"Title": "Whole-genome association study identifies STK39 as a hypertension susceptibility gene", "Url": "h"}, {"Title": "Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups", "Url": "h"}, {"Title": "Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15", "Url": "h"}, {"Title": "Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males", "Url": "h"}, {"Title": "Genetic Analysis of Variation in Human Meiotic Recombination", "Url": "h"}, {"Title": "Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway", "Url": "h"}, {"Title": "New Lesions Detected by Single Nucleotide Polymorphism Array\\u00e2\\u0080\\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia", "Url": "h"}, {"Title": "ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals", "Url": "h"}, {"Title": "Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis", "Url": "h"}, {"Title": "Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study", "Url": "h"}, {"Title": "Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "GWAF: an R package for genome-wide association analyses with family data", "Url": "h"}, {"Title": "Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data", "Url": "h"}, {"Title": "Natural selection in a contemporary human population", "Url": "h"}, {"Title": "Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology", "Url": "h"}, {"Title": "Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height", "Url": "h"}, {"Title": "A PCA-based method for ancestral informative markers selection in structured populations", "Url": "h"}, {"Title": "HMGA2 Is Confirmed To Be Associated with Human Adult Height", "Url": "h"}, {"Title": "Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies", "Url": "h"}, {"Title": "Joint influence of small-effect genetic variants on human longevity", "Url": "h"}, {"Title": "Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study", "Url": "h"}, {"Title": "A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study", "Url": "h"}, {"Title": "Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\\u00e2\\u0080\\u0099s disease risk loci and reveals interactions with APOE genotypes", "Url": "h"}, {"Title": "Beyond Missing Heritability: Prediction of Complex Traits", "Url": "h"}, {"Title": "Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests", "Url": "h"}, {"Title": "SNP array\\u00e2\\u0080\\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes", "Url": "h"}, {"Title": "Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women", "Url": "h"}, {"Title": "IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study", "Url": "h"}, {"Title": "Genome-Wide Association Study for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study", "Url": "h"}, {"Title": "Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD", "Url": "h"}, {"Title": "Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts", "Url": "h"}, {"Title": "Atrial natriuretic peptide is negatively regulated by microRNA-425", "Url": "h"}, {"Title": "A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension", "Url": "h"}, {"Title": "Genome-wide Identification of microRNA Expression Quantitative Trait Loci", "Url": "h"}, {"Title": "Subgroup specific incremental value of new markers for risk prediction", "Url": "h"}, {"Title": "Gene Expression Signatures of Coronary Heart Disease", "Url": "h"}, {"Title": "Evaluating incremental values from new predictors with net reclassification improvement in survival analysis", "Url": "h"}, {"Title": "Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design", "Url": "h"}, {"Title": "Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study", "Url": "h"}, {"Title": "Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity", "Url": "h"}, {"Title": "Resampling Procedures for Making Inference under Nested Case-control Studies", "Url": "h"}, {"Title": "Adopting nested case\\u00e2\\u0080\\u0093control quota sampling designs for the evaluation of risk markers", "Url": "h"}, {"Title": "Multistage genome-wide association meta-analyses identified two new loci for bone mineral density", "Url": "h"}, {"Title": "Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development", "Url": "h"}, {"Title": "Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates", "Url": "h"}, {"Title": "Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations", "Url": "h"}, {"Title": "Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics", "Url": "h"}, {"Title": "The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets", "Url": "h"}, {"Title": "Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis", "Url": "h"}, {"Title": "FTO association and interaction with time spent sitting", "Url": "h"}, {"Title": "Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene", "Url": "h"}, {"Title": "Understanding multicellular function and disease with human tissue-specific networks", "Url": "h"}, {"Title": "Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants", "Url": "h"}, {"Title": "Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1", "Url": "h"}, {"Title": "GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium", "Url": "h"}, {"Title": "Identification of polymorphisms in cancer patients that differentially affect survival with age", "Url": "h"}, {"Title": "Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship", "Url": "h"}, {"Title": "Integrative network analysis reveals molecular mechanisms of blood pressure regulation", "Url": "h"}, {"Title": "Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes", "Url": "h"}, {"Title": "Diverse human extracellular RNAs are widely detected in human plasma", "Url": "h"}, {"Title": "An exome array study of the plasma metabolome", "Url": "h"}, {"Title": "Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors", "Url": "h"}, {"Title": "Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population", "Url": "h"}, {"Title": "Genetic architecture of gene expression traits across diverse populations", "Url": "h"}, {"Title": "Pathway-based analysis of genome-wide association study of circadian phenotypes", "Url": "h"}, {"Title": "Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function", "Url": "h"}, {"Title": "Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis", "Url": "h"}, {"Title": "Genome-wide analysis of genetic predisposition to Alzheimer\\u00e2\\u0080\\u0099s disease and related sex disparities", "Url": "h"}, {"Title": "Independent associations of TOMM40 and APOE variants with body mass index", "Url": "h"}, {"Title": "Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries", "Url": "h"}, {"Title": "Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)", "Url": "h"}, {"Title": "Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes", "Url": "h"}, {"Title": "An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction", "Url": "h"}, {"Title": "Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density", "Url": "h"}, {"Title": "The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees", "Url": "h"}, {"Title": "Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups", "Url": "h"}, {"Title": "Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid", "Url": "h"}, {"Title": "Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci", "Url": "h"}, {"Title": "Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\\u00e2\\u0080\\u0099s Disease", "Url": "h"}, {"Title": "Integrative analysis of multiple diverse omics datasets by sparse group multitask regression", "Url": "h"}, {"Title": "Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles", "Url": "h"}, {"Title": "Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases", "Url": "h"}, {"Title": "Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality", "Url": "h"}] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] \\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\\n\\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\\n\\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\\n\\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\\n\\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\\n\\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\\n\\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. \\n\\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \\n\\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 ["phs000007.v32.p13"] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB-IRB-MDS", "HMB-IRB-NPU-MDS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort +phs000166.v2.p1.c1 /programs/parent/projects/SHARP_ARR_ SHARP_ARR_ phs000166.v2.p1.c1 c1 ARR p1 phs000166 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 v2 National Heart, Lung, and Blood Institute SNP Health Association Asthma Resource Project (SHARP) SHARP_ARR_ parent-SHARP_ARR_ Yes SHARP SNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN). There are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses. Study Weblinks: CAMP CARE ACRN Study Design: Cross-Sectional Study Type: Longitudinal Parent-Offspring Trios Case-Control Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 on 2021-03-25 and may not include exact formatting or images. phs000166.v2.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP Cross-Sectional [{"Title": "Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma", "Url": "h"}, {"Title": "Following the footprints of polymorphic inversions on SNP data: from detection to association tests", "Url": "h"}, {"Title": "Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma", "Url": "h"}, {"Title": "Measuring the Corticosteroid Responsiveness Endophenotype in Asthma", "Url": "h"}, {"Title": "African ancestry is associated with cluster-based childhood asthma subphenotypes", "Url": "h"}, {"Title": "The Pharmacogenetics and Pharmacogenomics of Asthma Therapy", "Url": "h"}, {"Title": "Genome-Wide Association Study of Short-Acting \\u00c3\\u009f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3", "Url": "h"}, {"Title": "Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children", "Url": "h"}, {"Title": "Identification of ATPAF1 as a novel candidate gene for asthma in children", "Url": "h"}, {"Title": "Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus", "Url": "h"}, {"Title": "Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids", "Url": "h"}, {"Title": "Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations", "Url": "h"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "h"}, {"Title": "Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma", "Url": "h"}, {"Title": "FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA", "Url": "h"}] \\nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\\n\\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000166.v2.p1-all-subjects phs000166 ["phs000166.v2.p1"] 39 1 9 4046 1 4046 348 2009-09-09 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000166 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "ARR"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP) +phs000179.v6.p2.c1 /programs/parent/projects/COPDGene_HMB_ COPDGene_HMB_ phs000179.v6.p2.c1 c1 HMB p2 phs000179 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 v6 Genetic Epidemiology of COPD (COPDGene) Funded by the National Heart, Lung, and Blood Institute COPDGene_HMB_ parent-COPDGene_HMB_ Yes COPDGene Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease. The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity. The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. phs000296 ESP LungGO COPDGene phs000765 COPDGene_Geno Study Weblinks: COPDGene Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 on 2021-03-25 and may not include exact formatting or images. phs000179.v6.p2.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP Case-Control [{"Title": "Telomerase mutations in smokers with severe emphysema", "Url": "h"}, {"Title": "Multi-scale Analysis of Imaging Features and Its Use in the Study of COPD Exacerbation Susceptible Phenotypes", "Url": "h"}, {"Title": "Schizophrenia copy number variants and associative learning", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "DSP variants may be associated with longitudinal change in quantitative emphysema", "Url": "h"}, {"Title": "Genetic Epidemiology of COPD (COPDGene) Study Design", "Url": "h"}, {"Title": "Hemizygous Deletion on Chromosome 3p26.1 Is Associated with Heavy Smoking among African American Subjects in the COPDGene Study", "Url": "h"}, {"Title": "Integrative Omics Approach Identifies Interleukin-16 as a Biomarker of Emphysema", "Url": "h"}, {"Title": "Common Genetic Variants Associated with Resting Oxygenation in Chronic Obstructive Pulmonary Disease", "Url": "h"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "h"}, {"Title": "A genome-wide association study identifies risk loci for spirometric measures among smokers of European and African ancestry", "Url": "h"}, {"Title": "Automatic Synthesis of Anthropomorphic Pulmonary CT Phantoms", "Url": "h"}, {"Title": "Pulmonary Lobe Segmentation with Probabilistic Segmentation of the Fissures and a Groupwise Fissure Prior", "Url": "h"}, {"Title": "Clonal Evolution of Chemotherapy-resistant Urothelial Carcinoma", "Url": "h"}, {"Title": "NEK1 variants confer susceptibility to amyotrophic lateral sclerosis", "Url": "h"}, {"Title": "Genetic Pleiotropy between Nicotine Dependence and Respiratory Outcomes", "Url": "h"}, {"Title": "Manifold Learning of COPD", "Url": "h"}, {"Title": "Risk factors for COPD exacerbations in inhaled medication users: the COPDGene study biannual longitudinal follow-up prospective cohort", "Url": "h"}, {"Title": "Common Genetic Polymorphisms Influence Blood Biomarker Measurements in COPD", "Url": "h"}, {"Title": "Susceptibility to Childhood Pneumonia: A Genome-Wide Analysis", "Url": "h"}, {"Title": "Genetic loci associated with chronic obstructive pulmonary disease overlap with loci for lung function and pulmonary fibrosis", "Url": "h"}, {"Title": "Childhood asthma is associated with COPD and known asthma variants in COPDGene: a genome-wide association study", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Analysis of Intellectual Disability Copy Number Variants for Association With Schizophrenia", "Url": "h"}, {"Title": "An Adaptive Fisher\\u00e2\\u0080\\u0099s Combination Method for Joint Analysis of Multiple Phenotypes in Association Studies", "Url": "h"}] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] \\nChronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. **The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease.** The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity.\\n\\n**The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies.** To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. - [phs000296](./study.cgi?study_id=phs000296) ESP LungGO COPDGene - [phs000765](./study.cgi?study_id=phs000765) COPDGene_Geno \\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000179.v6.p2-all-subjects Pulmonary Disease, Chronic Obstructive phs000179 ["phs000179.v6.p2"] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] 4 16 5 4 11951 2 10371 341 2019-05-03 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000179 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB", "DS-CS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 Genetic Epidemiology of COPD (COPDGene) +phs000179.v6.p2.c2 /programs/parent/projects/COPDGene_DS-CS_ COPDGene_DS-CS_ phs000179.v6.p2.c2 c2 DS-CS p2 phs000179 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 v6 Genetic Epidemiology of COPD (COPDGene) Funded by the National Heart, Lung, and Blood Institute COPDGene_DS-CS_ parent-COPDGene_DS-CS_ Yes COPDGene Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease. The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity. The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. phs000296 ESP LungGO COPDGene phs000765 COPDGene_Geno Study Weblinks: COPDGene Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 on 2021-03-25 and may not include exact formatting or images. phs000179.v6.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP Case-Control [{"Title": "Telomerase mutations in smokers with severe emphysema", "Url": "h"}, {"Title": "Multi-scale Analysis of Imaging Features and Its Use in the Study of COPD Exacerbation Susceptible Phenotypes", "Url": "h"}, {"Title": "Schizophrenia copy number variants and associative learning", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "DSP variants may be associated with longitudinal change in quantitative emphysema", "Url": "h"}, {"Title": "Genetic Epidemiology of COPD (COPDGene) Study Design", "Url": "h"}, {"Title": "Hemizygous Deletion on Chromosome 3p26.1 Is Associated with Heavy Smoking among African American Subjects in the COPDGene Study", "Url": "h"}, {"Title": "Integrative Omics Approach Identifies Interleukin-16 as a Biomarker of Emphysema", "Url": "h"}, {"Title": "Common Genetic Variants Associated with Resting Oxygenation in Chronic Obstructive Pulmonary Disease", "Url": "h"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "h"}, {"Title": "A genome-wide association study identifies risk loci for spirometric measures among smokers of European and African ancestry", "Url": "h"}, {"Title": "Automatic Synthesis of Anthropomorphic Pulmonary CT Phantoms", "Url": "h"}, {"Title": "Pulmonary Lobe Segmentation with Probabilistic Segmentation of the Fissures and a Groupwise Fissure Prior", "Url": "h"}, {"Title": "Clonal Evolution of Chemotherapy-resistant Urothelial Carcinoma", "Url": "h"}, {"Title": "NEK1 variants confer susceptibility to amyotrophic lateral sclerosis", "Url": "h"}, {"Title": "Genetic Pleiotropy between Nicotine Dependence and Respiratory Outcomes", "Url": "h"}, {"Title": "Manifold Learning of COPD", "Url": "h"}, {"Title": "Risk factors for COPD exacerbations in inhaled medication users: the COPDGene study biannual longitudinal follow-up prospective cohort", "Url": "h"}, {"Title": "Common Genetic Polymorphisms Influence Blood Biomarker Measurements in COPD", "Url": "h"}, {"Title": "Susceptibility to Childhood Pneumonia: A Genome-Wide Analysis", "Url": "h"}, {"Title": "Genetic loci associated with chronic obstructive pulmonary disease overlap with loci for lung function and pulmonary fibrosis", "Url": "h"}, {"Title": "Childhood asthma is associated with COPD and known asthma variants in COPDGene: a genome-wide association study", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Analysis of Intellectual Disability Copy Number Variants for Association With Schizophrenia", "Url": "h"}, {"Title": "An Adaptive Fisher\\u00e2\\u0080\\u0099s Combination Method for Joint Analysis of Multiple Phenotypes in Association Studies", "Url": "h"}] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] \\nChronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. **The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease.** The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity.\\n\\n**The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies.** To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. - [phs000296](./study.cgi?study_id=phs000296) ESP LungGO COPDGene - [phs000765](./study.cgi?study_id=phs000765) COPDGene_Geno \\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000179.v6.p2-all-subjects Pulmonary Disease, Chronic Obstructive phs000179 ["phs000179.v6.p2"] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] 4 16 5 4 11951 2 10371 341 2019-05-03 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000179 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB", "DS-CS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 Genetic Epidemiology of COPD (COPDGene) diff --git a/tests/merge_manifests/discovery_combine/combined_discovery_metadata_exact_match.tsv b/tests/merge_manifests/discovery_combine/combined_discovery_metadata_exact_match.tsv new file mode 100644 index 000000000..e2d530b34 --- /dev/null +++ b/tests/merge_manifests/discovery_combine/combined_discovery_metadata_exact_match.tsv @@ -0,0 +1,4 @@ +guid DBGAP_FHIR_guid_exact_match DBGAP_FHIR_Category DBGAP_FHIR_Citers DBGAP_FHIR_Condition DBGAP_FHIR_Description DBGAP_FHIR_Disclaimer DBGAP_FHIR_Enrollment DBGAP_FHIR_Focus DBGAP_FHIR_Id DBGAP_FHIR_Identifier DBGAP_FHIR_Keyword DBGAP_FHIR_NumAnalyses DBGAP_FHIR_NumDocuments DBGAP_FHIR_NumMolecularDatasets DBGAP_FHIR_NumPhenotypeDatasets DBGAP_FHIR_NumSamples DBGAP_FHIR_NumSubStudies DBGAP_FHIR_NumSubjects DBGAP_FHIR_NumVariables DBGAP_FHIR_ReleaseDate DBGAP_FHIR_ResearchStudyURL DBGAP_FHIR_ResourceType DBGAP_FHIR_Sponsor DBGAP_FHIR_Status DBGAP_FHIR_StudyConsents DBGAP_FHIR_StudyOverviewUrl DBGAP_FHIR_Title __manifest _subjects_count authz code dbgap_accession dbgap_consent dbgap_consent_text dbgap_participant_set dbgap_phs dbgap_url dbgap_version full_name name null project_id released short_name study_description study_id _tag_0 _tag_1 _tag_2 _tag_3 _tag_4 +phs000007.v31.p12.c1 phs000007.v31.p12.c1 Prospective Longitudinal Cohort [{"Title": "Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk", "Url": "h"}, {"Title": "The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity", "Url": "h"}, {"Title": "Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort", "Url": "h"}, {"Title": "Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1", "Url": "h"}, {"Title": "Evaluating prognostic accuracy of biomarkers in nested case\\u00e2\\u0080\\u0093control studies", "Url": "h"}, {"Title": "Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Knowledge-Driven Analysis Identifies a Gene\\u00e2\\u0080\\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations", "Url": "h"}, {"Title": "Family-Based Association Studies for Next-Generation Sequencing", "Url": "h"}, {"Title": "Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study", "Url": "h"}, {"Title": "Prediction of Expected Years of Life Using Whole-Genome Markers", "Url": "h"}, {"Title": "Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality", "Url": "h"}, {"Title": "How Genes Influence Life Span: The Biodemography of Human Survival", "Url": "h"}, {"Title": "d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes", "Url": "h"}, {"Title": "Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans", "Url": "h"}, {"Title": "Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study", "Url": "h"}, {"Title": "Obesity\\u00e2\\u0080\\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice", "Url": "h"}, {"Title": "Genomics of human health and aging", "Url": "h"}, {"Title": "Inter-chromosomal level of genome organization and longevity-related phenotypes in humans", "Url": "h"}, {"Title": "The role of lipid-related genes, aging-related processes, and environment in healthspan", "Url": "h"}, {"Title": "A family-based joint test for mean and variance heterogeneity for quantitative traits", "Url": "h"}, {"Title": "A Systematic Heritability Analysis of the Human Whole Blood Transcriptome", "Url": "h"}, {"Title": "Assessment of Whole-Genome Regression for Type II Diabetes", "Url": "h"}, {"Title": "Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease", "Url": "h"}, {"Title": "The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits", "Url": "h"}, {"Title": "Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes", "Url": "h"}, {"Title": "Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies", "Url": "h"}, {"Title": "Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies", "Url": "h"}, {"Title": "Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease", "Url": "h"}, {"Title": "Genomic prediction of coronary heart disease", "Url": "h"}, {"Title": "KLB is associated with alcohol drinking, and its gene product \\u00c3\\u009f-Klotho is necessary for FGF21 regulation of alcohol preference", "Url": "h"}, {"Title": "Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits", "Url": "h"}, {"Title": "Using information of relatives in genomic prediction to apply effective stratified medicine", "Url": "h"}, {"Title": "Metabolomic profiles as reliable biomarkers of dietary composition", "Url": "h"}, {"Title": "Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies", "Url": "h"}, {"Title": "Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes", "Url": "h"}, {"Title": "Structural variants caused by Alu insertions are associated with risks for many human diseases", "Url": "h"}, {"Title": "An Exploration of Gene-Gene Interactions and Their Effects on Hypertension", "Url": "h"}, {"Title": "Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits", "Url": "h"}, {"Title": "Cytosolic proteome profiling of monocytes for male osteoporosis", "Url": "h"}, {"Title": "Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets", "Url": "h"}, {"Title": "Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "rqt: an R package for gene-level meta-analysis", "Url": "h"}, {"Title": "Strong impact of natural-selection\\u00e2\\u0080\\u0093free heterogeneity in genetics of age-related phenotypes", "Url": "h"}, {"Title": "Apolipoprotein E region molecular signatures of Alzheimer's disease", "Url": "h"}, {"Title": "The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study", "Url": "h"}, {"Title": "Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease", "Url": "h"}, {"Title": "Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms", "Url": "h"}, {"Title": "Genetic heterogeneity of Alzheimer\\u00e2\\u0080\\u0099s disease in subjects with and without hypertension", "Url": "h"}, {"Title": "The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports", "Url": "h"}, {"Title": "A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study", "Url": "h"}, {"Title": "Final Draft Status of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study", "Url": "h"}, {"Title": "SLEEP MEDICINE NEWS AND UPDATES", "Url": "h"}, {"Title": "Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study", "Url": "h"}, {"Title": "Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index", "Url": "h"}, {"Title": "GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA", "Url": "h"}, {"Title": "A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project", "Url": "h"}, {"Title": "Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009", "Url": "h"}, {"Title": "Current Perceptions of the Epidemiology of Atrial Fibrillation", "Url": "h"}, {"Title": "Consent for Genetic Research in the Framingham Heart Study", "Url": "h"}, {"Title": "Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women", "Url": "h"}, {"Title": "Genetics of the Framingham Heart Study Population", "Url": "h"}, {"Title": "Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience", "Url": "h"}, {"Title": "Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?", "Url": "h"}, {"Title": "Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years", "Url": "h"}, {"Title": "Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study", "Url": "h"}, {"Title": "Heritability of pulmonary function estimated from pedigree and whole-genome markers", "Url": "h"}, {"Title": "Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction", "Url": "h"}, {"Title": "Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations", "Url": "h"}, {"Title": "Phenotypic extremes in rare variant study designs", "Url": "h"}, {"Title": "Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology", "Url": "h"}, {"Title": "Genome-wide association study of subclinical interstitial lung disease in MESA", "Url": "h"}, {"Title": "Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models", "Url": "h"}, {"Title": "A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking", "Url": "h"}, {"Title": "Protein Biomarkers of Cardiovascular Disease and Mortality in the Community", "Url": "h"}, {"Title": "Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes", "Url": "h"}, {"Title": "Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study", "Url": "h"}, {"Title": "Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\\u00e2\\u0080\\u0094The Framingham Heart Study", "Url": "h"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "h"}, {"Title": "Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis", "Url": "h"}, {"Title": "Whole-genome association study identifies STK39 as a hypertension susceptibility gene", "Url": "h"}, {"Title": "Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups", "Url": "h"}, {"Title": "Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15", "Url": "h"}, {"Title": "Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males", "Url": "h"}, {"Title": "Genetic Analysis of Variation in Human Meiotic Recombination", "Url": "h"}, {"Title": "Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway", "Url": "h"}, {"Title": "New Lesions Detected by Single Nucleotide Polymorphism Array\\u00e2\\u0080\\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia", "Url": "h"}, {"Title": "ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals", "Url": "h"}, {"Title": "Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis", "Url": "h"}, {"Title": "Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study", "Url": "h"}, {"Title": "Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "GWAF: an R package for genome-wide association analyses with family data", "Url": "h"}, {"Title": "Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data", "Url": "h"}, {"Title": "Natural selection in a contemporary human population", "Url": "h"}, {"Title": "Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology", "Url": "h"}, {"Title": "Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height", "Url": "h"}, {"Title": "A PCA-based method for ancestral informative markers selection in structured populations", "Url": "h"}, {"Title": "HMGA2 Is Confirmed To Be Associated with Human Adult Height", "Url": "h"}, {"Title": "Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies", "Url": "h"}, {"Title": "Joint influence of small-effect genetic variants on human longevity", "Url": "h"}, {"Title": "Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study", "Url": "h"}, {"Title": "A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study", "Url": "h"}, {"Title": "Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\\u00e2\\u0080\\u0099s disease risk loci and reveals interactions with APOE genotypes", "Url": "h"}, {"Title": "Beyond Missing Heritability: Prediction of Complex Traits", "Url": "h"}, {"Title": "Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests", "Url": "h"}, {"Title": "SNP array\\u00e2\\u0080\\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes", "Url": "h"}, {"Title": "Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women", "Url": "h"}, {"Title": "IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study", "Url": "h"}, {"Title": "Genome-Wide Association Study for Femoral Neck Bone Geometry", "Url": "h"}, {"Title": "Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study", "Url": "h"}, {"Title": "Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD", "Url": "h"}, {"Title": "Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts", "Url": "h"}, {"Title": "Atrial natriuretic peptide is negatively regulated by microRNA-425", "Url": "h"}, {"Title": "A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension", "Url": "h"}, {"Title": "Genome-wide Identification of microRNA Expression Quantitative Trait Loci", "Url": "h"}, {"Title": "Subgroup specific incremental value of new markers for risk prediction", "Url": "h"}, {"Title": "Gene Expression Signatures of Coronary Heart Disease", "Url": "h"}, {"Title": "Evaluating incremental values from new predictors with net reclassification improvement in survival analysis", "Url": "h"}, {"Title": "Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design", "Url": "h"}, {"Title": "Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study", "Url": "h"}, {"Title": "Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity", "Url": "h"}, {"Title": "Resampling Procedures for Making Inference under Nested Case-control Studies", "Url": "h"}, {"Title": "Adopting nested case\\u00e2\\u0080\\u0093control quota sampling designs for the evaluation of risk markers", "Url": "h"}, {"Title": "Multistage genome-wide association meta-analyses identified two new loci for bone mineral density", "Url": "h"}, {"Title": "Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development", "Url": "h"}, {"Title": "Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates", "Url": "h"}, {"Title": "Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations", "Url": "h"}, {"Title": "Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics", "Url": "h"}, {"Title": "The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets", "Url": "h"}, {"Title": "Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis", "Url": "h"}, {"Title": "FTO association and interaction with time spent sitting", "Url": "h"}, {"Title": "Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene", "Url": "h"}, {"Title": "Understanding multicellular function and disease with human tissue-specific networks", "Url": "h"}, {"Title": "Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants", "Url": "h"}, {"Title": "Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1", "Url": "h"}, {"Title": "GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium", "Url": "h"}, {"Title": "Identification of polymorphisms in cancer patients that differentially affect survival with age", "Url": "h"}, {"Title": "Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship", "Url": "h"}, {"Title": "Integrative network analysis reveals molecular mechanisms of blood pressure regulation", "Url": "h"}, {"Title": "Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes", "Url": "h"}, {"Title": "Diverse human extracellular RNAs are widely detected in human plasma", "Url": "h"}, {"Title": "An exome array study of the plasma metabolome", "Url": "h"}, {"Title": "Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors", "Url": "h"}, {"Title": "Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population", "Url": "h"}, {"Title": "Genetic architecture of gene expression traits across diverse populations", "Url": "h"}, {"Title": "Pathway-based analysis of genome-wide association study of circadian phenotypes", "Url": "h"}, {"Title": "Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function", "Url": "h"}, {"Title": "Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis", "Url": "h"}, {"Title": "Genome-wide analysis of genetic predisposition to Alzheimer\\u00e2\\u0080\\u0099s disease and related sex disparities", "Url": "h"}, {"Title": "Independent associations of TOMM40 and APOE variants with body mass index", "Url": "h"}, {"Title": "Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries", "Url": "h"}, {"Title": "Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)", "Url": "h"}, {"Title": "Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes", "Url": "h"}, {"Title": "An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction", "Url": "h"}, {"Title": "Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density", "Url": "h"}, {"Title": "The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees", "Url": "h"}, {"Title": "Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups", "Url": "h"}, {"Title": "Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid", "Url": "h"}, {"Title": "Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci", "Url": "h"}, {"Title": "Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\\u00e2\\u0080\\u0099s Disease", "Url": "h"}, {"Title": "Integrative analysis of multiple diverse omics datasets by sparse group multitask regression", "Url": "h"}, {"Title": "Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs", "Url": "h"}, {"Title": "Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles", "Url": "h"}, {"Title": "Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases", "Url": "h"}, {"Title": "Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality", "Url": "h"}] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] \\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\\n\\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\\n\\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\\n\\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\\n\\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\\n\\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\\n\\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. \\n\\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \\n\\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 ["phs000007.v32.p13"] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB-IRB-MDS", "HMB-IRB-NPU-MDS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort /programs/parent/projects/FHS_HMB-IRB-MDS_ FHS_HMB-IRB-MDS_ phs000007.v31.p12.c1 c1 HMB-IRB-MDS p12 phs000007 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 v31 Framingham Cohort FHS_HMB-IRB-MDS_ parent-FHS_HMB-IRB-MDS_ Yes FHS See Grouping of Framingham Phenotype Datasets Startup of Framingham Heart Study. Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic. The objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke. Design of Framingham Heart Study. In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University. Research Areas in the Framingham Heart Study. Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice. In addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases. Genetic Research in the Framingham Heart Study. While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip. Framingham Cohort Phenotype Data. The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. The Framingham Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. phs000342 Framingham SHARe phs000282 Framingham CARe phs000363 Framingham SABRe phs000307 Framingham Medical Resequencing phs000401 Framingham ESP Heart-GO phs000651 Framingham CHARGE-S phs000724 Framingham DNA Methylation phs001610 Framingham T2D-GENES The unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come. Study Weblinks: The Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 on 2021-03-25 and may not include exact formatting or images. phs000007.v31.p12.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000166.v2.p1.c1 phs000166.v2.p1.c1 Cross-Sectional [{"Title": "Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma", "Url": "h"}, {"Title": "Following the footprints of polymorphic inversions on SNP data: from detection to association tests", "Url": "h"}, {"Title": "Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma", "Url": "h"}, {"Title": "Measuring the Corticosteroid Responsiveness Endophenotype in Asthma", "Url": "h"}, {"Title": "African ancestry is associated with cluster-based childhood asthma subphenotypes", "Url": "h"}, {"Title": "The Pharmacogenetics and Pharmacogenomics of Asthma Therapy", "Url": "h"}, {"Title": "Genome-Wide Association Study of Short-Acting \\u00c3\\u009f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3", "Url": "h"}, {"Title": "Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children", "Url": "h"}, {"Title": "Identification of ATPAF1 as a novel candidate gene for asthma in children", "Url": "h"}, {"Title": "Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus", "Url": "h"}, {"Title": "Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids", "Url": "h"}, {"Title": "Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations", "Url": "h"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "h"}, {"Title": "Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma", "Url": "h"}, {"Title": "FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA", "Url": "h"}] \\nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\\n\\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000166.v2.p1-all-subjects phs000166 ["phs000166.v2.p1"] 39 1 9 4046 1 4046 348 2009-09-09 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000166 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "ARR"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP) /programs/parent/projects/SHARP_ARR_ SHARP_ARR_ phs000166.v2.p1.c1 c1 ARR p1 phs000166 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 v2 National Heart, Lung, and Blood Institute SNP Health Association Asthma Resource Project (SHARP) SHARP_ARR_ parent-SHARP_ARR_ Yes SHARP SNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN). There are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses. Study Weblinks: CAMP CARE ACRN Study Design: Cross-Sectional Study Type: Longitudinal Parent-Offspring Trios Case-Control Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 on 2021-03-25 and may not include exact formatting or images. phs000166.v2.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000179.v6.p2.c2 phs000179.v6.p2.c2 Case-Control [{"Title": "Telomerase mutations in smokers with severe emphysema", "Url": "h"}, {"Title": "Multi-scale Analysis of Imaging Features and Its Use in the Study of COPD Exacerbation Susceptible Phenotypes", "Url": "h"}, {"Title": "Schizophrenia copy number variants and associative learning", "Url": "h"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "h"}, {"Title": "DSP variants may be associated with longitudinal change in quantitative emphysema", "Url": "h"}, {"Title": "Genetic Epidemiology of COPD (COPDGene) Study Design", "Url": "h"}, {"Title": "Hemizygous Deletion on Chromosome 3p26.1 Is Associated with Heavy Smoking among African American Subjects in the COPDGene Study", "Url": "h"}, {"Title": "Integrative Omics Approach Identifies Interleukin-16 as a Biomarker of Emphysema", "Url": "h"}, {"Title": "Common Genetic Variants Associated with Resting Oxygenation in Chronic Obstructive Pulmonary Disease", "Url": "h"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "h"}, {"Title": "A genome-wide association study identifies risk loci for spirometric measures among smokers of European and African ancestry", "Url": "h"}, {"Title": "Automatic Synthesis of Anthropomorphic Pulmonary CT Phantoms", "Url": "h"}, {"Title": "Pulmonary Lobe Segmentation with Probabilistic Segmentation of the Fissures and a Groupwise Fissure Prior", "Url": "h"}, {"Title": "Clonal Evolution of Chemotherapy-resistant Urothelial Carcinoma", "Url": "h"}, {"Title": "NEK1 variants confer susceptibility to amyotrophic lateral sclerosis", "Url": "h"}, {"Title": "Genetic Pleiotropy between Nicotine Dependence and Respiratory Outcomes", "Url": "h"}, {"Title": "Manifold Learning of COPD", "Url": "h"}, {"Title": "Risk factors for COPD exacerbations in inhaled medication users: the COPDGene study biannual longitudinal follow-up prospective cohort", "Url": "h"}, {"Title": "Common Genetic Polymorphisms Influence Blood Biomarker Measurements in COPD", "Url": "h"}, {"Title": "Susceptibility to Childhood Pneumonia: A Genome-Wide Analysis", "Url": "h"}, {"Title": "Genetic loci associated with chronic obstructive pulmonary disease overlap with loci for lung function and pulmonary fibrosis", "Url": "h"}, {"Title": "Childhood asthma is associated with COPD and known asthma variants in COPDGene: a genome-wide association study", "Url": "h"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "h"}, {"Title": "Analysis of Intellectual Disability Copy Number Variants for Association With Schizophrenia", "Url": "h"}, {"Title": "An Adaptive Fisher\\u00e2\\u0080\\u0099s Combination Method for Joint Analysis of Multiple Phenotypes in Association Studies", "Url": "h"}] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] \\nChronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. **The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease.** The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity.\\n\\n**The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies.** To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. - [phs000296](./study.cgi?study_id=phs000296) ESP LungGO COPDGene - [phs000765](./study.cgi?study_id=phs000765) COPDGene_Geno \\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000179.v6.p2-all-subjects Pulmonary Disease, Chronic Obstructive phs000179 ["phs000179.v6.p2"] ["Pulmonary Disease, Chronic Obstructive", "Airflow Obstruction, Chronic", "Airflow Obstructions, Chronic", "COAD", "COPD", "Chronic Airflow Obstructions", "Chronic Obstructive Lung Disease", "Chronic Obstructive Pulmonary Disease", "Pulmonary Disease, Chronic Obstructive", "COPD"] 4 16 5 4 11951 2 10371 341 2019-05-03 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000179 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB", "DS-CS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 Genetic Epidemiology of COPD (COPDGene) /programs/parent/projects/COPDGene_DS-CS_ COPDGene_DS-CS_ phs000179.v6.p2.c2 c2 DS-CS p2 phs000179 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 v6 Genetic Epidemiology of COPD (COPDGene) Funded by the National Heart, Lung, and Blood Institute COPDGene_DS-CS_ parent-COPDGene_DS-CS_ Yes COPDGene Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease. The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity. The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the "Sub-studies" section of this top-level study page phs000179 COPDGene_v6 Cohort. phs000296 ESP LungGO COPDGene phs000765 COPDGene_Geno Study Weblinks: COPDGene Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 on 2021-03-25 and may not include exact formatting or images. phs000179.v6.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP diff --git a/tests/merge_manifests/discovery_combine/discovery.tsv b/tests/merge_manifests/discovery_combine/discovery.tsv new file mode 100644 index 000000000..bdc81e5da --- /dev/null +++ b/tests/merge_manifests/discovery_combine/discovery.tsv @@ -0,0 +1,163 @@ +guid __manifest _subjects_count authz code dbgap_accession dbgap_consent dbgap_consent_text dbgap_participant_set dbgap_phs dbgap_url dbgap_version full_name name null project_id released short_name study_description study_id _tag_0 _tag_1 _tag_2 _tag_3 _tag_4 +TOPMed_Common_Exchange_Area-Freeze_1 /programs/TOPMed_Common_Exchange_Area/projects/Freeze_1 Freeze_1 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. Freeze_1 TOPMed_Common_Exchange_Area-Freeze_1 Yes TOPMed_Common_Exchange_Area-Freeze_1_PROXY_Study +TOPMed_Common_Exchange_Area-Freeze_10a /programs/TOPMed_Common_Exchange_Area/projects/Freeze_10a Freeze_10a https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. Freeze_10a TOPMed_Common_Exchange_Area-Freeze_10a Yes TOPMed_Common_Exchange_Area-Freeze_10a_PROXY_Study +TOPMed_Common_Exchange_Area-Freeze_8 /programs/TOPMed_Common_Exchange_Area/projects/Freeze_8 Freeze_8 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. Freeze_8 TOPMed_Common_Exchange_Area-Freeze_8 Yes TOPMed_Common_Exchange_Area-Freeze_8 +TOPMed_Common_Exchange_Area-Freeze_9b /programs/TOPMed_Common_Exchange_Area/projects/Freeze_9b Freeze_9b https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. Freeze_9b TOPMed_Common_Exchange_Area-Freeze_9b Yes TOPMed_Common_Exchange_Area-Freeze_9b_PROXY_Study +open_access-1000Genomes /programs/open_access/projects/1000Genomes 1000Genomes https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. 1000Genomes open_access-1000Genomes Yes high_coverage_2019_Public open_access-1000Genomes Data Type: Genotype Data Type: Clinical Phenotype +phs000007.v31.p12.c1 /programs/parent/projects/FHS_HMB-IRB-MDS_ FHS_HMB-IRB-MDS_ phs000007.v31.p12.c1 c1 HMB-IRB-MDS p12 phs000007 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 v31 Framingham Cohort FHS_HMB-IRB-MDS_ parent-FHS_HMB-IRB-MDS_ Yes FHS "See Grouping of Framingham Phenotype Datasets Startup of Framingham Heart Study. Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic. The objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke. Design of Framingham Heart Study. In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University. Research Areas in the Framingham Heart Study. Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice. In addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases. Genetic Research in the Framingham Heart Study. While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip. Framingham Cohort Phenotype Data. The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the ""Variables"" tab above. The Framingham Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000007 Framingham Cohort. phs000342 Framingham SHARe phs000282 Framingham CARe phs000363 Framingham SABRe phs000307 Framingham Medical Resequencing phs000401 Framingham ESP Heart-GO phs000651 Framingham CHARGE-S phs000724 Framingham DNA Methylation phs001610 Framingham T2D-GENES The unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come. Study Weblinks: The Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 on 2021-03-25 and may not include exact formatting or images." phs000007.v31.p12.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000007.v31.p12.c2 /programs/parent/projects/FHS_HMB-IRB-NPU-MDS_ FHS_HMB-IRB-NPU-MDS_ phs000007.v31.p12.c2 c2 HMB-IRB-NPU-MDS p12 phs000007 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 v31 Framingham Cohort FHS_HMB-IRB-NPU-MDS_ parent-FHS_HMB-IRB-NPU-MDS_ Yes FHS "See Grouping of Framingham Phenotype Datasets Startup of Framingham Heart Study. Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic. The objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke. Design of Framingham Heart Study. In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University. Research Areas in the Framingham Heart Study. Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice. In addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases. Genetic Research in the Framingham Heart Study. While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip. Framingham Cohort Phenotype Data. The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the ""Variables"" tab above. The Framingham Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000007 Framingham Cohort. phs000342 Framingham SHARe phs000282 Framingham CARe phs000363 Framingham SABRe phs000307 Framingham Medical Resequencing phs000401 Framingham ESP Heart-GO phs000651 Framingham CHARGE-S phs000724 Framingham DNA Methylation phs001610 Framingham T2D-GENES The unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come. Study Weblinks: The Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v31.p12 on 2021-03-25 and may not include exact formatting or images." phs000007.v31.p12.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000166.v2.p1.c1 /programs/parent/projects/SHARP_ARR_ SHARP_ARR_ phs000166.v2.p1.c1 c1 ARR p1 phs000166 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 v2 National Heart, Lung, and Blood Institute SNP Health Association Asthma Resource Project (SHARP) SHARP_ARR_ parent-SHARP_ARR_ Yes SHARP SNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN). There are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses. Study Weblinks: CAMP CARE ACRN Study Design: Cross-Sectional Study Type: Longitudinal Parent-Offspring Trios Case-Control Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 on 2021-03-25 and may not include exact formatting or images. phs000166.v2.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000179.v6.p2.c1 /programs/parent/projects/COPDGene_HMB_ COPDGene_HMB_ phs000179.v6.p2.c1 c1 HMB p2 phs000179 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 v6 Genetic Epidemiology of COPD (COPDGene) Funded by the National Heart, Lung, and Blood Institute COPDGene_HMB_ parent-COPDGene_HMB_ Yes COPDGene "Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease. The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity. The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this top-level study page phs000179 COPDGene_v6 Cohort. phs000296 ESP LungGO COPDGene phs000765 COPDGene_Geno Study Weblinks: COPDGene Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000179.v6.p2.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000179.v6.p2.c2 /programs/parent/projects/COPDGene_DS-CS_ COPDGene_DS-CS_ phs000179.v6.p2.c2 c2 DS-CS p2 phs000179 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 v6 Genetic Epidemiology of COPD (COPDGene) Funded by the National Heart, Lung, and Blood Institute COPDGene_DS-CS_ parent-COPDGene_DS-CS_ Yes COPDGene "Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease. The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity. The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this top-level study page phs000179 COPDGene_v6 Cohort. phs000296 ESP LungGO COPDGene phs000765 COPDGene_Geno Study Weblinks: COPDGene Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000179.v6.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000200.v12.p3.c1 /programs/parent/projects/WHI_HMB-IRB_ WHI_HMB-IRB_ phs000200.v12.p3.c1 c1 HMB-IRB p3 phs000200 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000200.v12.p3 v12 Women's Health Initiative Clinical Trial and Observational Study WHI_HMB-IRB_ parent-WHI_HMB-IRB_ Yes WHI "The Women's Health Initiative (WHI) is a long-term national health study that has focused on strategies for preventing heart disease, breast and colorectal cancer, and osteoporotic fractures in postmenopausal women. The original WHI study included 161,808 postmenopausal women enrolled between 1993 and 1998. The Fred Hutchinson Cancer Research Center in Seattle, WA serves as the WHI Clinical Coordinating Center for data collection, management, and analysis of the WHI. The WHI has two major parts: a partial factorial randomized Clinical Trial (CT) and an Observational Study (OS); both were conducted at 40 Clinical Centers nationwide. The CT enrolled 68,132 postmenopausal women between the ages of 50-79 into trials testing three prevention strategies. If eligible, women could choose to enroll in one, two, or all three of the trial components. The components are: Hormone Therapy Trials (HT): This double-blind component examined the effects of combined hormones or estrogen alone on the prevention of coronary heart disease and osteoporotic fractures, and associated risk for breast cancer. Women participating in this component with an intact uterus were randomized to estrogen plus progestin (conjugated equine estrogens [CEE], 0.625 mg/d plus medroxyprogesterone acetate [MPA] 2.5 mg/d] or a matching placebo. Women with prior hysterectomy were randomized to CEE or placebo. Both trials were stopped early, in July 2002 and March 2004, respectively, based on adverse effects. All HT participants continued to be followed without intervention until close-out. Dietary Modification Trial (DM): The Dietary Modification component evaluated the effect of a low-fat and high fruit, vegetable and grain diet on the prevention of breast and colorectal cancers and coronary heart disease. Study participants were randomized to either their usual eating pattern or a low-fat dietary pattern. Calcium/Vitamin D Trial (CaD): This double-blind component began 1 to 2 years after a woman joined one or both of the other clinical trial components. It evaluated the effect of calcium and vitamin D supplementation on the prevention of osteoporotic fractures and colorectal cancer. Women in this component were randomized to calcium (1000 mg/d) and vitamin D (400 IU/d) supplements or a matching placebo. The Observational Study (OS) examines the relationship between lifestyle, environmental, medical and molecular risk factors and specific measures of health or disease outcomes. This component involves tracking the medical history and health habits of 93,676 women not participating in the CT. Recruitment for the observational study was completed in 1998 and participants were followed annually for 8 to 12 years. Extension Studies: The original protocol allowed for follow-up until March 2005, after which participants were invited to enroll in the first WHI Extension Study for follow-up through 2010. Participants were invited again to participate in the second WHI Extension Study with continued follow up from 2010 to at least 2015. As of March 31, 2011 there were 93,122 women enrolled in the second extension. In Extension Study 2, the overall WHI study population was divided into two new subsamples, the Medical Records Cohort (MRC) and the Self-Report Cohort (SRC). The MRC consists of all former hormone trial participants and all African American and Hispanic participants from all study components. The SRC consists of the remaining participants. The extent of outcome information collected differs between the two cohorts, with more extensive outcomes information collection on the MRC. As part of Extension Study 2, selected older WHI participants were invited to participate in an In Person Visit (a.k.a., Long Life Study) at their homes during which additional blood samples were collected and various measurements were taken (such as blood pressure, height, weight, waist circumference, grip strength, etc.). In October 2015, Extension Study 2 was renewed with continued follow-up planned through October 2020, pending annual contract review and renewal. Additional Information: The WHI website, https://www.whi.org/about/SitePages/About%20WHI.aspx has much more information about the study. For WHI data collection forms used over the years, please see https://www.whi.org/researchers/studydoc/SitePages/Forms.aspx. For additional dataset documentation, see https://www.whi.org/researchers/data/Pages/Available%20Data.aspx. For data preparation and use, please refer to 'WHI dbGaP Cohort Data Release Data Preparation Guide May 2018' for additional details about the WHI data. The WHI Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000200 WHI Cohort. phs000386 WHI SHARe phs000281 GO-ESP WHISP phs000315 WHI GARNET phs000503 WHISE phs000227 PAGE WHI phs000675 WHIMS+ phs000746 WHI Harmonized and Imputed GWAS phs001334 WHI Metabolomics of CHD phs001335 WHI BA23 phs001614 WHI LLS Phase III GWAS Study Weblinks: Scientific Resources Website: Women's Health Initiative NHLBI Women's Health Initiative Study Design: Prospective Longitudinal Cohort Study Type: Partial Factorial Randomized Double-Blind Placebo-Controlled Cohort Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000200.v12.p3 on 2021-03-25 and may not include exact formatting or images." phs000200.v12.p3.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000200.v12.p3.c2 /programs/parent/projects/WHI_HMB-IRB-NPU_ WHI_HMB-IRB-NPU_ phs000200.v12.p3.c2 c2 HMB-IRB-NPU p3 phs000200 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000200.v12.p3 v12 Women's Health Initiative Clinical Trial and Observational Study WHI_HMB-IRB-NPU_ parent-WHI_HMB-IRB-NPU_ Yes WHI "The Women's Health Initiative (WHI) is a long-term national health study that has focused on strategies for preventing heart disease, breast and colorectal cancer, and osteoporotic fractures in postmenopausal women. The original WHI study included 161,808 postmenopausal women enrolled between 1993 and 1998. The Fred Hutchinson Cancer Research Center in Seattle, WA serves as the WHI Clinical Coordinating Center for data collection, management, and analysis of the WHI. The WHI has two major parts: a partial factorial randomized Clinical Trial (CT) and an Observational Study (OS); both were conducted at 40 Clinical Centers nationwide. The CT enrolled 68,132 postmenopausal women between the ages of 50-79 into trials testing three prevention strategies. If eligible, women could choose to enroll in one, two, or all three of the trial components. The components are: Hormone Therapy Trials (HT): This double-blind component examined the effects of combined hormones or estrogen alone on the prevention of coronary heart disease and osteoporotic fractures, and associated risk for breast cancer. Women participating in this component with an intact uterus were randomized to estrogen plus progestin (conjugated equine estrogens [CEE], 0.625 mg/d plus medroxyprogesterone acetate [MPA] 2.5 mg/d] or a matching placebo. Women with prior hysterectomy were randomized to CEE or placebo. Both trials were stopped early, in July 2002 and March 2004, respectively, based on adverse effects. All HT participants continued to be followed without intervention until close-out. Dietary Modification Trial (DM): The Dietary Modification component evaluated the effect of a low-fat and high fruit, vegetable and grain diet on the prevention of breast and colorectal cancers and coronary heart disease. Study participants were randomized to either their usual eating pattern or a low-fat dietary pattern. Calcium/Vitamin D Trial (CaD): This double-blind component began 1 to 2 years after a woman joined one or both of the other clinical trial components. It evaluated the effect of calcium and vitamin D supplementation on the prevention of osteoporotic fractures and colorectal cancer. Women in this component were randomized to calcium (1000 mg/d) and vitamin D (400 IU/d) supplements or a matching placebo. The Observational Study (OS) examines the relationship between lifestyle, environmental, medical and molecular risk factors and specific measures of health or disease outcomes. This component involves tracking the medical history and health habits of 93,676 women not participating in the CT. Recruitment for the observational study was completed in 1998 and participants were followed annually for 8 to 12 years. Extension Studies: The original protocol allowed for follow-up until March 2005, after which participants were invited to enroll in the first WHI Extension Study for follow-up through 2010. Participants were invited again to participate in the second WHI Extension Study with continued follow up from 2010 to at least 2015. As of March 31, 2011 there were 93,122 women enrolled in the second extension. In Extension Study 2, the overall WHI study population was divided into two new subsamples, the Medical Records Cohort (MRC) and the Self-Report Cohort (SRC). The MRC consists of all former hormone trial participants and all African American and Hispanic participants from all study components. The SRC consists of the remaining participants. The extent of outcome information collected differs between the two cohorts, with more extensive outcomes information collection on the MRC. As part of Extension Study 2, selected older WHI participants were invited to participate in an In Person Visit (a.k.a., Long Life Study) at their homes during which additional blood samples were collected and various measurements were taken (such as blood pressure, height, weight, waist circumference, grip strength, etc.). In October 2015, Extension Study 2 was renewed with continued follow-up planned through October 2020, pending annual contract review and renewal. Additional Information: The WHI website, https://www.whi.org/about/SitePages/About%20WHI.aspx has much more information about the study. For WHI data collection forms used over the years, please see https://www.whi.org/researchers/studydoc/SitePages/Forms.aspx. For additional dataset documentation, see https://www.whi.org/researchers/data/Pages/Available%20Data.aspx. For data preparation and use, please refer to 'WHI dbGaP Cohort Data Release Data Preparation Guide May 2018' for additional details about the WHI data. The WHI Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000200 WHI Cohort. phs000386 WHI SHARe phs000281 GO-ESP WHISP phs000315 WHI GARNET phs000503 WHISE phs000227 PAGE WHI phs000675 WHIMS+ phs000746 WHI Harmonized and Imputed GWAS phs001334 WHI Metabolomics of CHD phs001335 WHI BA23 phs001614 WHI LLS Phase III GWAS Study Weblinks: Scientific Resources Website: Women's Health Initiative NHLBI Women's Health Initiative Study Design: Prospective Longitudinal Cohort Study Type: Partial Factorial Randomized Double-Blind Placebo-Controlled Cohort Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000200.v12.p3 on 2021-03-25 and may not include exact formatting or images." phs000200.v12.p3.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000209.v13.p3.c1 /programs/parent/projects/MESA_HMB_ MESA_HMB_ phs000209.v13.p3.c1 c1 HMB p3 phs000209 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000209.v13.p3 v13 Multi-Ethnic Study of Atherosclerosis (MESA) Cohort MESA_HMB_ parent-MESA_HMB_ Yes MESA "MESA The Multi-Ethnic Study of Atherosclerosis (MESA) is a study of the characteristics of subclinical cardiovascular disease (disease detected non-invasively before it has produced clinical signs and symptoms) and the risk factors that predict progression to clinically overt cardiovascular disease or progression of the subclinical disease. MESA researchers study a diverse, population-based sample of 6,814 asymptomatic men and women aged 45-84. Thirty-eight percent of the recruited participants are white, 28 percent African-American, 22 percent Hispanic, and 12 percent Asian, predominantly of Chinese descent. Participants were recruited from six field centers across the United States: Wake Forest University, Columbia University, Johns Hopkins University, University of Minnesota, Northwestern University and University of California - Los Angeles. Each participant received an extensive physical exam and determination of coronary calcification, ventricular mass and function, flow-mediated endothelial vasodilation, carotid intimal-medial wall thickness and presence of echogenic lucencies in the carotid artery, lower extremity vascular insufficiency, arterial wave forms, electrocardiographic (ECG) measures, standard coronary risk factors, sociodemographic factors, lifestyle factors, and psychosocial factors. Selected repetition of subclinical disease measures and risk factors at follow-up visits allows study of the progression of disease. Blood samples have been assayed for putative biochemical risk factors and stored for case-control studies. DNA has been extracted and lymphocytes cryopreserved (for possible immortalization) for study of candidate genes and possibly, genome-wide scanning, expression, and other genetic techniques. Participants are being followed for identification and characterization of cardiovascular disease events, including acute myocardial infarction and other forms of coronary heart disease (CHD), stroke, and congestive heart failure; for cardiovascular disease interventions; and for mortality. In addition to the six Field Centers, MESA involves a Coordinating Center, a Central Laboratory, and Central Reading Centers for Computed Tomography (CT), Magnetic Resonance Imaging (MRI), Ultrasound, and Electrocardiography (ECG). Protocol development, staff training, and pilot testing were performed in the first 18 months of the study. The first examination took place over two years, from July 2000 - July 2002. It was followed by four examination periods that were 17-20 months in length. Participants have been contacted every 9 to 12 months throughout the study to assess clinical morbidity and mortality. MESA Family The general goal of the MESA Family Study, an ancillary study to MESA funded by a grant from NHLBI, is to apply modern genetic analysis and genotyping methodologies to delineate the genetic determinants of early atherosclerosis. This is being accomplished by utilizing all the current organizational structures of the Multi-Ethnic Study of Atherosclerosis (MESA) and Genetic Centers at Cedars-Sinai Medical Center and University of Virginia. In the MESA Family Study, the goal is to locate and identify genes contributing to the genetic risk for cardiovascular disease (CVD), by looking at the early changes of atherosclerosis within families (mainly siblings). 2128 individuals from 594 families, yielding 3,026 sibpairs divided between African Americans and Hispanic-Americans, were recruited by utilizing the existing framework of MESA. MESA Family studied siblings of index subjects from the MESA study and from new sibpair families (with the same demographic characteristics) and is determining the extent of genetic contribution to the variation in coronary calcium (obtained via CT Scan) and carotid artery wall thickness (B-mode ultrasound) in the two largest non-majority U.S. populations. In a small proportion of subjects, parents of MESA index subjects participating in MESA Family were studied but only to have blood drawn for genotyping. The MESA Family cohort was recruited from the six MESA Field Centers. MESA Family participants underwent the same examination as MESA participants during May 2004 - May 2007. DNA was extracted and lymphocytes immortalized for study of candidate genes, genome-wide linkage scanning, and analyzed for linkage with these subclinical cardiovascular traits. While linkage analysis is the primary approach being used, an additional aspect of the MESA Family Study takes advantage of the existing MESA study population for testing a variety of candidate genes for association with the same subclinical traits. Genotyping and data analysis will occur throughout the study. MESA Air The general goal of the Multi-Ethnic Study of Atherosclerosis and Air Pollution ('MESA Air') is to prospectively examine the relation between an individual level assessment of long-term ambient air pollution exposures (including PM2.5 and the progression of subclinical cardiovascular disease in a multi-city, multi-ethnic cohort. MESA Air will also prospectively examine the relationship between an individual level assessment of long-term ambient air pollution exposures and the incidence of cardiovascular disease, including myocardial infarction and cardiovascular death. MESA AIR is funded by a grant from the United States Environmental Protection Agency to the University of Washington and subcontracts from the UW to other participating institutions. MESA Air will assess if ambient air pollution is associated with changes over time in subclinical measures of atherosclerosis and plasma markers of inflammation, oxidative damage, and endothelial activation in a longitudinal data model, adjusting for age, race/ethnicity, socioeconomic status, and specific cardiovascular risk factors (such as diabetes, hypertension, smoking, and diet). The study will similarly assess if the incidence of cardiovascular events is associated with long-term exposure to ambient air pollution, using a proportional hazards model. The study includes refinement of statistical tools, and explores joint/independent effects of acute and long-term pollutant exposure in the occurrence of cardiovascular disease. The MESA Air study is built on the foundation of the ongoing MESA study. The parent MESA Study cohort is located in six geographic areas ('Field Centers') that capture tremendous exposure heterogeneity, comparable to or greater than the variability in locations of prior U.S. cohort studies. In addition to the six Field Centers, the study involves a Coordinating Center, a Central Laboratory, and Reading Centers for Computed Tomography (CT), ultrasound and air pollution data. The cohort for the MESA Air study currently includes 6226 subjects: 5479 enrolled in the parent MESA study; 257 recruited specifically for this study, and 490 recruited from the MESA Family study. The entire MESA Air cohort will be followed over a 10-year project period for the occurrence of cardiovascular disease events. On two occasions over the ten-year study period, 3600 subjects from the MESA Air cohort, residing in nine locales, will undergo computed tomography scanning to assess presence and extent of coronary artery calcification (CAC), and ultrasound of the carotid artery to determine intima-media thickness (IMT). We will also repeatedly assess plasma markers of inflammation, oxidative damage, and endothelial function in 720 subjects. MESA Air adds state-of-the-art air pollution exposure assessment information to the MESA cohort study, and introduces new subjects and outcome measures to achieve our aims. The study will assess long-term individual-level exposure to ambient air pollutants for each subject using community-scale monitoring, outdoor spatial variation, subject proximity to pollution sources, pollutants' infiltration efficiency, and personal time-activity information. The exposure models will be validated using detailed monitoring in a subset of subjects. The MESA Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000209 MESA Cohort. phs000420 MESA SHARe phs000283 MESA CARe phs000403 MESA ESP Heart-GO Study Weblinks: MESA MESA Air Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Family Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000209.v13.p3 on 2021-03-25 and may not include exact formatting or images." phs000209.v13.p3.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000209.v13.p3.c2 /programs/parent/projects/MESA_HMB-NPU_ MESA_HMB-NPU_ phs000209.v13.p3.c2 c2 HMB-NPU p3 phs000209 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000209.v13.p3 v13 Multi-Ethnic Study of Atherosclerosis (MESA) Cohort MESA_HMB-NPU_ parent-MESA_HMB-NPU_ Yes MESA "MESA The Multi-Ethnic Study of Atherosclerosis (MESA) is a study of the characteristics of subclinical cardiovascular disease (disease detected non-invasively before it has produced clinical signs and symptoms) and the risk factors that predict progression to clinically overt cardiovascular disease or progression of the subclinical disease. MESA researchers study a diverse, population-based sample of 6,814 asymptomatic men and women aged 45-84. Thirty-eight percent of the recruited participants are white, 28 percent African-American, 22 percent Hispanic, and 12 percent Asian, predominantly of Chinese descent. Participants were recruited from six field centers across the United States: Wake Forest University, Columbia University, Johns Hopkins University, University of Minnesota, Northwestern University and University of California - Los Angeles. Each participant received an extensive physical exam and determination of coronary calcification, ventricular mass and function, flow-mediated endothelial vasodilation, carotid intimal-medial wall thickness and presence of echogenic lucencies in the carotid artery, lower extremity vascular insufficiency, arterial wave forms, electrocardiographic (ECG) measures, standard coronary risk factors, sociodemographic factors, lifestyle factors, and psychosocial factors. Selected repetition of subclinical disease measures and risk factors at follow-up visits allows study of the progression of disease. Blood samples have been assayed for putative biochemical risk factors and stored for case-control studies. DNA has been extracted and lymphocytes cryopreserved (for possible immortalization) for study of candidate genes and possibly, genome-wide scanning, expression, and other genetic techniques. Participants are being followed for identification and characterization of cardiovascular disease events, including acute myocardial infarction and other forms of coronary heart disease (CHD), stroke, and congestive heart failure; for cardiovascular disease interventions; and for mortality. In addition to the six Field Centers, MESA involves a Coordinating Center, a Central Laboratory, and Central Reading Centers for Computed Tomography (CT), Magnetic Resonance Imaging (MRI), Ultrasound, and Electrocardiography (ECG). Protocol development, staff training, and pilot testing were performed in the first 18 months of the study. The first examination took place over two years, from July 2000 - July 2002. It was followed by four examination periods that were 17-20 months in length. Participants have been contacted every 9 to 12 months throughout the study to assess clinical morbidity and mortality. MESA Family The general goal of the MESA Family Study, an ancillary study to MESA funded by a grant from NHLBI, is to apply modern genetic analysis and genotyping methodologies to delineate the genetic determinants of early atherosclerosis. This is being accomplished by utilizing all the current organizational structures of the Multi-Ethnic Study of Atherosclerosis (MESA) and Genetic Centers at Cedars-Sinai Medical Center and University of Virginia. In the MESA Family Study, the goal is to locate and identify genes contributing to the genetic risk for cardiovascular disease (CVD), by looking at the early changes of atherosclerosis within families (mainly siblings). 2128 individuals from 594 families, yielding 3,026 sibpairs divided between African Americans and Hispanic-Americans, were recruited by utilizing the existing framework of MESA. MESA Family studied siblings of index subjects from the MESA study and from new sibpair families (with the same demographic characteristics) and is determining the extent of genetic contribution to the variation in coronary calcium (obtained via CT Scan) and carotid artery wall thickness (B-mode ultrasound) in the two largest non-majority U.S. populations. In a small proportion of subjects, parents of MESA index subjects participating in MESA Family were studied but only to have blood drawn for genotyping. The MESA Family cohort was recruited from the six MESA Field Centers. MESA Family participants underwent the same examination as MESA participants during May 2004 - May 2007. DNA was extracted and lymphocytes immortalized for study of candidate genes, genome-wide linkage scanning, and analyzed for linkage with these subclinical cardiovascular traits. While linkage analysis is the primary approach being used, an additional aspect of the MESA Family Study takes advantage of the existing MESA study population for testing a variety of candidate genes for association with the same subclinical traits. Genotyping and data analysis will occur throughout the study. MESA Air The general goal of the Multi-Ethnic Study of Atherosclerosis and Air Pollution ('MESA Air') is to prospectively examine the relation between an individual level assessment of long-term ambient air pollution exposures (including PM2.5 and the progression of subclinical cardiovascular disease in a multi-city, multi-ethnic cohort. MESA Air will also prospectively examine the relationship between an individual level assessment of long-term ambient air pollution exposures and the incidence of cardiovascular disease, including myocardial infarction and cardiovascular death. MESA AIR is funded by a grant from the United States Environmental Protection Agency to the University of Washington and subcontracts from the UW to other participating institutions. MESA Air will assess if ambient air pollution is associated with changes over time in subclinical measures of atherosclerosis and plasma markers of inflammation, oxidative damage, and endothelial activation in a longitudinal data model, adjusting for age, race/ethnicity, socioeconomic status, and specific cardiovascular risk factors (such as diabetes, hypertension, smoking, and diet). The study will similarly assess if the incidence of cardiovascular events is associated with long-term exposure to ambient air pollution, using a proportional hazards model. The study includes refinement of statistical tools, and explores joint/independent effects of acute and long-term pollutant exposure in the occurrence of cardiovascular disease. The MESA Air study is built on the foundation of the ongoing MESA study. The parent MESA Study cohort is located in six geographic areas ('Field Centers') that capture tremendous exposure heterogeneity, comparable to or greater than the variability in locations of prior U.S. cohort studies. In addition to the six Field Centers, the study involves a Coordinating Center, a Central Laboratory, and Reading Centers for Computed Tomography (CT), ultrasound and air pollution data. The cohort for the MESA Air study currently includes 6226 subjects: 5479 enrolled in the parent MESA study; 257 recruited specifically for this study, and 490 recruited from the MESA Family study. The entire MESA Air cohort will be followed over a 10-year project period for the occurrence of cardiovascular disease events. On two occasions over the ten-year study period, 3600 subjects from the MESA Air cohort, residing in nine locales, will undergo computed tomography scanning to assess presence and extent of coronary artery calcification (CAC), and ultrasound of the carotid artery to determine intima-media thickness (IMT). We will also repeatedly assess plasma markers of inflammation, oxidative damage, and endothelial function in 720 subjects. MESA Air adds state-of-the-art air pollution exposure assessment information to the MESA cohort study, and introduces new subjects and outcome measures to achieve our aims. The study will assess long-term individual-level exposure to ambient air pollutants for each subject using community-scale monitoring, outdoor spatial variation, subject proximity to pollution sources, pollutants' infiltration efficiency, and personal time-activity information. The exposure models will be validated using detailed monitoring in a subset of subjects. The MESA Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000209 MESA Cohort. phs000420 MESA SHARe phs000283 MESA CARe phs000403 MESA ESP Heart-GO Study Weblinks: MESA MESA Air Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Family Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000209.v13.p3 on 2021-03-25 and may not include exact formatting or images." phs000209.v13.p3.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000284.v2.p1.c1 /programs/parent/projects/CFS_DS-HLBS-IRB-NPU_ CFS_DS-HLBS-IRB-NPU_ phs000284.v2.p1.c1 c1 DS-HLBS-IRB-NPU p1 phs000284 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000284.v2.p1 v2 NHLBI Cleveland Family Study (CFS) Candidate Gene Association Resource (CARe) CFS_DS-HLBS-IRB-NPU_ parent-CFS_DS-HLBS-IRB-NPU_ Yes CFS The Cleveland Family Study is the largest family-based study of sleep apnea world-wide, consisting of 2284 individuals (46% African American) from 361 families studied on up to 4 occasions over a period of 16 years. The study was begun in 1990 with the initial aims of quantifying the familial aggregation of sleep apnea. NIH renewals provided expansion of the original cohort (including increased minority recruitment) and longitudinal follow-up, with the last exam occurring in February 2006. Index probands (n=275) were recruited from 3 area hospital sleep labs if they had a confirmed diagnosis of sleep apnea and at least 2 first-degree relatives available to be studied. In the first 5 years of the study, neighborhood control probands (n=87) with at least 2 living relatives available for study were selected at random from a list provided by the index family and also studied. All available first degree relatives and spouses of the case and control probands also were recruited. Second-degree relatives, including half-sibs, aunts, uncles and grandparents, were also included if they lived near the first degree relatives (cases or controls), or if the family had been found to have two or more relatives with sleep apnea. Blood was sampled and DNA isolated for participants seen in the last two exam cycles (n=1447). The sample, which is enriched with individuals with sleep apnea, also contains a high prevalence of individuals with sleep apnea-related traits, including: obesity, impaired glucose tolerance, and HTN. Phenotyping data have been collected over 4 exam cycles, each occurring ~every 4 years. The last three exams targeted all subjects who had been studied at earlier exams, as well as new minority families and family members of previously studied probands who had been unavailable at prior exams. Data from one, two, three and four visits are available for 412, 630, 329 and 67, participants, respectively. In the first 3 exams, participants underwent overnight in-home sleep studies, allowing determination of the number and duration of hypopneas and apneas, sleep period, heart rate, and oxygen saturation levels; anthropometry (weight, height, and waist, hip, and neck circumferences); resting blood pressure; spirometry; standardized questionnaire evaluation of symptoms, medications, sleep patterns, quality of life, daytime sleepiness measures and health history; venipuncture and measurement of total and HDL cholesterol. The 4th exam (2001-2006) was designed to collect more detailed measurements of sleep, metabolic and CVD phenotypes and included measurement of state-of-the-art polysomnography, with both collection of blood and measurement of blood pressure before and after sleep, and anthropometry, upper airway assessments, spirometry, exhaled nitric oxide, and ECG performed the morning after the sleep study. Data have been collected by trained research assistants or GCRC nurses following written Manuals of Procedures who were certified following standard approaches for each study procedure. Ongoing data quality, with assessment of within or between individual drift, has been monitored on an ongoing basis, using statistical techniques as well as regular re-certification procedures. Between and within scorer reliabilities for key sleep apnea indices have been excellent, with intra-class correlation coefficients (ICCs) exceeding 0.92 for the apnea-hypopnea index (AHI). Sleep staging, assessed with epoch specific comparisons, also demonstrate excellent reliability for stage identification (kappas>0.82). There has been no evidence of significant time trends-between or within scorers- for the AHI variables. We also have evaluated the night-to-night variability of the AHI and other sleep variables in 91 subjects, with each measurement made 1-3 months apart. There is high night to night consistency for the AHI (ICC: 0.80), the arousal index (0.76), and the % sleep time in slow-wave sleep (0.73). We have demonstrated the comparability of the apnea estimates (AHI) determined from limited channel studies obtained at in-home settings with in full in-laboratory polysomnography. In addition to our published validation study, we more recently compared the AHI in 169 Cleveland Family Study participants undergoing both assessments (in-home and in-laboratory) within one week apart. These showed excellent levels of agreement (ICC=0.83), demonstrating the feasibility of examining data from either in-home or in-laboratory studies for apnea phenotyping. Data collected in the GCRC were obtained, when possible, with comparable, if not identical techniques, as were the same measures collected at prior exams performed in the participants' homes. To address the comparability of data collected over different exams, we calculated the crude age-adjusted correlations ~3 year within individual correlations between measures made in the most recent GCRC exam with measures made in a prior exam and demonstrated excellent levels of agreement for BMI (r=.91); waist circumference (0.91); FVC (0.88); and FEV1 (0.86). As expected due to higher biological and measurement variability, 149 somewhat lower 3-year correlations were demonstrated for SBP (0.56); Diastolic BP (0.48); AHI (0.62); and nocturnal oxygen desaturation (0.60). NHLBI Candidate-gene Association Resource. The NHLBI initiated the Candidate gene Association Resource (CARe) to create a shared genotype/phenotype resource for analyses of the association of genotypes with phenotypes relevant to the mission of the NHLBI. The resource comprises nine cohort studies funded by the NHLBI: Atherosclerosis Risk in Communities (ARIC), Cardiovascular Health Study (CHS), Cleveland Family Study (CFS), Coronary Artery Risk Development in Young Adults (CARDIA), Cooperative Study of Sickle Cell Disease (CSSCD), Framingham Heart Study (FHS), Jackson Heart Study (JHS), Multi-Ethnic Study of Atherosclerosis (MESA), and the Sleep Heart Health Study (SHHS). A database of genotype and phenotype data will be created that includes records for approximately 50,000 study participants with approximately 50,000 SNPs from more than 1,200 selected candidate genes. In addition, a genome wide association study using a 1,000K SNP Chip will be conducted on approximately 9,500 African American participants drawn from the 50,000 participants in the nine cohorts. Some relevant CARe publications CARe Study: PMID 20400780 CVD Chip Design: PMID 18974833 Study Weblinks: Cleveland Family Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000284.v2.p1 on 2021-03-25 and may not include exact formatting or images. phs000284.v2.p1.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000285.v3.p2.c1 /programs/parent/projects/CARDIA_HMB-IRB_ CARDIA_HMB-IRB_ phs000285.v3.p2.c1 c1 HMB-IRB p2 phs000285 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000285.v3.p2 v3 Coronary Artery Risk Development in Young Adults (CARDIA) Study - Cohort CARDIA_HMB-IRB_ parent-CARDIA_HMB-IRB_ Yes CARDIA "CARDIA is a study examining the etiology and natural history of cardiovascular disease beginning in young adulthood. In 1985-1986, a cohort of 5115 healthy black and white men and women aged 18-30 years were selected to have approximately the same number of people in subgroups of age (18-24 and 25-30), sex, race, and education (high school or less and more than high school) within each of four US Field Centers. These same participants were asked to participate in follow-up examinations during 1987-1988 (Year 2), 1990-1991 (Year 5), 1992-1993 (Year 7), 1995-1996 (Year 10), 2000-2001 (Year 15), 2005-2006 (Year 20), and 2010-2011 (Year 25); the proportions of the surviving cohort that have returned for the seven follow-up examinations were 90%, 86%, 81%, 79%, 74%, 72%, and 72%, respectively. In addition to the follow-up examinations, participants are contacted regularly for the ascertainment of information on out-patient procedures and hospitalizations experienced between contacts. Within the past five years, 95% of the original surviving cohort has been contacted. While the specifics of each examination has differed somewhat, data have been collected on a variety of factors believed to be related to heart disease. These include conditions with clear links to heart disease such as blood pressure, cholesterol and other lipids. Data have also been collected on physical measurements such as weight and skinfold fat as well as lifestyle factors such as substance use (tobacco and alcohol), dietary and exercise patterns, behavioral and psychological variables, medical and family history, and other chemistries (e.g., insulin and glucose). In addition, subclinical atherosclerosis was measured via echocardiography during Years 5, 10, and 25, computed tomography during Years 15 and 20, and carotid ultrasound during Year 20. The CARDIA Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" box located on the right hand side of this top-level study page phs000285 CARDIA Cohort. phs000236 PAGE_CALiCo_CARDIA phs000309 GENEVA_CARDIA phs000399 GO-ESP HeartGO_CARDIA phs000613 CARDIA_CARe Study Weblinks: CARDIA Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000285.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs000285.v3.p2.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000285.v3.p2.c2 /programs/parent/projects/CARDIA_HMB-IRB-NPU_ CARDIA_HMB-IRB-NPU_ phs000285.v3.p2.c2 c2 HMB-IRB-NPU p2 phs000285 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000285.v3.p2 v3 Coronary Artery Risk Development in Young Adults (CARDIA) Study - Cohort CARDIA_HMB-IRB-NPU_ parent-CARDIA_HMB-IRB-NPU_ Yes CARDIA "CARDIA is a study examining the etiology and natural history of cardiovascular disease beginning in young adulthood. In 1985-1986, a cohort of 5115 healthy black and white men and women aged 18-30 years were selected to have approximately the same number of people in subgroups of age (18-24 and 25-30), sex, race, and education (high school or less and more than high school) within each of four US Field Centers. These same participants were asked to participate in follow-up examinations during 1987-1988 (Year 2), 1990-1991 (Year 5), 1992-1993 (Year 7), 1995-1996 (Year 10), 2000-2001 (Year 15), 2005-2006 (Year 20), and 2010-2011 (Year 25); the proportions of the surviving cohort that have returned for the seven follow-up examinations were 90%, 86%, 81%, 79%, 74%, 72%, and 72%, respectively. In addition to the follow-up examinations, participants are contacted regularly for the ascertainment of information on out-patient procedures and hospitalizations experienced between contacts. Within the past five years, 95% of the original surviving cohort has been contacted. While the specifics of each examination has differed somewhat, data have been collected on a variety of factors believed to be related to heart disease. These include conditions with clear links to heart disease such as blood pressure, cholesterol and other lipids. Data have also been collected on physical measurements such as weight and skinfold fat as well as lifestyle factors such as substance use (tobacco and alcohol), dietary and exercise patterns, behavioral and psychological variables, medical and family history, and other chemistries (e.g., insulin and glucose). In addition, subclinical atherosclerosis was measured via echocardiography during Years 5, 10, and 25, computed tomography during Years 15 and 20, and carotid ultrasound during Year 20. The CARDIA Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" box located on the right hand side of this top-level study page phs000285 CARDIA Cohort. phs000236 PAGE_CALiCo_CARDIA phs000309 GENEVA_CARDIA phs000399 GO-ESP HeartGO_CARDIA phs000613 CARDIA_CARe Study Weblinks: CARDIA Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000285.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs000285.v3.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000286.v6.p2.c1 /programs/parent/projects/JHS_HMB-IRB-NPU_ JHS_HMB-IRB-NPU_ phs000286.v6.p2.c1 c1 HMB-IRB-NPU p2 phs000286 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 v6 Jackson Heart Study (JHS) Cohort JHS_HMB-IRB-NPU_ parent-JHS_HMB-IRB-NPU_ Yes JHS "The Jackson Heart Study (JHS) is a large, community-based, observational study whose participants were recruited from urban and rural areas of the three counties (Hinds, Madison and Rankin) that make up the Jackson, MS metropolitan statistical area (MSA). Participants were enrolled from each of 4 recruitment pools: random, 17%; volunteer, 30%; currently enrolled in the Atherosclerosis Risk in Communities (ARIC) Study, 31% and secondary family members, 22%. The final cohort of 5,306 participants included 6.59% of all African American Jackson MSA residents aged 35-84 during the baseline exam (N-76,426, US Census 2000). Among these, approximately 3,600 gave consent that allows genetic research and deposition of data into dbGaP. Major components of three clinic examinations (Exam 1 - 2000-2004; Exam 2 - 2005-2008; Exam 3 - 2009-2013) include medical history, physical examination, blood/urine analytes and interview questions on areas such as: physical activity; stress, coping and spirituality; racism and discrimination; socioeconomic position; and access to health care. Extensive clinical phenotyping includes anthropometrics, electrocardiography, carotid ultrasound, ankle-brachial blood pressure index, echocardiography, CT chest and abdomen for coronary and aortic calcification, liver fat, and subcutaneous and visceral fat measurement, and cardiac MRI. At 12-month intervals after the baseline clinic visit (Exam 1), participants have been contacted by telephone to: update information; confirm vital statistics; document interim medical events, hospitalizations, and functional status; and obtain additional sociocultural information. Questions about medical events, symptoms of cardiovascular disease and functional status are repeated annually. Ongoing cohort surveillance includes abstraction of medical records and death certificates for relevant International Classification of Diseases (ICD) codes and adjudication of nonfatal events and deaths. CMS data are currently being incorporated into the dataset. A note regarding date variables warehoused in the Jackson Heart Study (JHS) Cohort on dbGaP: The coordinating center has developed an algorithm that will systematically review and de-identify any of the (nearly 100) date-related variable types stored in the data package. To simultaneously minimize (i) de-identifiability of the data and (ii) impact on analyses utilizing sensitive data elements, a participant-level random number was generated to avoid the necessity of sharing any potentially sensitive data. The coordinating center maintains an archived linkage of these data in their raw form and regularly reviews ad hoc requests to utilize the raw data on a project-by-project basis. The JHS Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this of this top-level study page phs000286 JHS Cohort. phs000402 HeartGO JHS phs000498 JHS Allelic Spectrum Seq phs000499 JHS CARe phs001098 T2D GENES Exome Seq phs001069 MIGen JHS phs001356 Exome Chip Study Weblinks: Jackson Heart Study JHS Publications Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000286.v6.p2.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000286.v6.p2.c2 /programs/parent/projects/JHS_DS-FDO-IRB-NPU_ JHS_DS-FDO-IRB-NPU_ phs000286.v6.p2.c2 c2 DS-FDO-IRB-NPU p2 phs000286 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 v6 Jackson Heart Study (JHS) Cohort JHS_DS-FDO-IRB-NPU_ parent-JHS_DS-FDO-IRB-NPU_ Yes JHS "The Jackson Heart Study (JHS) is a large, community-based, observational study whose participants were recruited from urban and rural areas of the three counties (Hinds, Madison and Rankin) that make up the Jackson, MS metropolitan statistical area (MSA). Participants were enrolled from each of 4 recruitment pools: random, 17%; volunteer, 30%; currently enrolled in the Atherosclerosis Risk in Communities (ARIC) Study, 31% and secondary family members, 22%. The final cohort of 5,306 participants included 6.59% of all African American Jackson MSA residents aged 35-84 during the baseline exam (N-76,426, US Census 2000). Among these, approximately 3,600 gave consent that allows genetic research and deposition of data into dbGaP. Major components of three clinic examinations (Exam 1 - 2000-2004; Exam 2 - 2005-2008; Exam 3 - 2009-2013) include medical history, physical examination, blood/urine analytes and interview questions on areas such as: physical activity; stress, coping and spirituality; racism and discrimination; socioeconomic position; and access to health care. Extensive clinical phenotyping includes anthropometrics, electrocardiography, carotid ultrasound, ankle-brachial blood pressure index, echocardiography, CT chest and abdomen for coronary and aortic calcification, liver fat, and subcutaneous and visceral fat measurement, and cardiac MRI. At 12-month intervals after the baseline clinic visit (Exam 1), participants have been contacted by telephone to: update information; confirm vital statistics; document interim medical events, hospitalizations, and functional status; and obtain additional sociocultural information. Questions about medical events, symptoms of cardiovascular disease and functional status are repeated annually. Ongoing cohort surveillance includes abstraction of medical records and death certificates for relevant International Classification of Diseases (ICD) codes and adjudication of nonfatal events and deaths. CMS data are currently being incorporated into the dataset. A note regarding date variables warehoused in the Jackson Heart Study (JHS) Cohort on dbGaP: The coordinating center has developed an algorithm that will systematically review and de-identify any of the (nearly 100) date-related variable types stored in the data package. To simultaneously minimize (i) de-identifiability of the data and (ii) impact on analyses utilizing sensitive data elements, a participant-level random number was generated to avoid the necessity of sharing any potentially sensitive data. The coordinating center maintains an archived linkage of these data in their raw form and regularly reviews ad hoc requests to utilize the raw data on a project-by-project basis. The JHS Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this of this top-level study page phs000286 JHS Cohort. phs000402 HeartGO JHS phs000498 JHS Allelic Spectrum Seq phs000499 JHS CARe phs001098 T2D GENES Exome Seq phs001069 MIGen JHS phs001356 Exome Chip Study Weblinks: Jackson Heart Study JHS Publications Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000286.v6.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000286.v6.p2.c3 /programs/parent/projects/JHS_HMB-IRB_ JHS_HMB-IRB_ phs000286.v6.p2.c3 c3 HMB-IRB p2 phs000286 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 v6 Jackson Heart Study (JHS) Cohort JHS_HMB-IRB_ parent-JHS_HMB-IRB_ Yes JHS "The Jackson Heart Study (JHS) is a large, community-based, observational study whose participants were recruited from urban and rural areas of the three counties (Hinds, Madison and Rankin) that make up the Jackson, MS metropolitan statistical area (MSA). Participants were enrolled from each of 4 recruitment pools: random, 17%; volunteer, 30%; currently enrolled in the Atherosclerosis Risk in Communities (ARIC) Study, 31% and secondary family members, 22%. The final cohort of 5,306 participants included 6.59% of all African American Jackson MSA residents aged 35-84 during the baseline exam (N-76,426, US Census 2000). Among these, approximately 3,600 gave consent that allows genetic research and deposition of data into dbGaP. Major components of three clinic examinations (Exam 1 - 2000-2004; Exam 2 - 2005-2008; Exam 3 - 2009-2013) include medical history, physical examination, blood/urine analytes and interview questions on areas such as: physical activity; stress, coping and spirituality; racism and discrimination; socioeconomic position; and access to health care. Extensive clinical phenotyping includes anthropometrics, electrocardiography, carotid ultrasound, ankle-brachial blood pressure index, echocardiography, CT chest and abdomen for coronary and aortic calcification, liver fat, and subcutaneous and visceral fat measurement, and cardiac MRI. At 12-month intervals after the baseline clinic visit (Exam 1), participants have been contacted by telephone to: update information; confirm vital statistics; document interim medical events, hospitalizations, and functional status; and obtain additional sociocultural information. Questions about medical events, symptoms of cardiovascular disease and functional status are repeated annually. Ongoing cohort surveillance includes abstraction of medical records and death certificates for relevant International Classification of Diseases (ICD) codes and adjudication of nonfatal events and deaths. CMS data are currently being incorporated into the dataset. A note regarding date variables warehoused in the Jackson Heart Study (JHS) Cohort on dbGaP: The coordinating center has developed an algorithm that will systematically review and de-identify any of the (nearly 100) date-related variable types stored in the data package. To simultaneously minimize (i) de-identifiability of the data and (ii) impact on analyses utilizing sensitive data elements, a participant-level random number was generated to avoid the necessity of sharing any potentially sensitive data. The coordinating center maintains an archived linkage of these data in their raw form and regularly reviews ad hoc requests to utilize the raw data on a project-by-project basis. The JHS Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this of this top-level study page phs000286 JHS Cohort. phs000402 HeartGO JHS phs000498 JHS Allelic Spectrum Seq phs000499 JHS CARe phs001098 T2D GENES Exome Seq phs001069 MIGen JHS phs001356 Exome Chip Study Weblinks: Jackson Heart Study JHS Publications Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000286.v6.p2.c3 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000286.v6.p2.c4 /programs/parent/projects/JHS_DS-FDO-IRB_ JHS_DS-FDO-IRB_ phs000286.v6.p2.c4 c4 DS-FDO-IRB p2 phs000286 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 v6 Jackson Heart Study (JHS) Cohort JHS_DS-FDO-IRB_ parent-JHS_DS-FDO-IRB_ Yes JHS "The Jackson Heart Study (JHS) is a large, community-based, observational study whose participants were recruited from urban and rural areas of the three counties (Hinds, Madison and Rankin) that make up the Jackson, MS metropolitan statistical area (MSA). Participants were enrolled from each of 4 recruitment pools: random, 17%; volunteer, 30%; currently enrolled in the Atherosclerosis Risk in Communities (ARIC) Study, 31% and secondary family members, 22%. The final cohort of 5,306 participants included 6.59% of all African American Jackson MSA residents aged 35-84 during the baseline exam (N-76,426, US Census 2000). Among these, approximately 3,600 gave consent that allows genetic research and deposition of data into dbGaP. Major components of three clinic examinations (Exam 1 - 2000-2004; Exam 2 - 2005-2008; Exam 3 - 2009-2013) include medical history, physical examination, blood/urine analytes and interview questions on areas such as: physical activity; stress, coping and spirituality; racism and discrimination; socioeconomic position; and access to health care. Extensive clinical phenotyping includes anthropometrics, electrocardiography, carotid ultrasound, ankle-brachial blood pressure index, echocardiography, CT chest and abdomen for coronary and aortic calcification, liver fat, and subcutaneous and visceral fat measurement, and cardiac MRI. At 12-month intervals after the baseline clinic visit (Exam 1), participants have been contacted by telephone to: update information; confirm vital statistics; document interim medical events, hospitalizations, and functional status; and obtain additional sociocultural information. Questions about medical events, symptoms of cardiovascular disease and functional status are repeated annually. Ongoing cohort surveillance includes abstraction of medical records and death certificates for relevant International Classification of Diseases (ICD) codes and adjudication of nonfatal events and deaths. CMS data are currently being incorporated into the dataset. A note regarding date variables warehoused in the Jackson Heart Study (JHS) Cohort on dbGaP: The coordinating center has developed an algorithm that will systematically review and de-identify any of the (nearly 100) date-related variable types stored in the data package. To simultaneously minimize (i) de-identifiability of the data and (ii) impact on analyses utilizing sensitive data elements, a participant-level random number was generated to avoid the necessity of sharing any potentially sensitive data. The coordinating center maintains an archived linkage of these data in their raw form and regularly reviews ad hoc requests to utilize the raw data on a project-by-project basis. The JHS Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this of this top-level study page phs000286 JHS Cohort. phs000402 HeartGO JHS phs000498 JHS Allelic Spectrum Seq phs000499 JHS CARe phs001098 T2D GENES Exome Seq phs001069 MIGen JHS phs001356 Exome Chip Study Weblinks: Jackson Heart Study JHS Publications Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000286.v6.p2 on 2021-03-25 and may not include exact formatting or images." phs000286.v6.p2.c4 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000287.v7.p1.c1 /programs/parent/projects/CHS_HMB-MDS_ CHS_HMB-MDS_ phs000287.v7.p1.c1 c1 HMB-MDS p1 phs000287 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 v7 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older CHS_HMB-MDS_ parent-CHS_HMB-MDS_ Yes CHS "The Cardiovascular Health Study (CHS) is a prospective study of risk factors for development and progression of CHD and stroke in people aged 65 years and older. The 5,888 study participants were recruited from four U.S. communities and have undergone extensive clinic examinations for evaluation of markers of subclinical cardiovascular disease. The original cohort, enrolled in 1989-90, totaled 5,201 participants. A supplemental cohort of 687 predominantly African-American participants was enrolled in 1992-93. Clinic examinations were performed at study baseline and at annual visits through 1998-1999, and again in 2005-2006. Examination components included medical and personal history, medication inventory, ECG, blood pressure, anthropometry, assessment of physical and cognitive function, and depression screening. Other components done less frequently included phlebotomy, spirometry, echocardiography, carotid ultrasound, cerebral magnetic resonance imaging, measurement of ankle-brachial index and retinal exam. Participants were contacted by telephone annually between exams to collect information about hospitalizations and potential cardiovascular events. Since 1999, participants have been contacted every six months by phone, primarily to identify cardiovascular events and to assess physical and cognitive health. Standard protocols for the identification and adjudication of events were implemented during follow-up. The adjudicated events are myocardial infarction, angina, heart failure (HF), stroke, transient ischemic attack (TIA), claudication and mortality.The Cardiovascular Health Study Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000287 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older. phs000226 STAMPEED: Cardiovascular Health Study (CHS) phs000301 PAGE: CaLiCo: Cardiovascular Health Study (CHS) phs000377 CARe: Candidate Gene Association Resource (CARe) phs000400 GO-ESP: Heart Cohorts Exome Sequencing Project (CHS) phs000667 CHARGE: Cardiovascular Health Study (CHS) Study Weblinks: CHS Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 on 2021-03-25 and may not include exact formatting or images." phs000287.v7.p1.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000287.v7.p1.c2 /programs/parent/projects/CHS_HMB-NPU-MDS_ CHS_HMB-NPU-MDS_ phs000287.v7.p1.c2 c2 HMB-NPU-MDS p1 phs000287 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 v7 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older CHS_HMB-NPU-MDS_ parent-CHS_HMB-NPU-MDS_ Yes CHS "The Cardiovascular Health Study (CHS) is a prospective study of risk factors for development and progression of CHD and stroke in people aged 65 years and older. The 5,888 study participants were recruited from four U.S. communities and have undergone extensive clinic examinations for evaluation of markers of subclinical cardiovascular disease. The original cohort, enrolled in 1989-90, totaled 5,201 participants. A supplemental cohort of 687 predominantly African-American participants was enrolled in 1992-93. Clinic examinations were performed at study baseline and at annual visits through 1998-1999, and again in 2005-2006. Examination components included medical and personal history, medication inventory, ECG, blood pressure, anthropometry, assessment of physical and cognitive function, and depression screening. Other components done less frequently included phlebotomy, spirometry, echocardiography, carotid ultrasound, cerebral magnetic resonance imaging, measurement of ankle-brachial index and retinal exam. Participants were contacted by telephone annually between exams to collect information about hospitalizations and potential cardiovascular events. Since 1999, participants have been contacted every six months by phone, primarily to identify cardiovascular events and to assess physical and cognitive health. Standard protocols for the identification and adjudication of events were implemented during follow-up. The adjudicated events are myocardial infarction, angina, heart failure (HF), stroke, transient ischemic attack (TIA), claudication and mortality.The Cardiovascular Health Study Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000287 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older. phs000226 STAMPEED: Cardiovascular Health Study (CHS) phs000301 PAGE: CaLiCo: Cardiovascular Health Study (CHS) phs000377 CARe: Candidate Gene Association Resource (CARe) phs000400 GO-ESP: Heart Cohorts Exome Sequencing Project (CHS) phs000667 CHARGE: Cardiovascular Health Study (CHS) Study Weblinks: CHS Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 on 2021-03-25 and may not include exact formatting or images." phs000287.v7.p1.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000287.v7.p1.c3 /programs/parent/projects/CHS_DS-CVD-MDS_ CHS_DS-CVD-MDS_ phs000287.v7.p1.c3 c3 DS-CVD-MDS p1 phs000287 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 v7 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older CHS_DS-CVD-MDS_ parent-CHS_DS-CVD-MDS_ Yes CHS "The Cardiovascular Health Study (CHS) is a prospective study of risk factors for development and progression of CHD and stroke in people aged 65 years and older. The 5,888 study participants were recruited from four U.S. communities and have undergone extensive clinic examinations for evaluation of markers of subclinical cardiovascular disease. The original cohort, enrolled in 1989-90, totaled 5,201 participants. A supplemental cohort of 687 predominantly African-American participants was enrolled in 1992-93. Clinic examinations were performed at study baseline and at annual visits through 1998-1999, and again in 2005-2006. Examination components included medical and personal history, medication inventory, ECG, blood pressure, anthropometry, assessment of physical and cognitive function, and depression screening. Other components done less frequently included phlebotomy, spirometry, echocardiography, carotid ultrasound, cerebral magnetic resonance imaging, measurement of ankle-brachial index and retinal exam. Participants were contacted by telephone annually between exams to collect information about hospitalizations and potential cardiovascular events. Since 1999, participants have been contacted every six months by phone, primarily to identify cardiovascular events and to assess physical and cognitive health. Standard protocols for the identification and adjudication of events were implemented during follow-up. The adjudicated events are myocardial infarction, angina, heart failure (HF), stroke, transient ischemic attack (TIA), claudication and mortality.The Cardiovascular Health Study Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000287 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older. phs000226 STAMPEED: Cardiovascular Health Study (CHS) phs000301 PAGE: CaLiCo: Cardiovascular Health Study (CHS) phs000377 CARe: Candidate Gene Association Resource (CARe) phs000400 GO-ESP: Heart Cohorts Exome Sequencing Project (CHS) phs000667 CHARGE: Cardiovascular Health Study (CHS) Study Weblinks: CHS Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 on 2021-03-25 and may not include exact formatting or images." phs000287.v7.p1.c3 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000287.v7.p1.c4 /programs/parent/projects/CHS_DS-CVD-NPU-MDS_ CHS_DS-CVD-NPU-MDS_ phs000287.v7.p1.c4 c4 DS-CVD-NPU-MDS p1 phs000287 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 v7 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older CHS_DS-CVD-NPU-MDS_ parent-CHS_DS-CVD-NPU-MDS_ Yes CHS "The Cardiovascular Health Study (CHS) is a prospective study of risk factors for development and progression of CHD and stroke in people aged 65 years and older. The 5,888 study participants were recruited from four U.S. communities and have undergone extensive clinic examinations for evaluation of markers of subclinical cardiovascular disease. The original cohort, enrolled in 1989-90, totaled 5,201 participants. A supplemental cohort of 687 predominantly African-American participants was enrolled in 1992-93. Clinic examinations were performed at study baseline and at annual visits through 1998-1999, and again in 2005-2006. Examination components included medical and personal history, medication inventory, ECG, blood pressure, anthropometry, assessment of physical and cognitive function, and depression screening. Other components done less frequently included phlebotomy, spirometry, echocardiography, carotid ultrasound, cerebral magnetic resonance imaging, measurement of ankle-brachial index and retinal exam. Participants were contacted by telephone annually between exams to collect information about hospitalizations and potential cardiovascular events. Since 1999, participants have been contacted every six months by phone, primarily to identify cardiovascular events and to assess physical and cognitive health. Standard protocols for the identification and adjudication of events were implemented during follow-up. The adjudicated events are myocardial infarction, angina, heart failure (HF), stroke, transient ischemic attack (TIA), claudication and mortality.The Cardiovascular Health Study Cohort is utilized in the following dbGaP substudies. To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000287 Cardiovascular Health Study (CHS) Cohort: an NHLBI-funded observational study of risk factors for cardiovascular disease in adults 65 years or older. phs000226 STAMPEED: Cardiovascular Health Study (CHS) phs000301 PAGE: CaLiCo: Cardiovascular Health Study (CHS) phs000377 CARe: Candidate Gene Association Resource (CARe) phs000400 GO-ESP: Heart Cohorts Exome Sequencing Project (CHS) phs000667 CHARGE: Cardiovascular Health Study (CHS) Study Weblinks: CHS Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000287.v7.p1 on 2021-03-25 and may not include exact formatting or images." phs000287.v7.p1.c4 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000289.v2.p1.c1 /programs/parent/projects/Mayo_VTE_GRU_ Mayo_VTE_GRU_ phs000289.v2.p1.c1 c1 GRU p1 phs000289 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000289.v2.p1 v2 National Human Genome Research Institute (NHGRI) GENEVA Genome-Wide Association Study of Venous Thrombosis (GWAS of VTE) Mayo_VTE_GRU_ parent-Mayo_VTE_GRU_ Yes Mayo_VTE "Overview: Our overall long-term goal is to determine risk factors for the complex (multifactorial) disease, venous thromboembolism (VTE), that will allow physicians to stratify individual patient risk and target VTE prophylaxis to those who would benefit most. In this genome-wide association case-control study (1300 cases and 1300 controls) we hope to identify susceptibility variants for VTE. Mutations within genes encoding for important components of the anticoagulant, procoagulant, fibrinolytic, and innate immunity pathways are risk factors for VTE. We hypothesize that other genes within these four pathways or within other pathways also are VTE disease-susceptibility genes. Therefore, we performed a genome wide association (GWA) screen and analysis using the Illumina 660W platform to identify SNPs within 1,300 clinic-based, non-cancer VTE cases primarily from Minnesota and the upper Midwest USA, and 1300 clinic-based, unrelated controls frequency-matched on patient age, gender, myocardial infarction/stroke status and state of residence. This is a subset of a slightly larger candidate gene study using 1500 case-control pairs to identify haplotype-tagging SNPs (ht-SNPs) in a large set of candidate genes (n~750) within the anticoagulant, procoagulant, fibrinolytic, and innate immunity pathways. Study Populations. Cases. VTE cases were consecutive Mayo Clinic outpatients with objectively-diagnosed deep vein thrombosis (DVT) and/or pulmonary embolism (PE) residing in the upper Midwest and referred by Mayo Clinic physician to the Mayo Clinic Special Coagulation Laboratory for clinical diagnostic testing to evaluate for an acquired or inherited thrombophilia, or to the Mayo Clinic Thrombophilia Center. Any person contacted to be a control but discovered to have had a VTE was evaluated for inclusion as a case. Cases were primarily residents from Minnesota, Wisconsin, Iowa, Michigan, Illinois, North or South Dakota, Nebraska, Kansas, Missouri and Indiana. A DVT or PE was categorized as objectively diagnosed when (a) confirmed by venography or pulmonary angiography, or pathology examination of thrombus removed at surgery, or (b) if at least one non-invasive test (compression duplex ultrasonography, lung scan, computed tomography scan, magnetic resonance imaging) was positive. A VTE was defined as: Proximal leg deep vein thrombosis (DVT), which includes the common iliac, internal iliac, external iliac, common femoral, superficial [now termed ""femoral""] femoral, deep femoral [sometimes referred to as ""profunda"" femoral] and/or popliteal veins. (Note: greater and lesser saphenous veins, or other superficial or perforator veins, were not included as proximal or distal leg DVT). Distal leg DVT (or ""isolated calf DVT""), which includes the anterior tibial, posterior tibial and/or peroneal veins. (Note: gastrocnemius, soleal and/or sural [e.g., ""deep muscular veins"" of the calf] vein thrombosis was not included as distal leg DVT). Arm DVT, which includes the axillary, subclavian and/or innominate (brachiocephalic) veins. (Note: jugular [internal or external], cephalic and brachial vein thrombosis was not included in ""arm DVT""). Hepatic, portal, splenic, superior or inferior mesenteric, and/or renal vein thrombosis. (Note: ovarian, testicular, peri-prostatic and/or pelvic vein thrombosis was not included). Cerebral vein thrombosis (includes cerebral or dural sinus or vein, saggital sinus or vein, and/or transverse sinus or vein thrombosis). Inferior vena cava (IVC) thrombosis Superior vena cava (SVC) thrombosis Pulmonary embolism Patients with VTE related to active cancer, antiphospholipid syndrome, inflammatory bowel disease, vasculitis, a rheumatoid or other autoimmune disorder, a vascular anomaly (e.g., Klippel-Trénaunay syndrome, etc.), heparin-induced thrombocytopenia, or a mechanical cause for DVT (e.g., arm DVT or SVC thrombosis related to a central venous catheter or transvenous pacemaker, portal and/or splenic vein thrombosis related to liver cirrhosis, IVC thrombosis related to retroperitoneal fibrosis, etc.), with hemodialysis arteriovenous fistula thrombosis, or with prior liver or bone marrow transplantation were excluded. Controls. A Mayo Clinic outpatient control group was prospectively recruited for this study. Controls were frequency-matched on the age group (18-29, 30-39, 40-49, 50-59, 60-69, 70-79, and 80+ years), sex, myocardial infarction/stroke status, and state of residence distribution of the cases. We selected clinic-based controls using a controls' database of persons undergoing general medical examinations in the Mayo Clinic Departments of General Internal Medicine or Primary Care Internal Medicine. Additionally persons undergoing evaluation at the Mayo Clinic Sports Medicine Center, and the Department of Family Medicine were screened for inclusion as controls. This study is part of the Gene Environment Association Studies initiative (GENEVA, http://www.genevastudy.org) funded by the trans-NIH Genes, Environment, and Health Initiative (GEI). The overarching goal is to identify novel genetic factors that contribute to venous thrombosis through large-scale genome-wide association studies of 1,300 clinic-based, VTE cases and 1300 clinic-based, unrelated controls. Genotyping was performed at the Johns Hopkins University Center for Inherited Disease Research (CIDR). Data cleaning and harmonization were done at the GEI-funded GENEVA Coordinating Center at the University of Washington. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000289.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs000289.v2.p1.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs000422.v1.p1.c1 /programs/parent/projects/Asthma_GRU_ Asthma_GRU_ phs000422.v1.p1.c1 c1 GRU p1 phs000422 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000422.v1.p1 v1 NHLBI GO-ESP: Lung Cohorts Exome Sequencing Project (Asthma): Genetic variants affecting susceptibility and severity Asthma_GRU_ parent-Asthma_GRU_ Yes Asthma "The NHLBI ""Grand Opportunity"" Exome Sequencing Project (GO-ESP), a signature project of the NHLBI Recovery Act investment, was designed to identify genetic variants in coding regions (exons) of the human genome (the ""exome"") that are associated with heart, lung and blood diseases. These and related diseases that are of high impact to public health and individuals from diverse racial and ethnic groups will be studied. These data may help researchers understand the causes of disease, contributing to better ways to prevent, diagnose, and treat diseases, as well as determine whether to tailor prevention and treatments to specific populations. This could lead to more effective treatments and reduce the likelihood of side effects. GO-ESP is comprised of five collaborative components: 3 cohort consortia - HeartGO, LungGO, and WHISP - and 2 sequencing centers - BroadGO and SeattleGO. The exome sequencing asthma project includes 200 African-Americans with asthma from the NHLBI multicenter Severe Asthma Research Program (SARP). SARP participants were recruited at the NHLBI SARP sites with an emphasis on recruiting severe asthmatics (Moore et al., Am J Respir Crit Care Med, 2010. PMID: 19892860). Asthma status was based on both a physician's diagnosis and either bronchodilator reversibility or hyper-responsiveness to methacholine as well as less than 5 pack years of smoking. All subjects were carefully characterized using the standardized SARP protocol which included spirometry (medication withheld), maximum bronchodilator reversibility, hyper-responsiveness to methacholine (not performed in subjects with low baseline FEV1), skin-tests to common allergens, questionnaires on health care utilization and medication use and sputum, lung imaging and bronchoscopy in a subset. In addition GWAS data are available (phs000355, Illumina platform). Study Design: Case Set Study Type: Case Set Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000422.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs000422.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000571.v6.p2.c1 /programs/PCGC/projects/CHD-GENES_HMB CHD-GENES_HMB phs000571.v6.p2.c1 c1 HMB p2 phs000571 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000571.v6.p2 v6 Congenital Heart Disease Genetic Network Study CHD-GENES_HMB PCGC-CHD-GENES_HMB Partially CHD-GENES_HMB This substudy phs000571 PCGC contains whole exome sequences, targeted sequences, and SNP array data. Summary level phenotypes for the PCGC Cohort study participants can be viewed at the top-level study page phs001194 PCGC Cohort. Individual level phenotype data and molecular data for all PCGC top-level study and substudies are available by requesting Authorized Access to the PCGC Cohort study phs001194. Multi-center, prospective observational cohort study of individuals with congenital heart defects (CHD). Phenotypic data and source DNA derived from 10,000 probands, parents, and families of interest are being collected to investigate relationships between genetic factors and phenotypic and clinical outcomes in patients with CHD. Study Weblinks:Bench to Bassinet Program Study Design: Prospective Longitudinal Cohort Study Type:Parent-Offspring TriosCohortdbGaP estimated ancestry usingGRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-10-11 and may not include exact formatting or images. phs000571.v6.p2.c1 Study Registration: dbGaP +phs000703.v1.p1.c1 /programs/parent/projects/CATHGEN_DS-CVD-IRB_ CATHGEN_DS-CVD-IRB_ phs000703.v1.p1.c1 c1 DS-CVD-IRB p1 phs000703 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000703.v1.p1 v1 CATHeterization GENetics (CATHGEN) CATHGEN_DS-CVD-IRB_ parent-CATHGEN_DS-CVD-IRB_ Yes CATHGEN The CATHGEN biorepository consists of biological samples collected on 9334 sequential consenting individuals undergoing cardiac catheterization at Duke University Medical Center between 2001 and 2010 inclusive. The Institutional Review Board informed consent allowed for 50 mL of blood to be collected from fasting patients through the femoral arterial sheath during the catheterization procedure. Three 7.5 mL EDTA tubes for DNA extraction are stored at -80°C. The Duke Database for Cardiovascular Disease (DDCD) provides the bulk of the clinical data used for analysis. Follow-up includes mortality information gleaned from the National Death Index and Social Security Death Index plus follow-up phone calls and written questionnaires regarding MI, stroke, re-hospitalization, coronary re-vascularization procedures, smoking, exercise, and medication use. Study Weblinks: CATHGEN Study Design: Cross-Sectional Study Type: Longitudinal Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000703.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs000703.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000784.v3.p1.c1 /programs/parent/projects/GenSalt_DS-HCR-IRB_ GenSalt_DS-HCR-IRB_ phs000784.v3.p1.c1 c1 DS-HCR-IRB p1 phs000784 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000784.v3.p1 v3 Genetic Epidemiology Network of Salt Sensitivity (GenSalt) GenSalt_DS-HCR-IRB_ parent-GenSalt_DS-HCR-IRB_ Yes GenSal The GenSalt study is aimed at identifying novel genes which interact with the effect of dietary sodium and potassium intake or cold pressor on blood pressure. Study Design: Interventional Study Type: Family Interventional dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000784.v3.p1 on 2021-03-25 and may not include exact formatting or images. phs000784.v3.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000810.v1.p1.c1 /programs/parent/projects/HCHS-SOL_HMB-NPU_ HCHS-SOL_HMB-NPU_ phs000810.v1.p1.c1 c1 HMB NPU p1 phs000810 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000810.v1.p1 v1 Hispanic Community Health Study /Study of Latinos (HCHS/SOL) HCHS-SOL_HMB-NPU_ parent-HCHS-SOL_HMB-NPU_ Yes HCHS-SOL "The Hispanic Community Health Study / Study of Latinos (HCHS/SOL) is a multi-center epidemiologic study in Hispanic/Latino populations to determine the role of acculturation in the prevalence and development of disease, and to identify risk factors playing a protective or harmful role in Hispanics/Latinos. The study is sponsored by the National Heart, Lung, and Blood Institute (NHLBI) and six other institutes, centers, and offices of the National Institutes of Health (NIH). The goals of the HCHS/SOL include studying the prevalence and development of disease in Hispanics/Latinos, including the role of acculturation, and identifying disease risk factors that play protective or harmful roles in Hispanics/Latinos. A total of 16,415 persons of Cuban, Dominican, Mexican, Puerto Rican, Central American, and South American backgrounds were recruited through four Field Centers affiliated with San Diego State University, Northwestern University in Chicago, Albert Einstein College of Medicine in the Bronx area of New York, and the University of Miami. Seven additional academic centers serve as scientific and logistical support centers. Study participants aged 18-74 years took part in an extensive clinic exam and assessments to ascertain socio-demographic, cultural, environmental and biomedical characteristics. Annual follow-up interviews are conducted to determine a range of health outcomes. The HCHS SOL Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" box located on the right hand side of this top-level study page phs000810 HCHS SOL Cohort. phs000555 PAGE CALiCo SOL phs000880 HCHS/SOL Omics in Latinos (Ola) Study Weblinks: Hispanic Community Health Study / Study of Latinos Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000810.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs000810.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000810.v1.p1.c2 /programs/parent/projects/HCHS-SOL_HMB_ HCHS-SOL_HMB_ phs000810.v1.p1.c2 c2 HMB p1 phs000810 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000810.v1.p1 v1 Hispanic Community Health Study /Study of Latinos (HCHS/SOL) HCHS-SOL_HMB_ parent-HCHS-SOL_HMB_ Yes HCHS-SOL "The Hispanic Community Health Study / Study of Latinos (HCHS/SOL) is a multi-center epidemiologic study in Hispanic/Latino populations to determine the role of acculturation in the prevalence and development of disease, and to identify risk factors playing a protective or harmful role in Hispanics/Latinos. The study is sponsored by the National Heart, Lung, and Blood Institute (NHLBI) and six other institutes, centers, and offices of the National Institutes of Health (NIH). The goals of the HCHS/SOL include studying the prevalence and development of disease in Hispanics/Latinos, including the role of acculturation, and identifying disease risk factors that play protective or harmful roles in Hispanics/Latinos. A total of 16,415 persons of Cuban, Dominican, Mexican, Puerto Rican, Central American, and South American backgrounds were recruited through four Field Centers affiliated with San Diego State University, Northwestern University in Chicago, Albert Einstein College of Medicine in the Bronx area of New York, and the University of Miami. Seven additional academic centers serve as scientific and logistical support centers. Study participants aged 18-74 years took part in an extensive clinic exam and assessments to ascertain socio-demographic, cultural, environmental and biomedical characteristics. Annual follow-up interviews are conducted to determine a range of health outcomes. The HCHS SOL Cohort is utilized in the following dbGaP sub-studies. To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" box located on the right hand side of this top-level study page phs000810 HCHS SOL Cohort. phs000555 PAGE CALiCo SOL phs000880 HCHS/SOL Omics in Latinos (Ola) Study Weblinks: Hispanic Community Health Study / Study of Latinos Study Design: Prospective Longitudinal Cohort Study Type: Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000810.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs000810.v1.p1.c2 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000820.v1.p1.c1 /programs/parent/projects/CCAF_GRU_ CCAF_GRU_ phs000820.v1.p1.c1 c1 GRU p1 phs000820 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000820.v1.p1 v1 The Cleveland Clinic Foundation's Lone Atrial Fibrillation GWAS Study CCAF_GRU_ parent-CCAF_GRU_ Yes CCAF Blood samples were taken from patients who have lone atrial fibrillation. DNA samples were processed with Illumina Hap550 and Hap 610 chips. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000820.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs000820.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000914.v1.p1.c1 /programs/parent/projects/SAS_GRU-IRB-PUB-COL-NPU-GSO_ SAS_GRU-IRB-PUB-COL-NPU-GSO_ phs000914.v1.p1.c1 c1 GRU-IRB-PUB-COL-NPU-GSO p1 phs000914 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000914.v1.p1 v1 Genome-Wide Association Study of Adiposity in Samoans SAS_GRU-IRB-PUB-COL-NPU-GSO_ parent-SAS_GRU-IRB-PUB-COL-NPU-GSO_ Yes SAS The research goal of this study is to identify genetic variation that increases susceptibility to obesity and cardiometabolic phenotypes among adult Samoans using genome-wide association (GWAS) methods. DNA from peripheral blood and phenotypic information were collected from 3,119 adult Samoans, 23 to 70 years of age. The participants reside throughout the independent nation of Samoa, which is experiencing economic development and the nutrition transition. Genotyping was performed with the Affymetrix Genome-Wide Human SNP 6.0 Array using a panel of approximately 900,000 SNPs. Anthropometric, fasting blood biomarkers and detailed dietary, physical activity, health and socio-demographic variables were collected. We are replicating the GWAS findings in an independent sample of 2,500 Samoans from earlier studies. After replication of genomic regions and informative SNPs in those regions, we will determine sequences of the important genes, and determine the specific genetic variants in the sequenced genes that are associated with adiposity and related cardiometabolic conditions. We will also identify gene by environment interactions, focusing on dietary intake patterns and nutrients. Study Design: Cross-Sectional Study Type: Cross-Sectional Population dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000914.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs000914.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs000920.v4.p2.c2 /programs/topmed/projects/GALAII_DS-LD-IRB-COL GALAII_DS-LD-IRB-COL phs000920.v4.p2.c2 c2 DS-LD-IRB-COL p2 phs000920 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000920.v4.p2 v4 NHLBI TOPMed - NHGRI CCDG: Genes-Environments and Admixture in Latino Asthmatics (GALA II) GALAII_DS-LD-IRB-COL topmed-GALAII_DS-LD-IRB-COL Yes GALAII "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a case-only pharmacogenetic study of bronchodilator drug response among racially admixed Latino children with asthma. Each participant had two spirometry measurements using the KoKo PFT System. With the first spirometry test, participant was administered with 4 puffs of HFA Albuterol. The second albuterol measurement was based on age, for participants under 16 years of age, additional 2 puffs were administered and for those over 16 years of age, additional 4 puffs were administered. The overall goal is to identify genetic factors which are predictive of drug response in children with asthma. The principal tools include a questionnaire and biological specimen collection. Participants are 8-21 years old at time of recruitment. Children with asthma have physician-diagnosed asthma, symptoms and medications. Comprehensive phenotypic data for GALAII study participants are available through dbGaP phs001180. Study Weblinks: Study Populations and Research Staff Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000920.v4.p2 on 2021-03-25 and may not include exact formatting or images." phs000920.v4.p2.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000921.v4.p1.c2 /programs/topmed/projects/SAGE_DS-LD-IRB-COL SAGE_DS-LD-IRB-COL phs000921.v4.p1.c2 c2 DS-LD-IRB-COL p1 phs000921 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000921.v4.p1 v4 NHLBI TOPMed: Study of African Americans, Asthma, Genes and Environment (SAGE) SAGE_DS-LD-IRB-COL topmed-SAGE_DS-LD-IRB-COL Yes SAGE "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a parallel case-control pharmacogenetic study of bronchodilator drug response among African American children with and without asthma. Each participant had spirometry measured using the KoKo PFT System. Asthmatic participants were administered with 4 puffs of HFA Albuterol. Healthy participants were given a baseline spirometry test. The overall goal is to identify genetic factors which are predictive of drug response in children with asthma. The principal tools include a questionnaire and biological specimen collection. Participants were 8-21 years old at time of recruitment. Children with asthma have physician-diagnosed asthma, symptoms and medications. Study Weblinks: Study Populations and Research Staff Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000921.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000921.v4.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs000946.v4.p1.c1 /programs/topmed/projects/EOCOPD_DS-CS-RD EOCOPD_DS-CS-RD phs000946.v4.p1.c1 c1 DS-CS-RD p1 phs000946 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000946.v4.p1 v4 NHLBI TOPMed: Boston Early-Onset COPD Study EOCOPD_DS-CS-RD topmed-EOCOPD_DS-CS-RD Yes EOCOPD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Chronic obstructive pulmonary disease (COPD) is the third leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project collected a set of extended pedigrees ascertained through subjects with severe, early-onset COPD. This study has enrolled subjects with severe COPD (forced expiratory volume in one second (FEV1) < 40% predicted) at an early age (< 53 years) without alpha-1 antitrypsin deficiency (a known Mendelian risk factor for COPD). Extended pedigrees are enrolled, primarily in New England, although some more geographically distant subjects have been included. This study has been used for epidemiological studies, familial aggregation analysis, linkage analysis, and candidate gene association analysis. Approximately 80 of the severe, early-onset COPD probands will undergo whole genome sequencing in this project with sequencing data available through dbGaP. Study Weblinks: Boston COPD Study Design: Family/Twin/Trios Study Type: Pedigree Whole Genome Sequencing dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000946.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000946.v4.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000951.v4.p4.c1 /programs/topmed/projects/COPDGene_HMB COPDGene_HMB phs000951.v4.p4.c1 c1 HMB p4 phs000951 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000951.v4.p4 v4 NHLBI TOPMed: Genetic Epidemiology of COPD (COPDGene) COPDGene_HMB topmed-COPDGene_HMB Yes COPDGene "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States, and the only leading cause of death that is steadily increasing in frequency. This project established a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,720 subjects were recruited, including control smokers and nonsmokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 and PRISm). This cohort is being used for cross-sectional analysis, and long-term longitudinal follow-up visits after five years and after ten years are also being performed. The primary focus of the study is to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The aims for this study are: Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, that will provide data to enable the broad COPD syndrome to be decomposed into clinically significant subtype; Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes; Distinct genetic determinants influence the development of emphysema and airway disease. The TOPMed analysis will include approximately 10,500 subjects with whole genome sequencing after quality control is completed. Comprehensive phenotypic data for COPDGene subjects is available through dbGaP study phs000179. Study Weblinks: COPDGene phs000179 Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000951.v4.p4 on 2021-03-25 and may not include exact formatting or images." phs000951.v4.p4.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000951.v4.p4.c2 /programs/topmed/projects/COPDGene_DS-CS-RD COPDGene_DS-CS-RD phs000951.v4.p4.c2 c2 DS-CS-RD p4 phs000951 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000951.v4.p4 v4 NHLBI TOPMed: Genetic Epidemiology of COPD (COPDGene) COPDGene_DS-CS-RD topmed-COPDGene_DS-CS-RD Yes COPDGene "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Chronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States, and the only leading cause of death that is steadily increasing in frequency. This project established a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,720 subjects were recruited, including control smokers and nonsmokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 and PRISm). This cohort is being used for cross-sectional analysis, and long-term longitudinal follow-up visits after five years and after ten years are also being performed. The primary focus of the study is to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. The aims for this study are: Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, that will provide data to enable the broad COPD syndrome to be decomposed into clinically significant subtype; Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes; Distinct genetic determinants influence the development of emphysema and airway disease. The TOPMed analysis will include approximately 10,500 subjects with whole genome sequencing after quality control is completed. Comprehensive phenotypic data for COPDGene subjects is available through dbGaP study phs000179. Study Weblinks: COPDGene phs000179 Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000951.v4.p4 on 2021-03-25 and may not include exact formatting or images." phs000951.v4.p4.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000954.v3.p2.c1 /programs/topmed/projects/CFS_DS-HLBS-IRB-NPU CFS_DS-HLBS-IRB-NPU phs000954.v3.p2.c1 c1 DS-HLBS-IRB-NPU p2 phs000954 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000954.v3.p2 v3 NHLBI TOPMed: The Cleveland Family Study (CFS) CFS_DS-HLBS-IRB-NPU topmed-CFS_DS-HLBS-IRB-NPU Yes CFS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Cleveland Family Study (CFS) is one cohort involved in the WGS project. The CFS was designed to provide fundamental epidemiological data on genetic and non-genetic risk factors for sleep disordered breathing (SDB). In brief, the CFS is a family-based study that enrolled a total of 2284 individuals from 361 families between 1990 and 2006. The sample was selected by identifying affected probands who had laboratory diagnosed obstructive sleep apnea. All first degree relatives, spouses and available second degree relatives of affected probands were studied. In addition, during the first 5 study years, neighborhood control families were identified through a neighborhood proband, and his/her spouses and first degree relatives. Each exam, occurring at approximately 4 year intervals, included new enrollment as well as follow up exams for previously enrolled subjects. For the first three visits, data, including an overnight sleep study, were collected in the participants' homes while the last visit occurred in a general clinical research center (GCRC). Phenotypic characterization of the entire cohort included overnight sleep apnea studies, blood pressure, spirometry, anthropometry and questionnaires. The GCRC exam (n=735 selected individuals) included more comprehensive phenotype data on a focused subsample of the larger cohort, to permit linking SDB phenotypes with cardio-metabolic phenotypes, with an interest in identifying genetic loci that are associated with these related phenotypes. In this last round of data collection, a subset of 735 individuals was selected based on expected genetic informativity by choosing pedigrees where siblings had extremes of the apnea hypopnea index (AHI). Participants underwent detailed phenotyping including laboratory polysomnography (PSG), ECG, spirometry, nasal and oral acoustic reflectometry, vigilance testing, and blood and urine collection before and after sleep and after an oral glucose tolerance test. A wide range of biochemical measures of inflammation and metabolism were assayed by a Core Laboratory at the University of Vermont. 994 individuals were sequenced as part of TOPMed Phase 1, including 507 African-Americans and 487 European-Americans. Among the sequenced individuals, 156 were probands with diagnosed sleep apnea, an additional 706 were members of families with probands, and 132 were from neighborhood control families. 298 individuals were sequenced as part of TOPMed Phase 3.5, including 169 African-Americans and 129 European-Americans. Among the newly sequenced individuals, 33 were probands with diagnosed sleep apnea, an additional 214 were members of families with probands, and 51 were from neighborhood control families. Please note: Phenotype and pedigree data are available through ""NHLBI Cleveland Family Study (CFS) Candidate Gene Association Resource (CARe)"", phs000284. Study Weblinks: Cleveland Family Study (CFS) Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000954.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs000954.v3.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000956.v4.p1.c2 /programs/topmed/projects/Amish_HMB-IRB-MDS Amish_HMB-IRB-MDS phs000956.v4.p1.c2 c2 HMB-IRB-MDS p1 phs000956 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000956.v4.p1 v4 NHLBI TOPMed: Genetics of Cardiometabolic Health in the Amish Amish_HMB-IRB-MDS topmed-Amish_HMB-IRB-MDS Yes Amish "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Amish Complex Disease Research Program includes a set of large community-based studies focused largely on cardiometabolic health carried out in the Old Order Amish (OOA) community of Lancaster, Pennsylvania (http://medschool.umaryland.edu/endocrinology/amish/research-program.asp). The OOA population of Lancaster County, PA immigrated to the Colonies from Western Europe in the early 1700's. There are now over 30,000 OOA individuals in the Lancaster area, nearly all of whom can trace their ancestry back 12-14 generations to approximately 700 founders. Investigators at the University of Maryland School of Medicine have been studying the genetic determinants of cardiometabolic health in this population since 1993. To date, over 7,000 Amish adults have participated in one or more of our studies. Due to their ancestral history, the OOA may be enriched for rare variants that arose in the population from a single founder (or small number of founders) and propagated through genetic drift. Many of these variants have large effect sizes and identifying them can lead to new biological insights about health and disease. The parent study for this WGS project provides one (of multiple) examples. In our parent study, we identified through a genome-wide association analysis a haplotype that was highly enriched in the OOA that is associated with very high LDL-cholesterol levels. At the present time, the identity of the causative SNP - and even the implicated gene - is not known because the associated haplotype contains numerous genes, none of which are obvious lipid candidate genes. A major goal of the WGS that will be obtained through the NHLBI TOPMed Consortium will be to identify functional variants that underlie some of the large effect associations observed in this unique population. Study Weblinks: University of Maryland School of Medicine - Amish Studies Study Design: Family/Twin/Trios Study Type: Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000956.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000956.v4.p1.c2 Program: TOPMed Data Type: DCC Harmonized Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs000964.v4.p1.c1 /programs/topmed/projects/JHS_HMB-IRB-NPU JHS_HMB-IRB-NPU phs000964.v4.p1.c1 c1 HMB-IRB-NPU p1 phs000964 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 v4 NHLBI TOPMed: The Jackson Heart Study (JHS) JHS_HMB-IRB-NPU topmed-JHS_HMB-IRB-NPU Yes JHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Since there is a greater prevalence of cardiovascular disease among African Americans, the purpose of the Jackson Heart Study (JHS) is to explore the reasons for this disparity and to uncover new approaches to reduce it. The JHS is a large, community-based, observational study whose 5306 participants were recruited from among the non-institutionalized African-American adults from urban and rural areas of the three counties (Hinds, Madison, and Rankin) that make up the Jackson, MS, metropolitan statistical area (MSA). Jackson is the capital of Mississippi, the state with the largest percentage (36.3%) of African Americans in the United States. The JHS design included participants from the Jackson ARIC study who had originally been recruited through random selection from a drivers' license registry. Approximately six months before the JHS was to begin, an amendment to the federal Driver's Privacy Protection Act was passed that changed the level of consent for public release of personal information from driver's license lists from an ""opt out"" to an ""opt in"" basis. The Mississippi Highway Patrol was no longer able to release a complete listing of all persons with driver's licenses or state identification cards, which prevented its use in the JHS. New JHS participants were chosen randomly from the Accudata America commercial listing, which provides householder name, address, zip code, phone number (if available), age group in decades, and family components. The Accudata list was deemed to provide the most complete count of households for individuals aged 55 years and older in the Jackson MSA. A structured volunteer sample was also included in which demographic cells for recruitment were designed to mirror the eligible population. Enrollment was opened to volunteers who met census-derived age, sex, and socioeconomic status (SES) eligibility criteria for the Jackson MSA. In addition, a family component was included in the JHS. The sampling frame for the family study was a participant in any one of the ARlC, random, or volunteer samples whose family size met eligibility requirements. Eligibility included having at least two full siblings and four first degree relatives (parents, siblings, children over the age of 21) who lived in the Jackson MSA and who were willing to participate in the study. No upper age limit was placed on the family sample. Known contact information was obtained during the baseline clinic examination from the index family member with a verbal pedigree format to identify name(s), age(s), address (es), and telephone number(s). Recruitment was limited to persons 35-84 years old except in the family cohort, where those 21 years old and above were eligible. Only persons who otherwise met study criteria but were deemed to be physically or mentally incompetent by trained recruiters were excluded from study eligibility.1 1 Wyatt SB, Diekelmann N, Henderson F, Andrew ME, Billingsley G, Felder SH et al. A community-driven model of research participation: the Jackson Heart Study Participant Recruitment and Retention Study. Ethn Dis 2003; 13(4):438-455 (PMID: 14632263). Study Weblinks: Jackson Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000964.v4.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000964.v4.p1.c2 /programs/topmed/projects/JHS_DS-FDO-IRB-NPU JHS_DS-FDO-IRB-NPU phs000964.v4.p1.c2 c2 DS-FDO-IRB-NPU p1 phs000964 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 v4 NHLBI TOPMed: The Jackson Heart Study (JHS) JHS_DS-FDO-IRB-NPU topmed-JHS_DS-FDO-IRB-NPU Yes JHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Since there is a greater prevalence of cardiovascular disease among African Americans, the purpose of the Jackson Heart Study (JHS) is to explore the reasons for this disparity and to uncover new approaches to reduce it. The JHS is a large, community-based, observational study whose 5306 participants were recruited from among the non-institutionalized African-American adults from urban and rural areas of the three counties (Hinds, Madison, and Rankin) that make up the Jackson, MS, metropolitan statistical area (MSA). Jackson is the capital of Mississippi, the state with the largest percentage (36.3%) of African Americans in the United States. The JHS design included participants from the Jackson ARIC study who had originally been recruited through random selection from a drivers' license registry. Approximately six months before the JHS was to begin, an amendment to the federal Driver's Privacy Protection Act was passed that changed the level of consent for public release of personal information from driver's license lists from an ""opt out"" to an ""opt in"" basis. The Mississippi Highway Patrol was no longer able to release a complete listing of all persons with driver's licenses or state identification cards, which prevented its use in the JHS. New JHS participants were chosen randomly from the Accudata America commercial listing, which provides householder name, address, zip code, phone number (if available), age group in decades, and family components. The Accudata list was deemed to provide the most complete count of households for individuals aged 55 years and older in the Jackson MSA. A structured volunteer sample was also included in which demographic cells for recruitment were designed to mirror the eligible population. Enrollment was opened to volunteers who met census-derived age, sex, and socioeconomic status (SES) eligibility criteria for the Jackson MSA. In addition, a family component was included in the JHS. The sampling frame for the family study was a participant in any one of the ARlC, random, or volunteer samples whose family size met eligibility requirements. Eligibility included having at least two full siblings and four first degree relatives (parents, siblings, children over the age of 21) who lived in the Jackson MSA and who were willing to participate in the study. No upper age limit was placed on the family sample. Known contact information was obtained during the baseline clinic examination from the index family member with a verbal pedigree format to identify name(s), age(s), address (es), and telephone number(s). Recruitment was limited to persons 35-84 years old except in the family cohort, where those 21 years old and above were eligible. Only persons who otherwise met study criteria but were deemed to be physically or mentally incompetent by trained recruiters were excluded from study eligibility.1 1 Wyatt SB, Diekelmann N, Henderson F, Andrew ME, Billingsley G, Felder SH et al. A community-driven model of research participation: the Jackson Heart Study Participant Recruitment and Retention Study. Ethn Dis 2003; 13(4):438-455 (PMID: 14632263). Study Weblinks: Jackson Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000964.v4.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000964.v4.p1.c3 /programs/topmed/projects/JHS_HMB-IRB JHS_HMB-IRB phs000964.v4.p1.c3 c3 HMB-IRB p1 phs000964 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 v4 NHLBI TOPMed: The Jackson Heart Study (JHS) JHS_HMB-IRB topmed-JHS_HMB-IRB Yes JHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Since there is a greater prevalence of cardiovascular disease among African Americans, the purpose of the Jackson Heart Study (JHS) is to explore the reasons for this disparity and to uncover new approaches to reduce it. The JHS is a large, community-based, observational study whose 5306 participants were recruited from among the non-institutionalized African-American adults from urban and rural areas of the three counties (Hinds, Madison, and Rankin) that make up the Jackson, MS, metropolitan statistical area (MSA). Jackson is the capital of Mississippi, the state with the largest percentage (36.3%) of African Americans in the United States. The JHS design included participants from the Jackson ARIC study who had originally been recruited through random selection from a drivers' license registry. Approximately six months before the JHS was to begin, an amendment to the federal Driver's Privacy Protection Act was passed that changed the level of consent for public release of personal information from driver's license lists from an ""opt out"" to an ""opt in"" basis. The Mississippi Highway Patrol was no longer able to release a complete listing of all persons with driver's licenses or state identification cards, which prevented its use in the JHS. New JHS participants were chosen randomly from the Accudata America commercial listing, which provides householder name, address, zip code, phone number (if available), age group in decades, and family components. The Accudata list was deemed to provide the most complete count of households for individuals aged 55 years and older in the Jackson MSA. A structured volunteer sample was also included in which demographic cells for recruitment were designed to mirror the eligible population. Enrollment was opened to volunteers who met census-derived age, sex, and socioeconomic status (SES) eligibility criteria for the Jackson MSA. In addition, a family component was included in the JHS. The sampling frame for the family study was a participant in any one of the ARlC, random, or volunteer samples whose family size met eligibility requirements. Eligibility included having at least two full siblings and four first degree relatives (parents, siblings, children over the age of 21) who lived in the Jackson MSA and who were willing to participate in the study. No upper age limit was placed on the family sample. Known contact information was obtained during the baseline clinic examination from the index family member with a verbal pedigree format to identify name(s), age(s), address (es), and telephone number(s). Recruitment was limited to persons 35-84 years old except in the family cohort, where those 21 years old and above were eligible. Only persons who otherwise met study criteria but were deemed to be physically or mentally incompetent by trained recruiters were excluded from study eligibility.1 1 Wyatt SB, Diekelmann N, Henderson F, Andrew ME, Billingsley G, Felder SH et al. A community-driven model of research participation: the Jackson Heart Study Participant Recruitment and Retention Study. Ethn Dis 2003; 13(4):438-455 (PMID: 14632263). Study Weblinks: Jackson Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000964.v4.p1.c3 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000964.v4.p1.c4 /programs/topmed/projects/JHS_DS-FDO-IRB JHS_DS-FDO-IRB phs000964.v4.p1.c4 c4 DS-FDO-IRB p1 phs000964 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 v4 NHLBI TOPMed: The Jackson Heart Study (JHS) JHS_DS-FDO-IRB topmed-JHS_DS-FDO-IRB Yes JHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Since there is a greater prevalence of cardiovascular disease among African Americans, the purpose of the Jackson Heart Study (JHS) is to explore the reasons for this disparity and to uncover new approaches to reduce it. The JHS is a large, community-based, observational study whose 5306 participants were recruited from among the non-institutionalized African-American adults from urban and rural areas of the three counties (Hinds, Madison, and Rankin) that make up the Jackson, MS, metropolitan statistical area (MSA). Jackson is the capital of Mississippi, the state with the largest percentage (36.3%) of African Americans in the United States. The JHS design included participants from the Jackson ARIC study who had originally been recruited through random selection from a drivers' license registry. Approximately six months before the JHS was to begin, an amendment to the federal Driver's Privacy Protection Act was passed that changed the level of consent for public release of personal information from driver's license lists from an ""opt out"" to an ""opt in"" basis. The Mississippi Highway Patrol was no longer able to release a complete listing of all persons with driver's licenses or state identification cards, which prevented its use in the JHS. New JHS participants were chosen randomly from the Accudata America commercial listing, which provides householder name, address, zip code, phone number (if available), age group in decades, and family components. The Accudata list was deemed to provide the most complete count of households for individuals aged 55 years and older in the Jackson MSA. A structured volunteer sample was also included in which demographic cells for recruitment were designed to mirror the eligible population. Enrollment was opened to volunteers who met census-derived age, sex, and socioeconomic status (SES) eligibility criteria for the Jackson MSA. In addition, a family component was included in the JHS. The sampling frame for the family study was a participant in any one of the ARlC, random, or volunteer samples whose family size met eligibility requirements. Eligibility included having at least two full siblings and four first degree relatives (parents, siblings, children over the age of 21) who lived in the Jackson MSA and who were willing to participate in the study. No upper age limit was placed on the family sample. Known contact information was obtained during the baseline clinic examination from the index family member with a verbal pedigree format to identify name(s), age(s), address (es), and telephone number(s). Recruitment was limited to persons 35-84 years old except in the family cohort, where those 21 years old and above were eligible. Only persons who otherwise met study criteria but were deemed to be physically or mentally incompetent by trained recruiters were excluded from study eligibility.1 1 Wyatt SB, Diekelmann N, Henderson F, Andrew ME, Billingsley G, Felder SH et al. A community-driven model of research participation: the Jackson Heart Study Participant Recruitment and Retention Study. Ethn Dis 2003; 13(4):438-455 (PMID: 14632263). Study Weblinks: Jackson Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000964.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000964.v4.p1.c4 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000972.v4.p1.c1 /programs/topmed/projects/SAS_GRU-IRB-PUB-COL-NPU-GSO SAS_GRU-IRB-PUB-COL-NPU-GSO phs000972.v4.p1.c1 c1 GRU-IRB-PUB-COL-NPU-GSO p1 phs000972 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000972.v4.p1 v4 NHLBI TOPMed: Genome-Wide Association Study of Adiposity in Samoans SAS_GRU-IRB-PUB-COL-NPU-GSO topmed-SAS_GRU-IRB-PUB-COL-NPU-GSO Yes SAS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The individuals sequenced here represent a small subset of the parent study (described below) and were carefully selected for the purpose of creating a Samoan-specific reference panel for imputation back into the parent study. The INFOSTIP algorithm of Gusev et. al. (2012) (PMID: 22135348) was used to optimally choose the individuals for sequencing. The research goal of the parent study (dbGaP ID phs000914) is to identify genetic variation that increases susceptibility to obesity and cardiometabolic phenotypes among adult Samoans using genome-wide association (GWAS) methods. DNA from peripheral blood and phenotypic information were collected from 3,119 adult Samoans, 23 to 70 years of age. The participants reside throughout the independent nation of Samoa, which is experiencing economic development and the nutrition transition. Genotyping was performed with the Affymetrix Genome-Wide Human SNP 6.0 Array using a panel of approximately 900,000 SNPs. Anthropometric, fasting blood biomarkers and detailed dietary, physical activity, health and socio-demographic variables were collected. We are replicating the GWAS findings in an independent sample of 2,500 Samoans from earlier studies. After replication of genomic regions and informative SNPs in those regions, we will determine sequences of the important genes, and determine the specific genetic variants in the sequenced genes that are associated with adiposity and related cardiometabolic conditions. We will also identify gene by environment interactions, focusing on dietary intake patterns and nutrients. Study Design: Cross-Sectional Study Type: Cross-Sectional Population dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000972.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000972.v4.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000974.v4.p3.c1 /programs/topmed/projects/FHS_HMB-IRB-MDS FHS_HMB-IRB-MDS phs000974.v4.p3.c1 c1 HMB-IRB-MDS p3 phs000974 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000974.v4.p3 v4 NHLBI TOPMed: Genomic Activities such as Whole Genome Sequencing and Related Phenotypes in the Framingham Heart Study FHS_HMB-IRB-MDS topmed-FHS_HMB-IRB-MDS Yes FHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Framingham Heart Study (FHS) is a prospective cohort study of 3 generations of subjects who have been followed up to 65 years to evaluate risk factors for cardiovascular disease. Its large sample of ~15,000 men and women who have been extensively phenotyped with repeated examinations make it ideal for the study of genetic associations with cardiovascular disease risk factors and outcomes. DNA samples have been collected and immortalized since the mid-1990s and are available on ~8000 study participants in 1037 families. These samples have been used for collection of GWAS array data and exome chip data in nearly all with DNA samples, and for targeted sequencing, deep exome sequencing and light coverage whole genome sequencing in limited numbers. Additionally, mRNA and miRNA expression data, DNA methylation data, metabolomics and other 'omics data are available on a sizable portion of study participants. This project will focus on deep whole genome sequencing (mean 30X coverage) in ~4100 subjects and imputed to all with GWAS array data to more fully understand the genetic contributions to cardiovascular, lung, blood and sleep disorders. Comprehensive phenotypic and pedigree data for study participants are available through dbGaP phs000007. Study Weblinks: Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000974.v4.p3 on 2021-03-25 and may not include exact formatting or images." phs000974.v4.p3.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000974.v4.p3.c2 /programs/topmed/projects/FHS_HMB-IRB-NPU-MDS FHS_HMB-IRB-NPU-MDS phs000974.v4.p3.c2 c2 HMB-IRB-NPU-MDS p3 phs000974 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000974.v4.p3 v4 NHLBI TOPMed: Genomic Activities such as Whole Genome Sequencing and Related Phenotypes in the Framingham Heart Study FHS_HMB-IRB-NPU-MDS topmed-FHS_HMB-IRB-NPU-MDS Yes FHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Framingham Heart Study (FHS) is a prospective cohort study of 3 generations of subjects who have been followed up to 65 years to evaluate risk factors for cardiovascular disease. Its large sample of ~15,000 men and women who have been extensively phenotyped with repeated examinations make it ideal for the study of genetic associations with cardiovascular disease risk factors and outcomes. DNA samples have been collected and immortalized since the mid-1990s and are available on ~8000 study participants in 1037 families. These samples have been used for collection of GWAS array data and exome chip data in nearly all with DNA samples, and for targeted sequencing, deep exome sequencing and light coverage whole genome sequencing in limited numbers. Additionally, mRNA and miRNA expression data, DNA methylation data, metabolomics and other 'omics data are available on a sizable portion of study participants. This project will focus on deep whole genome sequencing (mean 30X coverage) in ~4100 subjects and imputed to all with GWAS array data to more fully understand the genetic contributions to cardiovascular, lung, blood and sleep disorders. Comprehensive phenotypic and pedigree data for study participants are available through dbGaP phs000007. Study Weblinks: Framingham Heart Study Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000974.v4.p3 on 2021-03-25 and may not include exact formatting or images." phs000974.v4.p3.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000988.v4.p1.c1 /programs/topmed/projects/CRA_DS-ASTHMA-IRB-MDS-RD CRA_DS-ASTHMA-IRB-MDS-RD phs000988.v4.p1.c1 c1 DS-ASTHMA-IRB-MDS-RD p1 phs000988 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000988.v4.p1 v4 NHLBI TOPMed: The Genetic Epidemiology of Asthma in Costa Rica CRA_DS-ASTHMA-IRB-MDS-RD topmed-CRA_DS-ASTHMA-IRB-MDS-RD Yes CRA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This administrative supplement to the project, ""The Genetic Epidemiology of Asthma in Costa Rica"" (R37 HL066289) is in response to NOT-HL-14-029 to perform whole genome sequencing (WGS) on existing NHLBI populations. We focus on asthma because of its public health significance. Asthma affects 26 million U.S. children and adults, remains a major cause of morbidity (one-half million hospitalizations a year) and is the most common cause of school and work days lost. Asthma-related costs are estimated to be over $12.7 billion annually. The Asthma Probands for both the extended pedigrees and the trios utilized in this study were selected on the basis of a physician diagnosis of asthma; a history of recurrent asthma attacks or at least 2 respiratory symptoms; and either airway hyperresponsiveness to methacholine or significant response to bronchodilator (Albuterol) administration. These criteria are identical to the criteria used in the Childhood Asthma Management Program (CAMP). The three primary goals of this project are to: (1) identify common and rare genetic variants that determine asthma and its associated phenotypes (height, weight, IgE level, lung function, bronchodilator response, steroid treatment response) through whole genome sequencing (WGS); (2) perform novel family based association analysis of our WGS data to identify novel genes for asthma; and (3) integrate epigenomic and transcriptomic data with our WGS data and determine the epistatic interactions present using systems genomics approaches. Identification of the molecular determinants of asthma remains an important priority in translational science. Genome-wide association studies (GWAS) have been successful in this regard, identifying at least 10 novel susceptibility genes for asthma. However, as with most complex traits, the variants identified by GWAS explain only a fraction of the estimated heritability of this disorder. Herein, we propose a novel family-based study design and state-of-the-art genome sequencing techniques to map a set of sequence variants for asthma and its associated phenotypes and assess the interrelationships of the identified genes and variants using systems genomics methods. We have assembled a team of investigators highly-skilled and expert in whole genome sequencing (Drs. Michael Cho and Benjamin Raby), genetic association analysis (Drs. Scott T. Weiss, Jessica Lasky-Su and Christoph Lange), integrative genomics (Drs. Raby, Kelan Tantisira, Augusto Litonjua and Dawn DeMeo), and systems genomics (Drs. Weiss, Amitabh Sharma, Lange and Raby) to address this important problem with both a novel study design and data set. Study Design: Family/Twin/Trios Study Type: Parent-Offspring Trios dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000988.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs000988.v4.p1.c1 Program: TOPMed Data Type: DCC Harmonized Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs000993.v4.p2.c1 /programs/topmed/projects/HVH_HMB-IRB-MDS HVH_HMB-IRB-MDS phs000993.v4.p2.c1 c1 HMB-IRB-MDS p2 phs000993 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000993.v4.p2 v4 NHLBI TOPMed: Heart and Vascular Health Study (HVH) HVH_HMB-IRB-MDS topmed-HVH_HMB-IRB-MDS Yes HVH "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Objectives The Heart and Vascular Health Study (HVH) is a case-control study of risk factors for the development of myocardial infarction (MI), stroke, venous thrombosis (VT), and atrial fibrillation (AF). The study setting is Group Health, an integrated health care delivery system in Washington State. Only VT cases and early-onset AF cases are included as part of TOPMed. Background The HVH study originated in 1988 with the examination of risk factors for MI. Over the ensuing years, the study has been funded by a series of grants which have added case subjects with stroke, VT, and AF. Study aims focused on the associations of medication use with cardiovascular events, and starting in 1997, the study aims expanded to include genetic associations with cardiovascular disease. Participants recruited in 2009 or later who provided blood samples for genetic analysis were asked for consent to deposit genetic and phenotypic data in dbGaP. Design As part of the HVH study, case subjects were identified by searching for ICD-9 codes consistent with MI, stroke, VT, or AF, and medical records were reviewed to confirm the diagnosis. Control subjects were identified at random from the Group Health enrollment and were matched to MI cases. All subjects have an index date. For cases, the index date was assigned as the date that the cardiovascular event (MI, stroke, VT, or AF) came to clinical attention. For controls, the index date was a random date within the range of the case index dates. For both cases and controls, information was collected from the inpatient and outpatient medical record, by telephone interview with consenting survivors, and from the Group Health pharmacy and laboratory databases. Consenting participants provided a blood specimen. Subjects Only VT and early-onset AF cases from HVH are included in TOPMed. Within the HVH study, VT and AF cases were diagnosed in both inpatient and outpatient settings, and only incident cases are eligible for inclusion in TOPMed. Genetic Research Genetic factors underlying cardiovascular disease are studied using DNA isolated from the blood samples. Phenotype data for HVH study participants are available through dbGaP phs001013. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000993.v4.p2 on 2021-03-25 and may not include exact formatting or images." phs000993.v4.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000993.v4.p2.c2 /programs/topmed/projects/HVH_DS-CVD-IRB-MDS HVH_DS-CVD-IRB-MDS phs000993.v4.p2.c2 c2 DS-CVD-IRB-MDS p2 phs000993 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000993.v4.p2 v4 NHLBI TOPMed: Heart and Vascular Health Study (HVH) HVH_DS-CVD-IRB-MDS topmed-HVH_DS-CVD-IRB-MDS Yes HVH "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Objectives The Heart and Vascular Health Study (HVH) is a case-control study of risk factors for the development of myocardial infarction (MI), stroke, venous thrombosis (VT), and atrial fibrillation (AF). The study setting is Group Health, an integrated health care delivery system in Washington State. Only VT cases and early-onset AF cases are included as part of TOPMed. Background The HVH study originated in 1988 with the examination of risk factors for MI. Over the ensuing years, the study has been funded by a series of grants which have added case subjects with stroke, VT, and AF. Study aims focused on the associations of medication use with cardiovascular events, and starting in 1997, the study aims expanded to include genetic associations with cardiovascular disease. Participants recruited in 2009 or later who provided blood samples for genetic analysis were asked for consent to deposit genetic and phenotypic data in dbGaP. Design As part of the HVH study, case subjects were identified by searching for ICD-9 codes consistent with MI, stroke, VT, or AF, and medical records were reviewed to confirm the diagnosis. Control subjects were identified at random from the Group Health enrollment and were matched to MI cases. All subjects have an index date. For cases, the index date was assigned as the date that the cardiovascular event (MI, stroke, VT, or AF) came to clinical attention. For controls, the index date was a random date within the range of the case index dates. For both cases and controls, information was collected from the inpatient and outpatient medical record, by telephone interview with consenting survivors, and from the Group Health pharmacy and laboratory databases. Consenting participants provided a blood specimen. Subjects Only VT and early-onset AF cases from HVH are included in TOPMed. Within the HVH study, VT and AF cases were diagnosed in both inpatient and outpatient settings, and only incident cases are eligible for inclusion in TOPMed. Genetic Research Genetic factors underlying cardiovascular disease are studied using DNA isolated from the blood samples. Phenotype data for HVH study participants are available through dbGaP phs001013. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000993.v4.p2 on 2021-03-25 and may not include exact formatting or images." phs000993.v4.p2.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs000997.v4.p2.c1 /programs/topmed/projects/VAFAR_HMB-IRB VAFAR_HMB-IRB phs000997.v4.p2.c1 c1 HMB-IRB p2 phs000997 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000997.v4.p2 v4 NHLBI TOPMed - NHGRI CCDG: The Vanderbilt AF Ablation Registry VAFAR_HMB-IRB topmed-VAFAR_HMB-IRB Yes VAFAR "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Vanderbilt Atrial Fibrillation Ablation Registry (VAFAR) was founded in 2011. Patients with AF referred for AF ablation are prospectively enrolled. A detailed clinical history is recorded, along with imaging data (cardiac MRI or CT). Blood samples are obtained for DNA extraction at the time of ablation. Details of the ablation procedure are recorded. Patients are longitudinally followed to monitor for AF recurrence. VAFAR contributed 171 samples submitted to dbGaP for WGS: 115 were from male subjects, of which 113 were white/non-Hispanic and 2 were Hispanic; 56 were from females, of which all 56 were white/non-Hispanic. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000997.v4.p2 on 2021-03-25 and may not include exact formatting or images." phs000997.v4.p2.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001001.v1.p1.c1 /programs/parent/projects/MGH_AF_HMB-IRB_ MGH_AF_HMB-IRB_ phs001001.v1.p1.c1 c1 HMB-IRB p1 phs001001 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001001.v1.p1 v1 Massachusetts General Hospital (MGH) Atrial Fibrillation Study MGH_AF_HMB-IRB_ parent-MGH_AF_HMB-IRB_ Yes MGH_AF "The Massachusetts General Hospital (MGH) Atrial Fibrillation Study was initiated in 2001. The study has enrolled serial probands, unaffected and affected family members with atrial fibrillation. At enrollment participants undergo a structured interview to systematically capture their past medical history, AF treatments, and family history. An electrocardiogram is performed; the results of an echocardiogram are obtained; and blood samples are obtained. The Massachusetts General Hospital (MGH) Atrial Fibrillation Study is utilized in the following dbGaP substudies. To view genotypes, analysis, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs001001 Massachusetts General Hospital (MGH) Atrial Fibrillation Study. phs001116 MGH AF CHARGE-S phs001117 MGH AF Exome Sequencing phs001118 MGH AF Medical Resequencing Study Design: Case Set Study Type: Case Set Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001001.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001001.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001001.v1.p1.c2 /programs/parent/projects/MGH_AF_DS-AF-IRB-RD_ MGH_AF_DS-AF-IRB-RD_ phs001001.v1.p1.c2 c2 DS-AF-IRB-RD p1 phs001001 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001001.v1.p1 v1 Massachusetts General Hospital (MGH) Atrial Fibrillation Study MGH_AF_DS-AF-IRB-RD_ parent-MGH_AF_DS-AF-IRB-RD_ Yes MGH_AF "The Massachusetts General Hospital (MGH) Atrial Fibrillation Study was initiated in 2001. The study has enrolled serial probands, unaffected and affected family members with atrial fibrillation. At enrollment participants undergo a structured interview to systematically capture their past medical history, AF treatments, and family history. An electrocardiogram is performed; the results of an echocardiogram are obtained; and blood samples are obtained. The Massachusetts General Hospital (MGH) Atrial Fibrillation Study is utilized in the following dbGaP substudies. To view genotypes, analysis, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs001001 Massachusetts General Hospital (MGH) Atrial Fibrillation Study. phs001116 MGH AF CHARGE-S phs001117 MGH AF Exome Sequencing phs001118 MGH AF Medical Resequencing Study Design: Case Set Study Type: Case Set Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001001.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001001.v1.p1.c2 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001012.v1.p1.c1 /programs/parent/projects/DHS_DS-DRC-IRB_ DHS_DS-DRC-IRB_ phs001012.v1.p1.c1 c1 DS-DRC-IRB p1 phs001012 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001012.v1.p1 v1 The Diabetes Heart Study (DHS) DHS_DS-DRC-IRB_ parent-DHS_DS-DRC-IRB_ Yes DHS The Diabetes Heart Study is a family based study enriched for type 2 diabetes (T2D). The cohort included 1220 self-reported European Americans from 475 families (Bowden et al 2010 Review of Diabetic Studies 7:188-201: PMID: 21409311; Bowden et al 2008 Annals of Human Genetics 72:598-601 PMID: 18460048) and included siblings concordant for T2D; where possible unaffected siblings were also recruited. The cohort was recruited between 1998 and 2006. Participants were extensively phenotyped for measures of subclinical CVD and other known CVD risk factors. Primary outcomes were quantified burden of vascular calcified plaque in the coronary artery, carotid artery and abdominal aorta all determined from non-contrast computed tomography scans. Study Design: Cross-Sectional Study Type: Cross-Sectional Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001012.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs001012.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001013.v3.p2.c1 /programs/parent/projects/HVH_HMB-IRB-MDS_ HVH_HMB-IRB-MDS_ phs001013.v3.p2.c1 c1 HMB-IRB-MDS p2 phs001013 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001013.v3.p2 v3 Heart and Vascular Health Study (HVH) HVH_HMB-IRB-MDS_ parent-HVH_HMB-IRB-MDS_ Yes HVH Objectives The Heart and Vascular Health Study (HVH) is a case-control study of risk factors for the development of myocardial infarction (MI), stroke, venous thrombosis (VT), and atrial fibrillation (AF). The study setting is Group Health, an integrated health care delivery system in Washington State. Background The HVH originated in 1988 with the examination of risk factors for MI. Over the ensuing years, the study has been funded by a series of grants, which have added case subjects with stroke, VT, and AF, and used a common control group. Study aims have focused on the associations of medication use with cardiovascular events. Starting in 1997, the study aims expanded to include genetic associations with cardiovascular disease. Participants recruited in 2009 or later and who provided blood samples for genetic analysis were asked for consent to deposit genetic and phenotype data in dbGaP. Design As part of the HVH study, case subjects were identified by searching for ICD-9 codes consistent with MI, stroke, VT, or AF, and medical records were reviewed to confirm the diagnosis. Control subjects were identified at random from the Group Health enrollment and were matched to MI cases. All subjects have an index date. For cases, the index date was assigned as the date that the cardiovascular event (MI, stroke, VT, or AF) came to clinical attention. For controls, the index date was a random date within the range of the case index dates. For both cases and controls, information was collected from the inpatient and outpatient medical record, by telephone interview with consenting survivors, and from the Group Health pharmacy and laboratory databases. Consenting participants provided a blood specimen. Genetic Research Genetic factors underlying cardiovascular disease are studied using DNA isolated from the blood samples. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001013.v3.p2 on 2021-03-25 and may not include exact formatting or images. phs001013.v3.p2.c1 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs001013.v3.p2.c2 /programs/parent/projects/HVH_DS-CVD-IRB-MDS_ HVH_DS-CVD-IRB-MDS_ phs001013.v3.p2.c2 c2 DS-CVD-IRB-MDS p2 phs001013 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001013.v3.p2 v3 Heart and Vascular Health Study (HVH) HVH_DS-CVD-IRB-MDS_ parent-HVH_DS-CVD-IRB-MDS_ Yes HVH Objectives The Heart and Vascular Health Study (HVH) is a case-control study of risk factors for the development of myocardial infarction (MI), stroke, venous thrombosis (VT), and atrial fibrillation (AF). The study setting is Group Health, an integrated health care delivery system in Washington State. Background The HVH originated in 1988 with the examination of risk factors for MI. Over the ensuing years, the study has been funded by a series of grants, which have added case subjects with stroke, VT, and AF, and used a common control group. Study aims have focused on the associations of medication use with cardiovascular events. Starting in 1997, the study aims expanded to include genetic associations with cardiovascular disease. Participants recruited in 2009 or later and who provided blood samples for genetic analysis were asked for consent to deposit genetic and phenotype data in dbGaP. Design As part of the HVH study, case subjects were identified by searching for ICD-9 codes consistent with MI, stroke, VT, or AF, and medical records were reviewed to confirm the diagnosis. Control subjects were identified at random from the Group Health enrollment and were matched to MI cases. All subjects have an index date. For cases, the index date was assigned as the date that the cardiovascular event (MI, stroke, VT, or AF) came to clinical attention. For controls, the index date was a random date within the range of the case index dates. For both cases and controls, information was collected from the inpatient and outpatient medical record, by telephone interview with consenting survivors, and from the Group Health pharmacy and laboratory databases. Consenting participants provided a blood specimen. Genetic Research Genetic factors underlying cardiovascular disease are studied using DNA isolated from the blood samples. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001013.v3.p2 on 2021-03-25 and may not include exact formatting or images. phs001013.v3.p2.c2 Program: Parent Data Type: DCC Harmonized Data Type: Clinical Phenotype Study Registration: dbGaP +phs001024.v4.p1.c1 /programs/topmed/projects/PARTNERS_HMB PARTNERS_HMB phs001024.v4.p1.c1 c1 HMB p1 phs001024 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001024.v4.p1 v4 NHLBI TOPMed: Partners HealthCare Biobank PARTNERS_HMB topmed-PARTNERS_HMB Yes PARTNERS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Atrial Fibrillation Genetics Consortium (AFGen) was organized to identify common and rare genetic variation associated with atrial fibrillation risk. In the current study, we have performed whole genome sequencing in cases with early-onset atrial fibrillation. Samples in this study were enrolled as a part of the Partners HealthCare Biobank. Cases with early-onset atrial fibrillation were identified from the Biobank (defined as atrial fibrillation onset prior to 61 years and in the absence of structural heart disease). Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/phs001024 on 2021-03-17 and may not include exact formatting or images." phs001024.v4.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001032.v5.p2.c1 /programs/topmed/projects/VU_AF_GRU-IRB VU_AF_GRU-IRB phs001032.v5.p2.c1 c1 GRU-IRB p2 phs001032 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001032.v5.p2 v5 NHLBI TOPMed: The Vanderbilt Atrial Fibrillation Registry (VU_AF) VU_AF_GRU-IRB topmed-VU_AF_GRU-IRB Yes VU_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Vanderbilt Atrial Fibrillation (AF) Registry was founded in 2001. Patients with AF and family members are prospectively enrolled. At enrollment a detailed past medical history is obtained along with an AF symptom severity assessment. Blood samples are obtained for DNA extraction. Patients are followed longitudinally along with serial collection of AF symptom severity assessments. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001032.v5.p2 on 2021-03-25 and may not include exact formatting or images." phs001032.v5.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001040.v4.p1.c1 /programs/topmed/projects/WGHS_HMB WGHS_HMB phs001040.v4.p1.c1 c1 HMB p1 phs001040 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001040.v4.p1 v4 NHLBI TOPMed: Novel Risk Factors for the Development of Atrial Fibrillation in Women WGHS_HMB topmed-WGHS_HMB Yes WGHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Women's Genome Health Study (WGHS) is a prospective cohort comprised of over 25,000 initially healthy female health professionals enrolled in the Women's Health Study, which began in 1992-1994. All participants in WGHS provided baseline blood samples and extensive survey data. Women who reported atrial fibrillation during the course of the study were asked to report diagnoses of AF at baseline, 48 months, and then annually thereafter. Participants enrolled in the continued observational follow-up who reported an incident AF event on at least one yearly questionnaire were sent an additional questionnaire to confirm the episode and to collect additional information. They were also asked for permission to review their medical records, particularly available ECGs, rhythm strips, 24-hour ECGs, and information on cardiac structure and function. For all deceased participants who reported AF during the trial and extended follow-up period, family members were contacted to obtain consent and additional relevant information. An end-point committee of physicians reviewed medical records for reported events according to predefined criteria. An incident AF event was confirmed if there was ECG evidence of AF or if a medical report clearly indicated a personal history of AF. The earliest date in the medical records when documentation was believed to have occurred was set as the date of onset of AF. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001040.v4.p1 on 2021-03-25 and may not include exact formatting or images." phs001040.v4.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001062.v4.p2.c1 /programs/topmed/projects/MGH_AF_HMB-IRB MGH_AF_HMB-IRB phs001062.v4.p2.c1 c1 HMB-IRB p2 phs001062 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001062.v4.p2 v4 NHLBI TOPMed - NHGRI CCDG: Massachusetts General Hospital (MGH) Atrial Fibrillation Study MGH_AF_HMB-IRB topmed-MGH_AF_HMB-IRB Yes MGH_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Massachusetts General Hospital (MGH) Atrial Fibrillation Study was initiated in 2001. The study has enrolled serial probands, unaffected and affected family members with atrial fibrillation. At enrollment participants undergo a structured interview to systematically capture their past medical history, AF treatments, and family history. An electrocardiogram is performed; the results of an echocardiogram are obtained; and blood samples are obtained. For the TOPMed WGS project only early-onset atrial fibrillation cases were sequenced. Early-onset atrial fibrillation was defined as an age of onset prior to 66 years of age. Comprehensive phenotypic and pedigree data for study participants are available through dbGaP phs001001. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001062.v4.p2 on 2021-03-25 and may not include exact formatting or images." phs001062.v4.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001062.v4.p2.c2 /programs/topmed/projects/MGH_AF_DS-AF-IRB-RD MGH_AF_DS-AF-IRB-RD phs001062.v4.p2.c2 c2 DS-AF-IRB-RD p2 phs001062 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001062.v4.p2 v4 NHLBI TOPMed - NHGRI CCDG: Massachusetts General Hospital (MGH) Atrial Fibrillation Study MGH_AF_DS-AF-IRB-RD topmed-MGH_AF_DS-AF-IRB-RD Yes MGH_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Massachusetts General Hospital (MGH) Atrial Fibrillation Study was initiated in 2001. The study has enrolled serial probands, unaffected and affected family members with atrial fibrillation. At enrollment participants undergo a structured interview to systematically capture their past medical history, AF treatments, and family history. An electrocardiogram is performed; the results of an echocardiogram are obtained; and blood samples are obtained. For the TOPMed WGS project only early-onset atrial fibrillation cases were sequenced. Early-onset atrial fibrillation was defined as an age of onset prior to 66 years of age. Comprehensive phenotypic and pedigree data for study participants are available through dbGaP phs001001. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/phs001062 on 2021-03-17 and may not include exact formatting or images." phs001062.v4.p2.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001074.v1.p1.c2 /programs/parent/projects/GeneSTAR_DS-CVD-IRB-NPU-RD_ GeneSTAR_DS-CVD-IRB-NPU-RD_ phs001074.v1.p1.c2 c2 DS-CVD-IRB-NPU-RD p1 phs001074 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001074.v1.p1 v1 GeneSTAR (Genetic Study of Atherosclerosis Risk) NextGen Consortium: Functional Genomics of Platelet Aggregation Using iPS and Derived Megakaryocytes GeneSTAR_DS-CVD-IRB-NPU-RD_ parent-GeneSTAR_DS-CVD-IRB-NPU-RD_ Yes GeneSTAR "The causal mechanisms of common diseases and their therapies have been only marginally illuminated by genetic variants identified in genome wide association studies (GWAS) utilizing single nucleotide polymorphism (SNPs). Platelet activation pathways reflecting hemostasis and thrombosis are the underlying substrate for many cardiovascular diseases and related acute events. To overcome GWAS limitations, genomic studies are needed that integrate molecular surrogates for platelet-related phenotypes assayed in cell-based models derived from individuals of known genotypes and phenotypes. In our GWAS study of native platelet aggregation phenotypes and aggregation in response to low dose aspirin in 2200 subjects (GeneSTAR, Genetic Study of Aspirin Responsiveness), important genome wide ""signals"" (p<5x10-8) associated with native platelet aggregation and important ""signals"" associated with platelet responsiveness to aspirin were identified and replicated. Although we are currently performing functional genomics studies to elucidate our most promising findings in known genes (PEAR1, MET, PIKC3G), most ""signals"" occurred in intergenic regions or in introns. Mechanistic interpretation is limited by uncertainty as to which gene(s) are up- or down-regulated in the presence of most SNP modifications. In this 3 phase proposal, we will (1) create pluripotent stem cells (iPS) from peripheral blood mononuclear cells, and then differentiate these stem cells into megakaryocytes (2) develop an efficient strategy to produce iPS and megakaryocytes using a novel pooling method, and (3) produce iPS and megakaryocytes from 250 subjects in GeneSTAR (European Americans and African Americans), selected based on specific hypotheses derived from GWAS signals in native and post aspirin platelet function; characterize genetic mRNA transcripts using a comprehensive Affymetrix array; measure protein expression for transcripts of interest using mass spectrometry; examine mRNA and protein expression patterns for each GWAS signal to determine the functional pathway(s) involved in native platelet phenotypes; and examine the functional genomics of variations in responsiveness to aspirin using our prior genotyped and phenotyped population. Precise information about the exact functional processes in megakaryocytes and platelets may lead to innovative and tailored approaches to risk assessment and novel therapeutic targets to prevent first and recurrent cardiovascular and related thrombotic events. Study Weblinks: GeneSTAR Research Center, Genetic Studies of Atherosclerosis Risk Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001074.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001074.v1.p1.c2 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001143.v3.p1.c1 /programs/topmed/projects/BAGS_GRU-IRB BAGS_GRU-IRB phs001143.v3.p1.c1 c1 GRU-IRB p1 phs001143 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001143.v3.p1 v3 NHLBI TOPMed: The Genetics and Epidemiology of Asthma in Barbados BAGS_GRU-IRB topmed-BAGS_GRU-IRB Yes BAGS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Asthma is a complex disease where the interplay between genetic factors and environmental exposures influences susceptibility and disease prognosis. Asthmatics of African descent tend to have more severe asthma and more severe clinical symptoms than individuals of European ancestry. The baseline prevalence of asthma in Barbados is high (~20%), and from admixture analyses, we have determined that the proportion of African ancestry among Barbadian founders is similar to U.S. African Americans, rendering this a unique population to disentangle the genetic basis for asthma disparities among African ancestry populations in general. We therefore performed whole genome sequencing on 1,100 individuals from the Barbados Genetics of Asthma Study (BAGS), in order to generate additional discovery of rare and structural variants that may control risk to asthma. Study Design: Family/Twin/Trios Study Type: Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001143.v3.p1 on 2021-03-25 and may not include exact formatting or images." phs001143.v3.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001180.v2.p1.c2 /programs/parent/projects/GALAII_DS-LD-IRB-COL_ GALAII_DS-LD-IRB-COL_ phs001180.v2.p1.c2 c2 DS-LD-IRB-COL p1 phs001180 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001180.v2.p1 v2 Genes-Environments and Admixture in Latino Asthmatics (GALA II) Study GALAII_DS-LD-IRB-COL_ parent-GALAII_DS-LD-IRB-COL_ Yes GALAII "A case-control pharmacogenetic study of bronchodilator drug response among racially admixed Latino children with asthma. Each participant had two spirometry measurements using the KoKo PFT System. With the first spirometry test, participant was administered with 4 puffs of HFA Albuterol. The second albuterol measurement was based on age, for participants under 16 years of age, additional 2 puffs were administered and for those over 16 years of age, additional 4 puffs were administered. The overall goal is to identify genetic factors which are predictive of drug response in children with asthma. The principal tools include a questionnaire and biological specimen collection. Participants are 8-21 years old at time of recruitment. Children with asthma have physician-diagnosed asthma, symptoms and medications. The GALAII Study is utilized in the following dbGaP substudies. To view genotypes, analysis, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" box located on the right hand side of this top-level study page phs001180 GALAII Study. phs001274phs001274 GALAII GWAS Study Weblinks: Asthma Collaboratory Study Design: Case-Control Study Type: Case-Control Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001180.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001180.v2.p1.c2 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001189.v3.p1.c1 /programs/topmed/projects/CCAF_AF_GRU-IRB CCAF_AF_GRU-IRB phs001189.v3.p1.c1 c1 GRU-IRB p1 phs001189 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001189.v3.p1 v3 NHLBI TOPMed: Cleveland Clinic Atrial Fibrillation (CCAF) Study CCAF_AF_GRU-IRB topmed-CCAF_AF_GRU-IRB Yes CCAF_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Cleveland Clinic Atrial Fibrillation Study consists of clinical and genetic data of patients with atrial fibrillation and control cohorts from the Cleveland Clinic CV/Arrhythmia Biobank, including the Cleveland Clinic Lone Atrial Fibrillation GeneBank. The Cleveland Clinic Lone AF GeneBank Study has enrolled patients with lone AF, defined as AF in the absence of significant structural heart disease. The CV/Arrhythmia Biobank has also enrolled participants with non-lone atrial fibrillation. All patients provided written informed consent. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001189.v3.p1 on 2021-03-25 and may not include exact formatting or images." phs001189.v3.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001194.v2.p2.c1 /programs/parent/projects/PCGC_HMB_ PCGC_HMB_ phs001194.v2.p2.c1 c1 HMB p2 phs001194 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001194.v2.p2 v2 National Heart, Lung, and Blood Institute (NHLBI) Bench to Bassinet Program: The Pediatric Cardiac Genetics Consortium (PCGC) Study PCGC_HMB_ parent-PCGC_HMB_ Yes PCGC "Multi-center, prospective observational cohort study of individuals with congenital heart defects (CHD). Phenotypic data and source DNA derived from 10,000 probands, parents, and families of interest are being collected to investigate relationships between genetic factors and phenotypic and clinical outcomes in patients with CHD. The PCGC Cohort is utilized in the following dbGaP substudies. To view genotypes, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs001194 PCGC Cohort. phs000571 The Pediatric Cardiac Genetics Consortium (PCGC) The Gabriella Miller Kids First Pediatric Research Program (Kids First) subset of the PCGC project (phs001194) is now accessible through a separate dbGaP study accession: phs001138. To access this dataset, please submit a Data Access Request (DAR) for phs001138. Approval of this DAR will be expedited for approved users of phs001194. To learn about other Kids First datasets visit https://kidsfirstdrc.org/. Study Weblinks: From Bench to Bassinet: CHD Genes Study Design: Prospective Longitudinal Cohort Study Type: Parent-Offspring Trios Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001194.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001194.v2.p2.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001194.v2.p2.c2 /programs/parent/projects/PCGC_DS-CHD_ PCGC_DS-CHD_ phs001194.v2.p2.c2 c2 DS-CHD p2 phs001194 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001194.v2.p2 v2 National Heart, Lung, and Blood Institute (NHLBI) Bench to Bassinet Program: The Pediatric Cardiac Genetics Consortium (PCGC) Study PCGC_DS-CHD_ parent-PCGC_DS-CHD_ Yes PCGC "Multi-center, prospective observational cohort study of individuals with congenital heart defects (CHD). Phenotypic data and source DNA derived from 10,000 probands, parents, and families of interest are being collected to investigate relationships between genetic factors and phenotypic and clinical outcomes in patients with CHD. The PCGC Cohort is utilized in the following dbGaP substudies. To view genotypes, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs001194 PCGC Cohort. phs000571 The Pediatric Cardiac Genetics Consortium (PCGC) The Gabriella Miller Kids First Pediatric Research Program (Kids First) subset of the PCGC project (phs001194) is now accessible through a separate dbGaP study accession: phs001138. To access this dataset, please submit a Data Access Request (DAR) for phs001138. Approval of this DAR will be expedited for approved users of phs001194. To learn about other Kids First datasets visit https://kidsfirstdrc.org/. Study Weblinks: From Bench to Bassinet: CHD Genes Study Design: Prospective Longitudinal Cohort Study Type: Parent-Offspring Trios Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001194.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001194.v2.p2.c2 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001207.v2.p1.c1 /programs/topmed/projects/Sarcoidosis_DS-SAR-IRB Sarcoidosis_DS-SAR-IRB phs001207.v2.p1.c1 c1 DS-SAR-IRB p1 phs001207 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001207.v2.p1 v2 NHLBI TOPMed: African American Sarcoidosis Genetics Resource Sarcoidosis_DS-SAR-IRB topmed-Sarcoidosis_DS-SAR-IRB Yes Sarcoidosis "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This study aims to comprehensively interrogate the genomes of African American sarcoidosis families. Sarcoidosis is characterized by a hyperimmune response resulting in granuloma formation in multiple organs. It affects African Americans (AAs) more frequently and more severely than whites. While previous linkage, admixture, candidate gene and genome-wide association (GWA) studies show statistically compelling effects, causal variants are still unknown and much of sarcoidosis heritability is yet to be explained. This ""missing"" heritability likely includes effects of both common (minor allele frequency (MAF)>5%) and rare variants (MAF<5%), since, in AAs, the former are inadequately represented and the latter are completely unexplored by commercial genotyping arrays. These facts, coupled with the availability of next-generation sequencing compel us to perform an exhaustive search for genetic variants that form the basis of sarcoidosis. The data generated are certain to identify candidate causal variants, provide fundamental insight for functional studies and lead to important new hypotheses of inflammation resulting in new treatments in not only sarcoidosis but other inflammatory diseases as well. Study Design: Family/Twin/Trios Study Type: Family Affected Sib Pairs dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001207.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001207.v2.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001211.v3.p2.c1 /programs/topmed/projects/ARIC_HMB-IRB ARIC_HMB-IRB phs001211.v3.p2.c1 c1 HMB-IRB p2 phs001211 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001211.v3.p2 v3 NHLBI TOPMed - NHGRI CCDG: Atherosclerosis Risk in Communities (ARIC) ARIC_HMB-IRB topmed-ARIC_HMB-IRB Yes ARIC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Participants from the Atherosclerosis Risk in Communities (ARIC) Study, a large population-based longitudinal cohort study, have been included in this Project and whole genome sequencing will be performed to contribute to analyses of early-onset atrial fibrillation and venous thromboembolism. Additional phenotype and genotype data are available for these individuals on dbGaP and can be accessed through the parent ARIC Cohort accession (phs000280). The National Heart, Lung and Blood Institute (NHLBI) Trans-Omics for Precision Medicine (TOPMed) program is designed to generate scientific resources to enhance understanding of fundamental biological processes that underlie heart, lung, blood and sleep disorders (HLBS). It is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program seeks to uncover factors that increase or decrease the risk of disease, identify subtypes of disease, and develop more targeted and personalized treatments. The Whole Genome Sequencing (WGS) Project is part of NHLBI's TOPMed program and serves as an initial step for the larger initiative. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001211.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs001211.v3.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001211.v3.p2.c2 /programs/topmed/projects/ARIC_DS-CVD-IRB ARIC_DS-CVD-IRB phs001211.v3.p2.c2 c2 DS-CVD-IRB p2 phs001211 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001211.v3.p2 v3 NHLBI TOPMed - NHGRI CCDG: Atherosclerosis Risk in Communities (ARIC) ARIC_DS-CVD-IRB topmed-ARIC_DS-CVD-IRB Yes ARIC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Participants from the Atherosclerosis Risk in Communities (ARIC) Study, a large population-based longitudinal cohort study, have been included in this Project and whole genome sequencing will be performed to contribute to analyses of early-onset atrial fibrillation and venous thromboembolism. Additional phenotype and genotype data are available for these individuals on dbGaP and can be accessed through the parent ARIC Cohort accession (phs000280). The National Heart, Lung and Blood Institute (NHLBI) Trans-Omics for Precision Medicine (TOPMed) program is designed to generate scientific resources to enhance understanding of fundamental biological processes that underlie heart, lung, blood and sleep disorders (HLBS). It is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program seeks to uncover factors that increase or decrease the risk of disease, identify subtypes of disease, and develop more targeted and personalized treatments. The Whole Genome Sequencing (WGS) Project is part of NHLBI's TOPMed program and serves as an initial step for the larger initiative. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001211.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs001211.v3.p2.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001215.v3.p2.c1 /programs/topmed/projects/SAFHS_DS-DHD-IRB-PUB-MDS-RD SAFHS_DS-DHD-IRB-PUB-MDS-RD phs001215.v3.p2.c1 c1 DS-DHD-IRB-PUB-MDS-RD p2 phs001215 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001215.v3.p2 v3 NHLBI TOPMed: San Antonio Family Heart Study (SAFHS) SAFHS_DS-DHD-IRB-PUB-MDS-RD topmed-SAFHS_DS-DHD-IRB-PUB-MDS-RD Yes SAFHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The San Antonio Family Heart Study (SAFHS) is a complex pedigree-based mixed longitudinal study designed to identify low frequency or rare variants influencing susceptibility to cardiovascular disease, using whole genome sequence (WGS) information from 2,590 individuals in large Mexican American pedigrees from San Antonio, Texas. The major objectives of this study are to identify low frequency or rare variants in and around known common variant signals for CVD, as well as to find novel low frequency or rare variants influencing susceptibility to CVD. WGS of the SAFHS cohort has been obtained through three efforts. Approximately 540 WGS were performed commercially at 50X by Complete Genomics, Inc (CGI) as part of the large T2D-GENES Project. The phenotype and genotype data for this group is available at dbGaP under accession number phs000462. An additional ~900 WGS at 30X were obtained through Illumina as part of the R01HL113322 ""Whole Genome Sequencing to Identify Causal Genetic Variants Influencing CVD Risk"" project. Finally, ~1,150 WGS at 30X WGS were obtained through Illumina funded by a supplement as part of the NHLBI's TOPMed program. Extensive phenotype data are provided for sequenced individuals primarily obtained from the P01HL45522 ""Genetics of Atherosclerosis in Mexican Americans"" for adults and R01HD049051 for children in these same families. Phenotype information was collected between 1991 and 2016. For this dataset, the SAFHS appellation represents an amalgamation of the original SAFHS participants and an expansion that reexamined families previously recruited for the San Antonio Family Diabetes Study (R01DK042273) and the San Antonio Family Gall Bladder Study (R01DK053889). Due to this substantial examination history, participants may have information from up to five visits. The clinical variables reported are coordinated with TOPMed and include major adverse cardiac events (MACE), T2D status and age at diagnosis, glycemic traits (fasting glucose and insulin), blood pressure, blood lipids (total cholesterol, HDL cholesterol, calculated LDL cholesterol and triglycerides). Additional phenotype data include the medication status at each visit, classified in four categories as any current use of diabetes, hypertension or lipid-lowering medications, and, for females, current use of female hormones. Anthropometric measurements include age, sex, height, weight, hip circumference, waist circumference and derived ratios. PBMC derived gene expression assays for a subset of ~1,060 individuals obtained using the Illumina Sentrix-6 chip is also available from the baseline examination. The WGS data have been jointly called and are available in the current TOPMed accession (phs001215). Study Design: Family/Twin/Trios Study Type: Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001215.v3.p2 on 2021-03-25 and may not include exact formatting or images." phs001215.v3.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001217.v2.p1.c1 /programs/topmed/projects/GenSalt_DS-HCR-IRB GenSalt_DS-HCR-IRB phs001217.v2.p1.c1 c1 DS-HCR-IRB p1 phs001217 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001217.v2.p1 v2 NHLBI TOPMed: Genetic Epidemiology Network of Salt Sensitivity (GenSalt) GenSalt_DS-HCR-IRB topmed-GenSalt_DS-HCR-IRB Yes GenSalt "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The GenSalt study aims to identify genes which interact with dietary sodium and potassium intake to influence blood pressure in Han Chinese participants from rural north China. Whole genome sequencing will be conducted among 1,860 participants of the Genetic Epidemiology Network of Salt Sensitivity (GenSalt) Study. We will work in collaboration with participating TOPMed studies to identify novel common, low-frequency and rare variants associated with an array of cardiometabolic phenotypes. In addition, we will explore the relation of low-frequency and rare variants with salt-sensitivity among GenSalt study participants. Study Design: Family/Twin/Trios Study Type: Parent-Offspring Trios Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001217.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001217.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001218.v2.p1.c2 /programs/topmed/projects/GeneSTAR_DS-CVD-IRB-NPU-MDS GeneSTAR_DS-CVD-IRB-NPU-MDS phs001218.v2.p1.c2 c2 DS-CVD-IRB-NPU-MDS p1 phs001218 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001218.v2.p1 v2 NHLBI TOPMed: Genetic Study of Atherosclerosis Risk (GeneSTAR) GeneSTAR_DS-CVD-IRB-NPU-MDS topmed-GeneSTAR_DS-CVD-IRB-NPU-MDS Yes GeneSTAR "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. GeneSTAR began in 1982 as the Johns Hopkins Sibling and Family Heart Study, a prospective longitudinal family-based study conducted originally in healthy adult siblings of people with documented early onset coronary disease under 60 years of age. Commencing in 2003, the siblings, their offspring, and the coparent of the offspring participated in a 2 week trial of aspirin 81 mg/day with pre and post ex vivo platelet function assessed using multiple agonists in whole blood and platelet rich plasma. Extensive additional cardiovascular testing and risk assessment was done at baseline and serially. Follow-up was carried out to determine incident cardiovascular disease, stroke, peripheral arterial disease, diabetes, cancer, and related comorbidities, from 5 to 30 years after study entry. The goal of several additional phenotyping and interventional substudies has been to discover and amplify understanding of the mechanisms of atherogenic vascular diseases and attendant comorbidities. Study Weblinks: GeneSTAR Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Cohort Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001218.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001218.v2.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001237.v2.p1.c1 /programs/topmed/projects/WHI_HMB-IRB WHI_HMB-IRB phs001237.v2.p1.c1 c1 HMB-IRB p1 phs001237 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001237.v2.p1 v2 NHLBI TOPMed: Women's Health Initiative (WHI) WHI_HMB-IRB topmed-WHI_HMB-IRB Yes WHI "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is Whole Genome Sequencing data from the TOPMed participation of the Women's Health Initiative. Approximately 11,100 subjects were involved in this study: approximately 1,100 cases of VTE, 4,000 cases of ischemic stroke, 900 cases of hemorrhagic stroke, and 5,100 controls. Summary level phenotypes for the WHI Cohort study participants can be viewed at the top-level study page phs000200 WHI Cohort. Individual level phenotype data and molecular data for all WHI top-level study and substudies are available by requesting Authorized Access to the WHI Cohort study phs000200. Study Weblinks: WHI NHLBI Women's Health Initiative Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001237.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001237.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001237.v2.p1.c2 /programs/topmed/projects/WHI_HMB-IRB-NPU WHI_HMB-IRB-NPU phs001237.v2.p1.c2 c2 HMB-IRB-NPU p1 phs001237 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001237.v2.p1 v2 NHLBI TOPMed: Women's Health Initiative (WHI) WHI_HMB-IRB-NPU topmed-WHI_HMB-IRB-NPU Yes WHI "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is Whole Genome Sequencing data from the TOPMed participation of the Women's Health Initiative. Approximately 11,100 subjects were involved in this study: approximately 1,100 cases of VTE, 4,000 cases of ischemic stroke, 900 cases of hemorrhagic stroke, and 5,100 controls. Summary level phenotypes for the WHI Cohort study participants can be viewed at the top-level study page phs000200 WHI Cohort. Individual level phenotype data and molecular data for all WHI top-level study and substudies are available by requesting Authorized Access to the WHI Cohort study phs000200. Study Weblinks: WHI NHLBI Women's Health Initiative Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001237.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001237.v2.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001238.v2.p1.c1 /programs/parent/projects/GENOA_DS-ASC-RF-NPU_ GENOA_DS-ASC-RF-NPU_ phs001238.v2.p1.c1 c1 DS-ASC-RF-NPU p1 phs001238 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001238.v2.p1 v2 Genetic Epidemiology Network of Arteriopathy (GENOA) GENOA_DS-ASC-RF-NPU_ parent-GENOA_DS-ASC-RF-NPU_ Yes GENOA The Genetic Epidemiology Network of Arteriopathy (GENOA) is one of four networks in the NHLBI Family-Blood Pressure Program (FBPP). GENOA's long-term objective is to elucidate the genetics of target organ complications of hypertension, including both atherosclerotic and arteriolosclerotic complications involving the heart, brain, kidneys, and peripheral arteries. The longitudinal GENOA Study recruited European-American and African-American sibships with at least 2 individuals with clinically diagnosed essential hypertension before age 60 years. All other members of the sibship were invited to participate regardless of their hypertension status. Participants were diagnosed with hypertension if they had either 1) a previous clinical diagnosis of hypertension by a physician with current anti-hypertensive treatment, or 2) an average systolic blood pressure ≥ 140 mm Hg or diastolic blood pressure ≥ 90 mm Hg based on the second and third readings at the time of their clinic visit. The Family Blood Pressure Program (FBPP), GENOA's parent program, is an unprecedented collaboration to identify genes influencing blood pressure (BP) levels, hypertension, and its target-organ damage. This program has conducted over 21,000 physical examinations, assembled a shared database of several hundred BP and hypertension-related phenotypic measurements, completed genome-wide linkage analyses for BP, hypertension, and hypertension associated risk factors and complications, and published over 130 manuscripts on program findings. The FBPP emerged from what was initially funded as four independent networks of investigators (HyperGEN, GenNet, SAPPHIRe and GENOA) competing to identify genetic determinants of hypertension in multiple ethnic groups. Realizing the greater likelihood of success through collaboration, the investigators created a single confederation with program-wide and network-specific goals. Study Weblinks: FBPP STAMPEED Study Design: Prospective Longitudinal Cohort Study Type: Sibling Cohort Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001238.v2.p1 on 2021-03-25 and may not include exact formatting or images. phs001238.v2.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001252.v1.p1.c1 /programs/parent/projects/ECLIPSE_DS-COPD-RD_ ECLIPSE_DS-COPD-RD_ phs001252.v1.p1.c1 c1 DS-COPD-RD p1 phs001252 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001252.v1.p1 v1 Evaluation of COPD Longitudinally to Identify Predictive Surrogate Endpoints (ECLIPSE) ECLIPSE_DS-COPD-RD_ parent-ECLIPSE_DS-COPD-RD_ Yes ECLIPSE ECLIPSE was a longitudinal observational study of 2164 COPD subjects and a smaller number of smoking controls (337) and nonsmoking controls (245) followed regularly for three years, with three chest CT scans (at baseline, one year, and three years) (Vestbo, European Respiratory Journal 2008; 31: 869). Inclusion criteria included age 40-75, at least 10 pack-years of smoking, and spirometry in GOLD grades 2-4 (COPD cases) or normal spirometry with post-bronchodilator FEV1 >85% predicted and FEV1/FVC>0.7 (controls). Study visits were performed at enrollment, three months, and every six months thereafter with spirometry, questionnaires, and other clinical evaluations. The ECLIPSE CT scans have been analyzed with the VIDA software for emphysema and airway phenotypes. ECLIPSE has provided key insights into the clinical epidemiology of COPD, including COPD exacerbations (Hurst, NEJM 2010; 363: 1128) and lung function decline in COPD (Vestbo, NEJM 2011; 365: 1184). ECLIPSE has been used in a number of genetic studies of COPD susceptibility and protein biomarkers(Faner, Thorax 2014; 69: 666). Genome-wide gene expression microarray data are available in 147 induced sputum samples from COPD subjects and 248 peripheral blood samples from COPD and control subjects. Study Weblinks: ECLIPSE Study Design: Case-Control Study Type: Case-Control Longitudinal Cohort Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001252.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs001252.v1.p1.c1 Program: Parent Data Type: Clinical Phenotype Study Registration: dbGaP +phs001293.v2.p1.c1 /programs/topmed/projects/HyperGEN_GRU-IRB HyperGEN_GRU-IRB phs001293.v2.p1.c1 c1 GRU-IRB p1 phs001293 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001293.v2.p1 v2 NHLBI TOPMed: HyperGEN - Genetics of Left Ventricular (LV) Hypertrophy HyperGEN_GRU-IRB topmed-HyperGEN_GRU-IRB Yes HyperGEN "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Hypertension Genetic Epidemiology Network Study (HyperGEN) - Genetics of Left Ventricular (LV) Hypertrophy is a familial study aimed to understand genetic risk factors for LV hypertrophy by conducting genetic studies of continuous traits from echocardiography exams. The originating HyperGEN study aimed to understand genetic risk factors for hypertension. Data from detailed clinical exams as well as genotyping data for linkage studies, candidate gene studies and GWAS have been collected and is shared between HyperGEN and the ancillary HyperGEN - Genetics of LV Hypertrophy study. Study Design: Family/Twin/Trios Study Type: Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001293.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001293.v2.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001293.v2.p1.c2 /programs/topmed/projects/HyperGEN_DS-CVD-IRB-RD HyperGEN_DS-CVD-IRB-RD phs001293.v2.p1.c2 c2 DS-CVD-IRB-RD p1 phs001293 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001293.v2.p1 v2 NHLBI TOPMed: HyperGEN - Genetics of Left Ventricular (LV) Hypertrophy HyperGEN_DS-CVD-IRB-RD topmed-HyperGEN_DS-CVD-IRB-RD Yes HyperGEN "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Hypertension Genetic Epidemiology Network Study (HyperGEN) - Genetics of Left Ventricular (LV) Hypertrophy is a familial study aimed to understand genetic risk factors for LV hypertrophy by conducting genetic studies of continuous traits from echocardiography exams. The originating HyperGEN study aimed to understand genetic risk factors for hypertension. Data from detailed clinical exams as well as genotyping data for linkage studies, candidate gene studies and GWAS have been collected and is shared between HyperGEN and the ancillary HyperGEN - Genetics of LV Hypertrophy study. Study Design: Family/Twin/Trios Study Type: Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001293.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001293.v2.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001345.v2.p1.c1 /programs/topmed/projects/GENOA_DS-ASC-RF-NPU GENOA_DS-ASC-RF-NPU phs001345.v2.p1.c1 c1 DS-ASC-RF-NPU p1 phs001345 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001345.v2.p1 v2 NHLBI TOPMed: Genetic Epidemiology Network of Arteriopathy (GENOA) GENOA_DS-ASC-RF-NPU topmed-GENOA_DS-ASC-RF-NPU Yes GENOA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Genetic Epidemiology Network of Arteriopathy (GENOA) is one of four networks in the NHLBI Family-Blood Pressure Program (FBPP). GENOA's long-term objective is to elucidate the genetics of target organ complications of hypertension, including both atherosclerotic and arteriolosclerotic complications involving the heart, brain, kidneys, and peripheral arteries. The longitudinal GENOA Study recruited European-American and African-American sibships with at least 2 individuals with clinically diagnosed essential hypertension before age 60 years. All other members of the sibship were invited to participate regardless of their hypertension status. Participants were diagnosed with hypertension if they had either 1) a previous clinical diagnosis of hypertension by a physician with current anti-hypertensive treatment, or 2) an average systolic blood pressure ≥ 140 mm Hg or diastolic blood pressure ≥ 90 mm Hg based on the second and third readings at the time of their clinic visit. Only participants of the African-American Cohort were sequenced through TOPMed. The Family Blood Pressure Program (FBPP), GENOA's parent program, is an unprecedented collaboration to identify genes influencing blood pressure (BP) levels, hypertension, and its target-organ damage. This program has conducted over 21,000 physical examinations, assembled a shared database of several hundred BP and hypertension-related phenotypic measurements, completed genome-wide linkage analyses for BP, hypertension, and hypertension associated risk factors and complications, and published over 130 manuscripts on program findings. The FBPP emerged from what was initially funded as four independent networks of investigators (HyperGEN, GenNet, SAPPHIRe and GENOA) competing to identify genetic determinants of hypertension in multiple ethnic groups. Realizing the greater likelihood of success through collaboration, the investigators created a single confederation with program-wide and network-specific goals. Comprehensive phenotypic data for GENOA study participants are available through dbGaP phs001238. Study Weblinks: FBPP STAMPEED Study Design: Family/Twin/Trios Study Type: Cohort Sibling Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001345.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001345.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001359.v2.p1.c1 /programs/topmed/projects/GOLDN_DS-CVD-IRB GOLDN_DS-CVD-IRB phs001359.v2.p1.c1 c1 DS-CVD-IRB p1 phs001359 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001359.v2.p1 v2 NHLBI TOPMed: GOLDN Epigenetic Determinants of Lipid Response to Dietary Fat and Fenofibrate GOLDN_DS-CVD-IRB topmed-GOLDN_DS-CVD-IRB Yes GOLDN "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The GOLDN study was initiated to assess how genetic factors interact with environmental (diet and drug) interventions to influence blood levels of triglycerides and other atherogenic lipid species and inflammation markers (registered at clinicaltrials.gov, number NCT00083369). The study recruited Caucasian participants primarily from three-generational pedigrees from two NHLBI Family Heart Study (FHS) field centers (Minneapolis, MN and Salt Lake City, UT). Only families with at least two siblings were recruited and only participants who did not take lipid-lowering agents (pharmaceuticals or nutraceuticals) for at least 4 weeks prior to the initial visit were included. The diet intervention followed the protocol of Patsch et al. (1992). The whipping cream (83% fat) meal had 700 Calories/m2 body surface area (2.93 mJ/m2 body surface area): 3% of calories were derived from protein (instant nonfat dry milk) and 14% from carbohydrate (sugar). The ratio of polyunsaturated to saturated fat was 0.06 and the cholesterol content of the average meal was 240 mg. The mixture was blended with ice and flavorings. Blood samples were drawn immediately before (fasting) and at 3.5 and 6 hours after consuming the high-fat meal. The diet intervention was administered at baseline as well as after a 3-week treatment with 160 mg micronized fenofibrate. Participants were given the option to complete one or both (diet and drug) interventions. Of all participants, 1079 had phenotypic data and provided appropriate consent, and underwent whole genome sequencing through the Trans-Omics for Precision Medicine (TOPMed) program. Comprehensive phenotypic and pedigree data for GOLDN study participants are available through dbGaP phs000741. Study Weblinks: GOLDN Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001359.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001359.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001368.v2.p2.c1 /programs/topmed/projects/CHS_HMB-MDS CHS_HMB-MDS phs001368.v2.p2.c1 c1 HMB-MDS p2 phs001368 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 v2 NHLBI TOPMed: Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Project: Cardiovascular Health Study CHS_HMB-MDS topmed-CHS_HMB-MDS Yes CHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Participants from the Cardiovascular Health Study (CHS), a large population-based longitudinal cohort study ( phs000287), have been included in the TOPMed project. Whole genome sequencing will be performed to contribute to multiple analyses, including cardiovascular disease risk factors, subclinical disease measures, the occurrence of myocardial infarction (MI) and stroke, and analyses of venous thromboembolism (VTE). Study Weblinks: CHS - NHLBI Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001368.v2.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001368.v2.p2.c2 /programs/topmed/projects/CHS_HMB-NPU-MDS CHS_HMB-NPU-MDS phs001368.v2.p2.c2 c2 HMB-NPU-MDS p2 phs001368 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 v2 NHLBI TOPMed: Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Project: Cardiovascular Health Study CHS_HMB-NPU-MDS topmed-CHS_HMB-NPU-MDS Yes CHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Participants from the Cardiovascular Health Study (CHS), a large population-based longitudinal cohort study ( phs000287), have been included in the TOPMed project. Whole genome sequencing will be performed to contribute to multiple analyses, including cardiovascular disease risk factors, subclinical disease measures, the occurrence of myocardial infarction (MI) and stroke, and analyses of venous thromboembolism (VTE). Study Weblinks: CHS - NHLBI Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001368.v2.p2.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001368.v2.p2.c4 /programs/topmed/projects/CHS_DS-CVD-NPU-MDS CHS_DS-CVD-NPU-MDS phs001368.v2.p2.c4 c4 DS-CVD-NPU-MDS p2 phs001368 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 v2 NHLBI TOPMed: Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Project: Cardiovascular Health Study CHS_DS-CVD-NPU-MDS topmed-CHS_DS-CVD-NPU-MDS Yes CHS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Participants from the Cardiovascular Health Study (CHS), a large population-based longitudinal cohort study ( phs000287), have been included in the TOPMed project. Whole genome sequencing will be performed to contribute to multiple analyses, including cardiovascular disease risk factors, subclinical disease measures, the occurrence of myocardial infarction (MI) and stroke, and analyses of venous thromboembolism (VTE). Study Weblinks: CHS - NHLBI Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001368.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001368.v2.p2.c4 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001387.v2.p1.c3 /programs/topmed/projects/THRV_DS-CVD-IRB-COL-NPU-RD THRV_DS-CVD-IRB-COL-NPU-RD phs001387.v2.p1.c3 c3 DS-CVD-IRB-COL-NPU-RD p1 phs001387 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001387.v2.p1 v2 NHLBI TOPMed: Rare Variants for Hypertension in Taiwan Chinese (THRV) THRV_DS-CVD-IRB-COL-NPU-RD topmed-THRV_DS-CVD-IRB-COL-NPU-RD Yes THRV "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The THRV-TOPMed study consists of three cohorts: The SAPPHIRe Family cohort (N=1,271), TSGH (Tri-Service General Hospital, a hospital-based cohort, N=160), and TCVGH (Taichung Veterans General Hospital, another hospital-based cohort, N=922), all based in Taiwan. 1,271 subjects were previously recruited as part of the NHLBI-sponsored SAPPHIRe Network (which is part of the Family Blood Pressure Program, FBPP). The SAPPHIRe families were recruited to have two or more hypertensive sibs, some families also with one normotensive/hypotensive sib. The two Hospital-based cohorts (TSGH and TCVGH) both recruited unrelated subjects with different recruitment criteria (matched with SAPPHIRe subjects for age, sex, and BMI category). Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001387.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001387.v2.p1.c3 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001395.v1.p1.c1 /programs/topmed/projects/HCHS-SOL_HMB-NPU HCHS-SOL_HMB-NPU phs001395.v1.p1.c1 c1 HMB-NPU p1 phs001395 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001395.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: Hispanic Community Health Study/Study of Latinos (HCHS/SOL) HCHS-SOL_HMB-NPU topmed-HCHS-SOL_HMB-NPU Yes HCHS-SOL "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This study contains whole genome sequence data. A case-control sample of individuals from the Hispanic Community Health Study/Study of Latinos (HCHS/SOL), a multicenter prospective cohort study of 16,415 persons of Cuban, Dominican, Mexican, Puerto Rican, Central American, and South American background (phs000810), was selected for whole genome sequencing, including participants with a history of physician-diagnosed asthma and asthma-free participants. Study Weblinks: Hispanic Community Health Study / Study of Latinos NHLBI Trans-Omics for Precision Medicine Whole Genome Sequencing Program Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001395.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001395.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001395.v1.p1.c2 /programs/topmed/projects/HCHS-SOL_HMB HCHS-SOL_HMB phs001395.v1.p1.c2 c2 HMB p1 phs001395 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001395.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: Hispanic Community Health Study/Study of Latinos (HCHS/SOL) HCHS-SOL_HMB topmed-HCHS-SOL_HMB Yes HCHS-SOL "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This study contains whole genome sequence data. A case-control sample of individuals from the Hispanic Community Health Study/Study of Latinos (HCHS/SOL), a multicenter prospective cohort study of 16,415 persons of Cuban, Dominican, Mexican, Puerto Rican, Central American, and South American background (phs000810), was selected for whole genome sequencing, including participants with a history of physician-diagnosed asthma and asthma-free participants. Study Weblinks: Hispanic Community Health Study / Study of Latinos NHLBI Trans-Omics for Precision Medicine Whole Genome Sequencing Program Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001395.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001395.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001402.v2.p1.c1 /programs/topmed/projects/Mayo_VTE_GRU Mayo_VTE_GRU phs001402.v2.p1.c1 c1 GRU p1 phs001402 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001402.v2.p1 v2 NHLBI TOPMed: Whole Genome Sequencing of Venous Thromboembolism (WGS of VTE) Mayo_VTE_GRU topmed-Mayo_VTE_GRU Yes Mayo_VTE "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This study consists of 338 VTE cases from an inception cohort of Olmsted County, MN residents (OC) with a first lifetime objectively-diagnosed idiopathic VTE during the 40-year study period, 1966-2005. All living study subjects were invited to provide a whole blood sample at the Mayo Clinical Research Unit for leukocyte genomic DNA and plasma collection. For living study subjects who did not provide a blood sample, we retrieved any leftover blood (""waste"" blood) from samples collected as part of routine clinical diagnostic testing and used this to extract DNA after obtaining patient consent. For deceased cases, with IRB approval, we extracted DNA from any available stored tissue within the Mayo Tissue Archive. This ""tissue"" DNA has been successfully genotyped in prior studies. Three trained and experienced study nurse abstractors reviewed the complete medical records in the community of all potential cases. Note: WGS sample IDs for the previous GENEVA study cases (phs000289) are included in this dataset. The phenotypes for the GENEVA study are located under the above phs number. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001402.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001402.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001412.v2.p1.c1 /programs/topmed/projects/AACAC_HMB-IRB-COL-NPU AACAC_HMB-IRB-COL-NPU phs001412.v2.p1.c1 c1 HMB-IRB-COL-NPU p1 phs001412 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001412.v2.p1 v2 NHLBI TOPMed: Diabetes Heart Study (DHS) African American Coronary Artery Calcification (AA CAC) AACAC_HMB-IRB-COL-NPU topmed-AACAC_HMB-IRB-COL-NPU Yes AACAC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Diabetes Heart Study (DHS) is a family-based study enriched for type 2 diabetes (T2D). The cohort included 1443 European American and African American participants from 564 families with multiple cases of type 2 diabetes (Bowden et al., 2010. Review of Diabetic Studies 7:188-201. PMID: 21409311). The cohort was recruited between 1998 and 2006. Participants were extensively phenotyped for measures of subclinical CVD and other known CVD risk factors. Primary outcomes were quantified burden of vascular calcified plaque in the coronary artery, carotid artery, and abdominal aorta all determined from non-contrast computed tomography scans. Study Design: Cross-Sectional Study Type: Cross-Sectional Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001412.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001412.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001412.v2.p1.c2 /programs/topmed/projects/AACAC_DS-DHD-IRB-COL-NPU AACAC_DS-DHD-IRB-COL-NPU phs001412.v2.p1.c2 c2 DS-DHD-IRB-COL-NPU p1 phs001412 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001412.v2.p1 v2 NHLBI TOPMed: Diabetes Heart Study (DHS) African American Coronary Artery Calcification (AA CAC) AACAC_DS-DHD-IRB-COL-NPU topmed-AACAC_DS-DHD-IRB-COL-NPU Yes AACAC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Diabetes Heart Study (DHS) is a family-based study enriched for type 2 diabetes (T2D). The cohort included 1443 European American and African American participants from 564 families with multiple cases of type 2 diabetes (Bowden et al., 2010. Review of Diabetic Studies 7:188-201. PMID: 21409311). The cohort was recruited between 1998 and 2006. Participants were extensively phenotyped for measures of subclinical CVD and other known CVD risk factors. Primary outcomes were quantified burden of vascular calcified plaque in the coronary artery, carotid artery, and abdominal aorta all determined from non-contrast computed tomography scans. Study Design: Cross-Sectional Study Type: Cross-Sectional Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001412.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001412.v2.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001416.v2.p1.c1 /programs/topmed/projects/MESA_HMB MESA_HMB phs001416.v2.p1.c1 c1 HMB p1 phs001416 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001416.v2.p1 v2 NHLBI TOPMed: MESA and MESA Family AA-CAC MESA_HMB topmed-MESA_HMB Yes MESA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Multi-Ethnic Study of Atherosclerosis (MESA) is a study of the characteristics of subclinical cardiovascular disease (disease detected non-invasively before it has produced clinical signs and symptoms) and the risk factors that predict progression to clinically overt cardiovascular disease or progression of the subclinical disease. MESA researchers study a diverse, population-based sample of 6,814 asymptomatic men and women aged 45-84. Thirty-eight percent of the recruited participants are white, 28 percent African-American, 22 percent Hispanic, and 12 percent Asian, predominantly of Chinese descent. Comprehensive phenotypic and pedigree data for MESA study participants are available through dbGaP entry phs000209. MESA Participants were recruited from six field centers across the United States: Wake Forest University, Columbia University, Johns Hopkins University, University of Minnesota, Northwestern University and University of California - Los Angeles. Each participant received an extensive physical exam and determination of coronary calcification, ventricular mass and function, flow-mediated endothelial vasodilation, carotid intimal-medial wall thickness and presence of echogenic lucencies in the carotid artery, lower extremity vascular insufficiency, arterial wave forms, electrocardiographic (ECG) measures, standard coronary risk factors, sociodemographic factors, lifestyle factors, and psychosocial factors. Selected repetition of subclinical disease measures and risk factors at follow-up visits allows study of the progression of disease. Blood samples have been assayed for putative biochemical risk factors and stored for case-control studies. DNA has been extracted and lymphocytes cryopreserved (for possible immortalization) for study of candidate genes and possibly, genome-wide scanning, expression, and other genetic techniques. Participants are being followed for identification and characterization of cardiovascular disease events, including acute myocardial infarction and other forms of coronary heart disease (CHD), stroke, and congestive heart failure; for cardiovascular disease interventions; and for mortality. In addition to the six Field Centers, MESA involves a Coordinating Center, a Central Laboratory, and Central Reading Centers for Computed Tomography (CT), Magnetic Resonance Imaging (MRI), Ultrasound, and Electrocardiography (ECG). Protocol development, staff training, and pilot testing were performed in the first 18 months of the study. The first examination took place over two years, from July 2000 - July 2002. It was followed by five examination periods that were 17-20 months in length. Participants have been contacted every 9 to 12 months throughout the study to assess clinical morbidity and mortality. MESA Family The general goal of the MESA Family Study, an ancillary study to MESA funded by a grant from NHLBI, is to apply modern genetic analysis and genotyping methodologies to delineate the genetic determinants of early atherosclerosis. This is being accomplished by utilizing all the current organizational structures of the Multi-Ethnic Study of Atherosclerosis (MESA) and Genetic Centers at Cedars-Sinai Medical Center and University of Virginia. In the MESA Family Study, the goal is to locate and identify genes contributing to the genetic risk for cardiovascular disease (CVD), by looking at the early changes of atherosclerosis within families (mainly siblings). 2128 individuals from 594 families, yielding 3,026 sibpairs divided between African Americans and Hispanic-Americans, were recruited by utilizing the existing framework of MESA. MESA Family studied siblings of index subjects from the MESA study and from new sibpair families (with the same demographic characteristics) and is determining the extent of genetic contribution to the variation in coronary calcium (obtained via CT Scan) and carotid artery wall thickness (B-mode ultrasound) in the two largest non-majority U.S. populations. In a small proportion of subjects, parents of MESA index subjects participating in MESA Family were studied but only to have blood drawn for genotyping. The MESA Family cohort was recruited from the six MESA Field Centers. MESA Family participants underwent the same examination as MESA participants during May 2004 - May 2007. DNA was extracted and lymphocytes immortalized for study of candidate genes, genome-wide linkage scanning, and analyzed for linkage with these subclinical cardiovascular traits. While linkage analysis is the primary approach being used, an additional aspect of the MESA Family Study takes advantage of the existing MESA study population for testing a variety of candidate genes for association with the same subclinical traits. Genotyping and data analysis will occur throughout the study. Study Weblinks: MESA Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001416.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001416.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001416.v2.p1.c2 /programs/topmed/projects/MESA_HMB-NPU MESA_HMB-NPU phs001416.v2.p1.c2 c2 HMB-NPU p1 phs001416 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001416.v2.p1 v2 NHLBI TOPMed: MESA and MESA Family AA-CAC MESA_HMB-NPU topmed-MESA_HMB-NPU Yes MESA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Multi-Ethnic Study of Atherosclerosis (MESA) is a study of the characteristics of subclinical cardiovascular disease (disease detected non-invasively before it has produced clinical signs and symptoms) and the risk factors that predict progression to clinically overt cardiovascular disease or progression of the subclinical disease. MESA researchers study a diverse, population-based sample of 6,814 asymptomatic men and women aged 45-84. Thirty-eight percent of the recruited participants are white, 28 percent African-American, 22 percent Hispanic, and 12 percent Asian, predominantly of Chinese descent. Comprehensive phenotypic and pedigree data for MESA study participants are available through dbGaP entry phs000209. MESA Participants were recruited from six field centers across the United States: Wake Forest University, Columbia University, Johns Hopkins University, University of Minnesota, Northwestern University and University of California - Los Angeles. Each participant received an extensive physical exam and determination of coronary calcification, ventricular mass and function, flow-mediated endothelial vasodilation, carotid intimal-medial wall thickness and presence of echogenic lucencies in the carotid artery, lower extremity vascular insufficiency, arterial wave forms, electrocardiographic (ECG) measures, standard coronary risk factors, sociodemographic factors, lifestyle factors, and psychosocial factors. Selected repetition of subclinical disease measures and risk factors at follow-up visits allows study of the progression of disease. Blood samples have been assayed for putative biochemical risk factors and stored for case-control studies. DNA has been extracted and lymphocytes cryopreserved (for possible immortalization) for study of candidate genes and possibly, genome-wide scanning, expression, and other genetic techniques. Participants are being followed for identification and characterization of cardiovascular disease events, including acute myocardial infarction and other forms of coronary heart disease (CHD), stroke, and congestive heart failure; for cardiovascular disease interventions; and for mortality. In addition to the six Field Centers, MESA involves a Coordinating Center, a Central Laboratory, and Central Reading Centers for Computed Tomography (CT), Magnetic Resonance Imaging (MRI), Ultrasound, and Electrocardiography (ECG). Protocol development, staff training, and pilot testing were performed in the first 18 months of the study. The first examination took place over two years, from July 2000 - July 2002. It was followed by five examination periods that were 17-20 months in length. Participants have been contacted every 9 to 12 months throughout the study to assess clinical morbidity and mortality. MESA Family The general goal of the MESA Family Study, an ancillary study to MESA funded by a grant from NHLBI, is to apply modern genetic analysis and genotyping methodologies to delineate the genetic determinants of early atherosclerosis. This is being accomplished by utilizing all the current organizational structures of the Multi-Ethnic Study of Atherosclerosis (MESA) and Genetic Centers at Cedars-Sinai Medical Center and University of Virginia. In the MESA Family Study, the goal is to locate and identify genes contributing to the genetic risk for cardiovascular disease (CVD), by looking at the early changes of atherosclerosis within families (mainly siblings). 2128 individuals from 594 families, yielding 3,026 sibpairs divided between African Americans and Hispanic-Americans, were recruited by utilizing the existing framework of MESA. MESA Family studied siblings of index subjects from the MESA study and from new sibpair families (with the same demographic characteristics) and is determining the extent of genetic contribution to the variation in coronary calcium (obtained via CT Scan) and carotid artery wall thickness (B-mode ultrasound) in the two largest non-majority U.S. populations. In a small proportion of subjects, parents of MESA index subjects participating in MESA Family were studied but only to have blood drawn for genotyping. The MESA Family cohort was recruited from the six MESA Field Centers. MESA Family participants underwent the same examination as MESA participants during May 2004 - May 2007. DNA was extracted and lymphocytes immortalized for study of candidate genes, genome-wide linkage scanning, and analyzed for linkage with these subclinical cardiovascular traits. While linkage analysis is the primary approach being used, an additional aspect of the MESA Family Study takes advantage of the existing MESA study population for testing a variety of candidate genes for association with the same subclinical traits. Genotyping and data analysis will occur throughout the study. Study Weblinks: MESA Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal Family dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001416.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001416.v2.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001434.v1.p1.c1 /programs/topmed/projects/miRhythm_GRU miRhythm_GRU phs001434.v1.p1.c1 c1 GRU p1 phs001434 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001434.v1.p1 v1 NHLBI TOPMed: Defining the time-dependent genetic and transcriptomic responses to cardiac injury among patients with arrhythmias miRhythm_GRU topmed-miRhythm_GRU Yes miRhythm "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The UMMS miRhythm Study is an ongoing study of adult patients undergoing an elective electrophysiology study or arrhythmia ablation procedure for a supraventricular or ventricular arrhythmia, including atrial fibrillation (AF). Atrial fibrillation is a major clinical and public health problem that is related to atrial pathologic remodeling. Few tools are available to quantify the activity or extent of this remodeling, rendering it difficult to identify individuals at risk for AF. Previous studies have suggested an important role for miRNA in cardiovascular disease through gene expression regulation, making this a promising avenue for studying AF mechanisms. The aim of the study is to determine the time-dependent changes to key circulating miRNAs in a model of planned atrial injury and remodeling via ablation. Such knowledge might provide additional insight into the biology and activity of the acute atrial injury response, and furthermore, inform new targets for development of preventative interventions or allow for better AF risk stratification. To assess pathways regulating atrial pathological remodeling, patient blood samples are collected prior to their ablation procedures and also at a regularly scheduled 1-month follow-up appointment. Plasma expression of miRNA is measured using high-throughput quantitative reverse transcriptase polymerase chain reaction (RT-qPCR), providing novel insights into the regulatory processes underlying AF, as well as acute atrial injury in vivo. Additionally, data collected from whole-genome sequencing (WGS) is used to supplement miRNA analyses and further explore new relations between genes and abnormal heart rhythm. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001434.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001434.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001435.v1.p1.c1 /programs/topmed/projects/AustralianFamilialAF_HMB-NPU-MDS AustralianFamilialAF_HMB-NPU-MDS phs001435.v1.p1.c1 c1 HMB-NPU-MDS p1 phs001435 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001435.v1.p1 v1 NHLBI TOPMed: Australian Familial Atrial Fibrillation Study AustralianFamilialAF_HMB-NPU-MDS topmed-AustralianFamilialAF_HMB-NPU-MDS Yes AustralianFamilialAF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. In the Australian Familial AF Study, a cohort of probands with familial AF was recruited for genetics studies at the Victor Chang Cardiac Research Institute. Familial AF cases were identified from in-patient and out-patient populations at St. Vincent's Hospital and by referral from collaborating physicians throughout Australia. Study subjects underwent clinical evaluation with history, ECG and echocardiogram, and informed consent was obtained from all participants. 151 probands aged <66 years at the time of diagnosis were included in this analysis. The control cohort was comprised of age- and sex-matched individuals (n=151) who had no history of cardiovascular disease. In the current TOPMed study, we have performed whole genome sequencing in European Ancestry cases with early-onset atrial fibrillation (defined as atrial fibrillation onset prior to 61 years). Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001435.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001435.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001466.v1.p1.c1 /programs/topmed/projects/pharmHU_HMB pharmHU_HMB phs001466.v1.p1.c1 c1 HMB p1 phs001466 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 v1 NHLBI TOPMed: Pharmacogenomics of Hydroxyurea in Sickle Cell Disease (PharmHU) pharmHU_HMB topmed-pharmHU_HMB Yes pharmHU "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Sickle cell disease (SCD) is characterized by the presence of sickle hemoglobin (HbS) within circulating erythrocytes resulting in hemolytic anemia, vascular occlusion, and end organ damage due to alterations in the shape and deformability of the cell membrane. The disease is inherited in an autosomal recessive pattern, and is most commonly caused by a single nucleotide substitution in the hemoglobin subunit beta (HBB) gene located on chromosome 11. Participants in this study include children with SCD treated with hydroxyurea to pharmacologically increase fetal hemoglobin (HbF) levels and reduce disease severity. Therefore, the primary phenotype of interest in this study is the change in HbF levels in response to hydroxyurea treatment. Genetic factors have been shown to influence inter-individual variation in drug response, and identification of novel genes and variants associated with clinical outcomes in SCD will be achieved through collaboration between Baylor College of Medicine, Augusta University, Columbia University Medical Center, Emory University School of Medicine and Children's Healthcare of Atlanta, and St. Jude Children's Research Hospital. The NHLBI TOPMed Program is designed to generate scientific resources to enhance understanding of fundamental biological processes that underlie heart, lung, blood and sleep disorders (HLBS). It is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001466.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001466.v1.p1.c2 /programs/topmed/projects/pharmHU_DS-SCD-RD pharmHU_DS-SCD-RD phs001466.v1.p1.c2 c2 DS-SCD-RD p1 phs001466 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 v1 NHLBI TOPMed: Pharmacogenomics of Hydroxyurea in Sickle Cell Disease (PharmHU) pharmHU_DS-SCD-RD topmed-pharmHU_DS-SCD-RD Yes pharmHU "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Sickle cell disease (SCD) is characterized by the presence of sickle hemoglobin (HbS) within circulating erythrocytes resulting in hemolytic anemia, vascular occlusion, and end organ damage due to alterations in the shape and deformability of the cell membrane. The disease is inherited in an autosomal recessive pattern, and is most commonly caused by a single nucleotide substitution in the hemoglobin subunit beta (HBB) gene located on chromosome 11. Participants in this study include children with SCD treated with hydroxyurea to pharmacologically increase fetal hemoglobin (HbF) levels and reduce disease severity. Therefore, the primary phenotype of interest in this study is the change in HbF levels in response to hydroxyurea treatment. Genetic factors have been shown to influence inter-individual variation in drug response, and identification of novel genes and variants associated with clinical outcomes in SCD will be achieved through collaboration between Baylor College of Medicine, Augusta University, Columbia University Medical Center, Emory University School of Medicine and Children's Healthcare of Atlanta, and St. Jude Children's Research Hospital. The NHLBI TOPMed Program is designed to generate scientific resources to enhance understanding of fundamental biological processes that underlie heart, lung, blood and sleep disorders (HLBS). It is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001466.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001466.v1.p1.c3 /programs/topmed/projects/pharmHU_DS-SCD pharmHU_DS-SCD phs001466.v1.p1.c3 c3 DS-SCD p1 phs001466 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 v1 NHLBI TOPMed: Pharmacogenomics of Hydroxyurea in Sickle Cell Disease (PharmHU) pharmHU_DS-SCD topmed-pharmHU_DS-SCD Yes pharmHU "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Sickle cell disease (SCD) is characterized by the presence of sickle hemoglobin (HbS) within circulating erythrocytes resulting in hemolytic anemia, vascular occlusion, and end organ damage due to alterations in the shape and deformability of the cell membrane. The disease is inherited in an autosomal recessive pattern, and is most commonly caused by a single nucleotide substitution in the hemoglobin subunit beta (HBB) gene located on chromosome 11. Participants in this study include children with SCD treated with hydroxyurea to pharmacologically increase fetal hemoglobin (HbF) levels and reduce disease severity. Therefore, the primary phenotype of interest in this study is the change in HbF levels in response to hydroxyurea treatment. Genetic factors have been shown to influence inter-individual variation in drug response, and identification of novel genes and variants associated with clinical outcomes in SCD will be achieved through collaboration between Baylor College of Medicine, Augusta University, Columbia University Medical Center, Emory University School of Medicine and Children's Healthcare of Atlanta, and St. Jude Children's Research Hospital. The NHLBI TOPMed Program is designed to generate scientific resources to enhance understanding of fundamental biological processes that underlie heart, lung, blood and sleep disorders (HLBS). It is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001466.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001466.v1.p1.c3 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001467.v1.p1.c1 /programs/topmed/projects/SAPPHIRE_asthma_DS-ASTHMA-IRB-COL SAPPHIRE_asthma_DS-ASTHMA-IRB-COL phs001467.v1.p1.c1 c1 DS-ASTHMA-IRB-COL p1 phs001467 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001467.v1.p1 v1 NHLBI TOPMed: Study of Asthma Phenotypes and Pharmacogenomic Interactions by Race-Ethnicity (SAPPHIRE) SAPPHIRE_asthma_DS-ASTHMA-IRB-COL topmed-SAPPHIRE_asthma_DS-ASTHMA-IRB-COL Yes SAPPHIRE_asthma "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Started in 2007, the Study of Asthma Phenotypes and Pharmacogenomic Interactions by Race-ethnicity (SAPPHIRE) is one of the largest asthma cohort studies in the United States. Its overarching goal is to elucidate the genetic underpinnings of asthma and asthma medication treatment response. The cohort was recruited from a large health care system serving southeast Michigan and the Detroit metropolitan area, and the participants broadly represent the demographic and socioeconomic diversity of the region. Control participants (i.e., patients without a diagnosis with asthma) were recruited from the same health system and geographic region. By virtue of their health system enrollment, both asthma case and control patients have longitudinal clinical information which was routinely collected as part of their care. Both case and control patients underwent at detailed evaluation at the time of enrollment which included lung function testing and bronchodilator response. The SAPPHIRE cohort is a member of the Asthma Translational Genomics Collaborative (ATGC). The latter was selected for whole genome sequencing in Phase 3 of the National Heart Lung and Blood Institute's TOPMed Program. The SAPPHIRE sample selected for sequencing includes African American and/or Latino individuals with and without asthma. Study Weblinks: Williams Lab - SAPPHIRE Study Design: Prospective Longitudinal Cohort Study Type: Cohort Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001467.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001467.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001468.v2.p1.c1 /programs/topmed/projects/REDS-III_Brazil_SCD_GRU-IRB-PUB-NPU REDS-III_Brazil_SCD_GRU-IRB-PUB-NPU phs001468.v2.p1.c1 c1 GRU-IRB-PUB-NPU p1 phs001468 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001468.v2.p1 v2 NHLBI TOPMed: REDS-III Brazil Sickle Cell Disease Cohort (REDS-BSCDC) REDS-III_Brazil_SCD_GRU-IRB-PUB-NPU topmed-REDS-III_Brazil_SCD_GRU-IRB-PUB-NPU Yes REDS-III_Brazil_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Establishing a Brazilian Sickle Cell Disease Cohort and Identifying Molecular Determinants of Response to Transfusions, Genetic Determinants of Alloimmunization, and Risk Factors Associated with HIV Infection. The REDS-III Brazil SCD Cohort study focused on transfusion practices and predictors of health outcomes in patients with Sickle Cell Disease (SCD) and began in the Fall of 2013. The four primary aims of this study are: 1) Aim A - Establish a cohort of SCD patients with a comprehensive centralized electronic database of detailed clinical, laboratory and transfusion information, as well as establish a repository of blood samples to support biological studies relevant to SCD pathogenesis and transfusion complications; 2) Aim B - Characterize changes in markers of inflammation in response to transfusion by analyzing chemokine/cytokine panels in serial post transfusion specimens; 3) Aim C - Identify single nucleotide polymorphisms (SNPs) that contribute to the risk of red blood cell alloimmunization in SCD by performing a genome-wide association (GWA) study in transfused SCD patients; and, 4) Aim D - Characterize risk of HIV and HIV outcomes in the Brazilian SCD population and compare SCD outcomes among HIV sero-positive and sero-negative SCD patients. Patients are enrolled from six hospitals affiliated with the participating four REDS-III Brazil hemocenters. Study Weblinks: REDS-III Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001468.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001468.v2.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001472.v1.p1.c1 /programs/topmed/projects/ECLIPSE_DS-COPD-MDS-RD ECLIPSE_DS-COPD-MDS-RD phs001472.v1.p1.c1 c1 DS-COPD-MDS-RD p1 phs001472 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001472.v1.p1 v1 NHLBI TOPMed: Evaluation of COPD Longitudinally to Identify Predictive Surrogate Endpoints (ECLIPSE) ECLIPSE_DS-COPD-MDS-RD topmed-ECLIPSE_DS-COPD-MDS-RD Yes ECLIPSE "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. ECLIPSE was a longitudinal observational study of 2164 COPD subjects and a smaller number of smoking controls (337) and nonsmoking controls (245) followed regularly for three years, with three chest CT scans (at baseline, one year, and three years) (Vestbo et al., 2008, PMID: 18216052). Subjects were enrolled at clinical centers in the US, Canada, Europe, and New Zealand. Inclusion criteria included subjects ages 40-75, at least 10 pack-years of smoking, and spirometry in GOLD grades 2-4 (COPD cases) or normal spirometry with post-bronchodilator FEV1 >85% (predicted) and FEV1/FVC>0.7 (controls). Study visits were performed at enrollment, three months, and every six months thereafter with spirometry, questionnaires, and other clinical evaluations. The ECLIPSE CT scans have been analyzed with the VIDA software for emphysema and airway phenotypes. ECLIPSE has provided key insights into the clinical epidemiology of COPD, including COPD exacerbations (Hurst, et. al., 2010, PMID: 20843247) and lung function decline in COPD (Vestbo, et. al., 2011, PMID: 21991892). ECLIPSE has been used in a number of genetic studies of COPD susceptibility and protein biomarkers (Faner, et. al., 2014, PMID: 24310110). Genome-wide gene expression microarray data are available in 147 induced sputum samples from COPD subjects and 248 peripheral blood samples from COPD and control subjects. Phenotype data for ECLIPSE subjects is available through dbGaP phs001252. Study Weblinks: What is ECLIPSE Study Design: Case-Control Study Type: Case-Control Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001472.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001472.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001514.v1.p1.c1 /programs/topmed/projects/Walk_PHaSST_SCD_HMB-IRB-PUB-COL-NPU-MDS-GSO Walk_PHaSST_SCD_HMB-IRB-PUB-COL-NPU-MDS-GSO phs001514.v1.p1.c1 c1 HMB-IRB-PUB-COL-NPU-MDS-GSO p1 phs001514 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001514.v1.p1 v1 NHLBI TOPMed: Walk-PHaSST Sickle Cell Disease (SCD) Walk_PHaSST_SCD_HMB-IRB-PUB-COL-NPU-MDS-GSO topmed-Walk_PHaSST_SCD_HMB-IRB-PUB-COL-NPU-MDS-GSO Yes Walk_PHaSST_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Walk-PHaSST study is a multi-center clinical trial to evaluate the effects of sildenafil on Sickle Cell Disease (SCD) population with low exercise capacity associated with an increased Doppler-estimated pulmonary artery systolic pressure (as assessed by the tricuspid regurgitant velocity (TRV)). It is a double-blind, placebo-controlled trial to assess the safety, tolerability, and efficacy of sildenafil in patients with SCD who had both an elevated TRV and decreased exercise capacity. The screening phase of the study enrolled 720 subjects and 74 of them were randomized for the clinical trial. For the screening cohort, we have collected general demographics and race/ethnicity, hemoglobin genotype, physical examination, laboratory screening, transthoracic Doppler echocardiography, and 6 minute walk test in 9 US and 1 UK site. The walk-PHaSST biorepository have banked samples from 610 of the screening subjects. A total of 592 subjects from the screening phase are included in the TOPMed program for WGS. Study Design: Cross-Sectional Study Type: Cross-Sectional Clinical Trial dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001514.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001514.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001514.v1.p1.c2 /programs/topmed/projects/Walk_PHaSST_SCD_DS-SCD-IRB-PUB-COL-NPU-MDS-RD Walk_PHaSST_SCD_DS-SCD-IRB-PUB-COL-NPU-MDS-RD phs001514.v1.p1.c2 c2 DS-SCD-IRB-PUB-COL-NPU-MDS-RD p1 phs001514 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001514.v1.p1 v1 NHLBI TOPMed: Walk-PHaSST Sickle Cell Disease (SCD) Walk_PHaSST_SCD_DS-SCD-IRB-PUB-COL-NPU-MDS-RD topmed-Walk_PHaSST_SCD_DS-SCD-IRB-PUB-COL-NPU-MDS-RD Yes Walk_PHaSST_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Walk-PHaSST study is a multi-center clinical trial to evaluate the effects of sildenafil on Sickle Cell Disease (SCD) population with low exercise capacity associated with an increased Doppler-estimated pulmonary artery systolic pressure (as assessed by the tricuspid regurgitant velocity (TRV)). It is a double-blind, placebo-controlled trial to assess the safety, tolerability, and efficacy of sildenafil in patients with SCD who had both an elevated TRV and decreased exercise capacity. The screening phase of the study enrolled 720 subjects and 74 of them were randomized for the clinical trial. For the screening cohort, we have collected general demographics and race/ethnicity, hemoglobin genotype, physical examination, laboratory screening, transthoracic Doppler echocardiography, and 6 minute walk test in 9 US and 1 UK site. The walk-PHaSST biorepository have banked samples from 610 of the screening subjects. A total of 592 subjects from the screening phase are included in the TOPMed program for WGS. Study Design: Cross-Sectional Study Type: Cross-Sectional Clinical Trial dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001514.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001514.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001515.v1.p1.c1 /programs/topmed/projects/MLOF_HMB-PUB MLOF_HMB-PUB phs001515.v1.p1.c1 c1 HMB-PUB p1 phs001515 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001515.v1.p1 v1 NHLBI TOPMed: MyLifeOurFuture (MLOF) Research Repository of patients with hemophilia A (factor VIII deficiency) or hemophilia B (factor IX deficiency) MLOF_HMB-PUB topmed-MLOF_HMB-PUB Yes MLOF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Hemophilia A and B are X-linked bleeding disorders resulting from a deficiency in coagulation factor VIII (FVIII) or factor IX (FIX), respectively. Hemophilia affects approximately 1/5000 male births worldwide, and results in premature death and disability due to bleeding if coagulation factor replacement therapy is not used effectively. Hemophilia is clinically categorized by coagulation factor activity levels and ranges in severity from mild (6% to 30%) to moderate (1-5%) to severe (<1%). Many female ""carriers"" of hemophilia also have decreased factor activity and morbidity from bleeding. Hemophilia A and B are almost always caused by identifiable mutations in the F8 and F9 genes, respectively, and these mutations are found throughout the structural genes. Although the hemophilias are monogenic disorders, there are wide variations in disease severity and therapeutic outcomes which are not readily explained by the disease causing mutations alone. The My Life Our Future (MLOF) project (www.mylifeourfuture.org) is a national resource developed by a partnership of BloodworksNW (BWNW, formerly the Puget Sound Blood Center), the American Thrombosis and Hemostasis Network (ATHN), the National Hemophilia Foundation (NHF) and Bioverativ, to provide free F8 and F9 gene variant analysis to patients with hemophilia A or B, and to establish a research repository of DNA sequence, DNA, RNA, buffy coat, serum and plasma. The sequence analysis and serum samples are linked to a phenotypic database hosted by ATHN, with samples submitted and clinical data entered at ~100 hemophilia treatment centers (HTCs) nationwide. (See ATHN Research Report Brief in the resource center at www.athn.org). MLOF has become the largest hemophilia genetic project worldwide. The roles of the MLOF partners are: BWNW, to serve as the central laboratory for the project and house the research repository; ATHN, to support and provide the administrative link with HTCs, to facilitate the collection of accurate phenotypic data, to conduct research review and approval for use of the repository and with BWNW to provide samples and data for research projects; NHF, to provide consumer education and facilitate consumer input into the project; and Bioverativ, to provide financial support and scientific input. The project is governed by a Steering Committee consisting of one representative from each organization. Subject samples chosen from the MLOF parent study for TOPMed and WGS were drawn from those who gave (or parents gave) informed consent for the Research Repository and included patients of all severities and type, but with an emphasis on those with severe hemophilia and others at increased risk of neutralizing antibody (inhibitor) formation and who had samples in the Research Repository (plasma, serum, RNA) for potential additional -omic studies. Also included were samples from subjects where a likely causative variant for hemophilia was not found in the F8 or F9 coding region, intron-exon boundaries or immediate upstream and downstream regions. Since hemophilia is an X-linked disorder, the majority of subjects are male. Racial distribution is similar to the overall population distribution. Study Weblinks: mylifeourfuture Study Design: Cross-Sectional Study Type: Cross-Sectional dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001515.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001515.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001542.v1.p1.c2 /programs/topmed/projects/GALA_DS-LD-IRB-COL GALA_DS-LD-IRB-COL phs001542.v1.p1.c2 c2 DS-LD-IRB-COL p1 phs001542 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001542.v1.p1 v1 NHLBI TOPMed: Genetics of Asthma in Latino Americans (GALA) GALA_DS-LD-IRB-COL topmed-GALA_DS-LD-IRB-COL Yes GALA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. A Case pharmacogenetic study of bronchodilator drug response (Albuterol) among racially admixed Latino children with asthma between the ages of 8-40. Lung function testing was performed using the KoKo PFT system and each participant was administered albuterol dependent on age. Participants under 16 years of age, were administered 2 puffs of albuterol from a standard metered dose inhaler and 4 puffs for participants over 16 years old. The overall goal is to identify genetic factors which are predictive of drug response in children with asthma. The principal tools include a questionnaire and biological specimen collection. Participants with asthma have physician-diagnosed asthma, symptoms and medications. Study Weblinks: Asthma Collaboratory Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001542.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001542.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001543.v1.p1.c1 /programs/topmed/projects/AFLMU_HMB-IRB-PUB-COL-NPU-MDS AFLMU_HMB-IRB-PUB-COL-NPU-MDS phs001543.v1.p1.c1 c1 HMB-IRB-PUB-COL-NPU-MDS p1 phs001543 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001543.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: AF Biobank LMU in the context of the MED Biobank LMU AFLMU_HMB-IRB-PUB-COL-NPU-MDS topmed-AFLMU_HMB-IRB-PUB-COL-NPU-MDS Yes AFLMU "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Atrial Fibrillation Biobank Ludwig Maximilian University (AFLMU) Study contributes to the spectrum of disease by adding carefully characterized patients with atrial fibrillation. Atrial fibrillation, one of the most common human arrhythmias confers major morbidity, mortality and health care cost, and has been demonstrated to be caused and influenced by genetic and -omics factors. Particularly, AFLMU enrolled patients with an early onset of atrial fibrillation to increase the genetic burden on disease pathophysiology. All patients were recruited applying standardized protocols to maintain homogeneity in data and DNA quality. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001543.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001543.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001544.v1.p1.c1 /programs/topmed/projects/MPP_HMB-NPU-MDS MPP_HMB-NPU-MDS phs001544.v1.p1.c1 c1 HMB-NPU-MDS p1 phs001544 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001544.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: Malmo Preventive Project (MPP) MPP_HMB-NPU-MDS topmed-MPP_HMB-NPU-MDS Yes MPP "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Malmö Preventive Project (MPP) was a community-based disease prevention program including 33,346 inhabitants from the city of Malmö in Southern Sweden. Complete birth cohorts between 1921-1949 were invited, and the participation rate was 71%. Participants underwent screening between 1974 to 1992 for cardiovascular risk factors, alcohol abuse, and breast cancer. Between 2002-2006, surviving participants were invited to a reexamination which included blood sampling from which DNA has been extracted. Subjects with prevalent or incident AF were identified from national registers as previously described, and cases with DNA were then matched in a 1:1 fashion to controls with DNA from the same cohort by sex, age (±1 year), and date of baseline exam (±1 year). Also, controls required a follow-up exceeding that of the corresponding AF case. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001544.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001544.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001545.v1.p1.c1 /programs/topmed/projects/INSPIRE_AF_DS-MULTIPLE_DISEASES-MDS INSPIRE_AF_DS-MULTIPLE_DISEASES-MDS phs001545.v1.p1.c1 c1 DISEASES-MDS p1 phs001545 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001545.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: Intermountain INSPIRE Registry INSPIRE_AF_DS-MULTIPLE_DISEASES-MDS topmed-INSPIRE_AF_DS-MULTIPLE_DISEASES-MDS Yes INSPIRE_AF_DS-MULTIPLE "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The INtermountain Healthcare Biological Samples Collection Project and Investigational REgistry for the On-going Study of Disease Origin, Progression and Treatment (Intermountain INSPIRE Registry) purpose is to collect biological samples, clinical information and laboratory data from Intermountain Healthcare patients. The registry originally collected samples in patients undergoing a coronary angiography as part of the Intermountain Heart Collaborative Study. It has been expanded to collect samples in patients diagnosed with all types of medical conditions, and patients from the general population including those who have not been diagnosed with health related issues. Just over 25,000 individuals have provided samples as part of this registry. The registry enables researchers to develop a comprehensive collection of information that may help in disease management, including determining best medical practices for predicting, preventing and treating medical conditions. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001545.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001545.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001546.v1.p1.c1 /programs/topmed/projects/DECAF_GRU DECAF_GRU phs001546.v1.p1.c1 c1 GRU p1 phs001546 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001546.v1.p1 v1 NHLBI TOPMed: Determining the association of chromosomal variants with non-PV triggers and ablation-outcome in AF (DECAF) DECAF_GRU topmed-DECAF_GRU Yes DECAF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The DECAF trial was conducted at the Texas Cardiac Arrhythmia Institute (TCAI) in 2013 in collaboration with the University of Texas at Austin. Four hundred consecutive AF patients undergoing catheter ablation were enrolled. All participants provided voluntary informed consents. Blood samples were collected before the ablation procedure and labeled with anonymous patient identifier. The researchers at UT Austin responsible for DNA extraction and genetic analysis were blinded about the clinical characteristics and identification of the study participants. AF cases included adults >18 years of age from both sex and all AF types. Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001546.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001546.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001547.v1.p1.c1 /programs/topmed/projects/GENAF_HMB-NPU GENAF_HMB-NPU phs001547.v1.p1.c1 c1 HMB-NPU p1 phs001547 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001547.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: The GENetics in Atrial Fibrillation (GENAF) Study GENAF_HMB-NPU topmed-GENAF_HMB-NPU Yes GENAF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Genetics in AF (GENAF) study enrolled individuals with early-onset lone AF before age 50 in Norway between 2009 and 2016. Early-onset was defined as diagnosis of AF before age 50. Lone AF was defined as AF in the absence of clinical or echocardiographic findings of cardiovascular disease, hypertension, metabolic or pulmonary disease. AF was documented in ECG. All participants underwent clinical examination, including ECG, echocardiography, and blood draw, from which DNA has been extracted. The study conforms to the principles of the Declaration of Helsinki and was approved by the Regional Ethics Committee (REK) in Norway (Protocol reference number: 2009/2224-5). All included patients gave written informed consent. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001547.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001547.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001598.v1.p1.c1 /programs/topmed/projects/JHU_AF_HMB-NPU-MDS JHU_AF_HMB-NPU-MDS phs001598.v1.p1.c1 c1 HMB-NPU-MDS p1 phs001598 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001598.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: The Johns Hopkins University School of Medicine Atrial Fibrillation Genetics Study JHU_AF_HMB-NPU-MDS topmed-JHU_AF_HMB-NPU-MDS Yes JHU_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Atrial fibrillation (AF), the most common sustained cardiac arrhythmia, is the primary cause of many hospital admissions, and is associated with significant secondary morbidity by increasing the risk of stroke, heart failure, and all-cause mortality. The incidence of AF is on the rise, and it is projected that by the year 2050 more than 10 million patients will be affected by AF in the United States alone. Anti-arrhythmic medications have limited success in maintaining sinus rhythm, are associated with side effects, and appear ineffective at reducing mortality compared to a strategy of rate control and anticoagulation. Given the significant morbidity associated with this common arrhythmia, surgical and catheter ablation techniques have been developed to treat AF. However, despite the incorporation of various strategies for ablation, long-term recurrence rates of AF remain higher than 25 percent after ablation. Current techniques for catheter ablation of AF include pulmonary vein isolation and complex fractionated atrial electrogram (CFAE) ablation. However, the contribution of each strategy to long-term procedural success and the relative importance of each strategy for different patients remain unknown. Recent advances in cardiac imaging have allowed detailed analysis of left atrial myocardial anatomy. Parallel advances in molecular genetics have identified several candidate genes involved in familial and non-familial AF. However, the pathophysiology of AF generation and maintenance, and the potential contribution of such genetic or anatomic substrates for patient selection, and for target identification during catheter ablation have not yet been examined. Advances in molecular genetics and imaging, coupled with techniques for endocardial and epicardial mapping in the electrophysiology laboratory present an opportunity to significantly improve our understanding of (1) The relation of paroxysmal versus persistent AF with (a) structural left atrial changes (left/right atrial scar, wall thinning, pulmonary vein anomalies, and coronary sinus dilation) and with (b) candidate genetic variants. (2) The relation of candidate genetic variants with (a) structural left atrial changes and with (b) electrophysiologic properties (atrial effective refractory period (AERP) inhomogeneity, voltage abnormalities, trigger burden and location, C FAE extent and location), (3) The relation of structural left atrial changes with (a) CFAE location as targets for catheter ablation and with (b) reversible conduction block/myocardial injury after pulmonary vein isolation, and (4) Individualized endocardial targets for AF ablation based on candidate genes and anatomic substrates. The proposed study will improve our understanding of the underlying pathophysiology of AF, and may improve current techniques for treatment of this important arrhythmia. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001598.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001598.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001599.v1.p1.c1 /programs/topmed/projects/BostonBrazil_SCD_HMB-IRB-COL BostonBrazil_SCD_HMB-IRB-COL phs001599.v1.p1.c1 c1 HMB-IRB-COL p1 phs001599 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001599.v1.p1 v1 NHLBI TOPMed: Boston-Brazil Sickle Cell Disease (SCD) Cohort BostonBrazil_SCD_HMB-IRB-COL topmed-BostonBrazil_SCD_HMB-IRB-COL Yes BostonBrazil_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.This study involves sequencing of patients with a diagnosis of sickle cell disease from Brazil. No exclusionary criteria were employed and any eligible patients that consented to this study were recruited. Study Design: Prospective Longitudinal Cohort Study Type:Cohort dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-07-13 and may not include exact formatting or images." phs001599.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001600.v2.p2.c1 /programs/topmed/projects/CATHGEN_DS-CVD-IRB CATHGEN_DS-CVD-IRB phs001600.v2.p2.c1 c1 DS-CVD-IRB p2 phs001600 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001600.v2.p2 v2 NHLBI TOPMed - NHGRI CCDG: Early-onset Atrial Fibrillation in the CATHeterization GENetics (CATHGEN) Cohort CATHGEN_DS-CVD-IRB topmed-CATHGEN_DS-CVD-IRB Yes CATHGEN 'This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ''TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4'' and ''TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4''. Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.The CATHeterization GENetics (CATHGEN) biorepository collected biospecimens and clinical data on individuals age ≥18 undergoing cardiac catheterization for concern of ischemic heart disease at a single center (Duke University Medical Center) from 2000-2010; a total of N=9334 individuals were collected. Samples were matched at the individual level to clinical data collected at the time of catheterization and stored in the Duke Databank for Cardiovascular Diseases (DDCD). Clinical data included subject demographics, cardiometabolic risk factors, cardiac history including symptoms, age-of-onset of cardiovascular diseases, coronary anatomy and cardiac function at catheterization, laboratory data, and yearly follow-up for hospitalizations, vital status, medication use and lifestyle factors. AF cases were defined as individuals who had ever had AF based on any ECG available at Duke University or ICD-9 code for AF used for inpatient or outpatient billing. Study Design: Case Set Study Type:Case Set dbGaP estimated ancestry using GRAF-pop NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images.' phs001600.v2.p2.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001601.v1.p1.c1 /programs/topmed/projects/CCDG_PMBB_AF_HMB-IRB-PUB CCDG_PMBB_AF_HMB-IRB-PUB phs001601.v1.p1.c1 c1 HMB-IRB-PUB p1 phs001601 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001601.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: Penn Medicine BioBank Early Onset Atrial Fibrillation Study CCDG_PMBB_AF_HMB-IRB-PUB topmed-CCDG_PMBB_AF_HMB-IRB-PUB Yes CCDG_PMBB_AF This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, 'TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2' and 'TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4'. Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Cases with early-onset atrial fibrillation were selected from the Penn Biobank based on an age of atrial fibrillation onset prior to 61 years of age, and in the absence of a myocardial infarction, heart failure or severe valvular disease. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs001601.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001602.v1.p1.c1 /programs/topmed/projects/ChildrensHS_GAP_GRU ChildrensHS_GAP_GRU phs001602.v1.p1.c1 c1 GRU p1 phs001602 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001602.v1.p1 v1 NHLBI TOPMed: Children's Health Study (CHS) Integrative Genetic Approaches to Gene-Air Pollution Interactions in Asthma (GAP) ChildrensHS_GAP_GRU topmed-ChildrensHS_GAP_GRU Yes ChildrensHS_GAP "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Integrative Genetic Approaches to Gene-Air Pollution Interactions in Asthma (GAP) study was proposed to use an innovative genetics approach in mice and humans to identify novel variants that interact with traffic-related pollutant exposures to affect lung function phenotypes and the risk of childhood asthma. The study participants were enrolled from the original southern California Children's Health Study (CHS). In the TOPMed project, seven Hispanic White participants who did not have asthma history were included in the WGS analysis. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001602.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001602.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001603.v1.p1.c1 /programs/topmed/projects/ChildrensHS_IGERA_GRU ChildrensHS_IGERA_GRU phs001603.v1.p1.c1 c1 GRU p1 phs001603 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001603.v1.p1 v1 NHLBI TOPMed: Children's Health Study (CHS) Integrative Genomics and Environmental Research of Asthma (IGERA) ChildrensHS_IGERA_GRU topmed-ChildrensHS_IGERA_GRU Yes ChildrensHS_IGERA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Integrative Genomics and Environmental Research of Asthma (IGERA) Study was proposed to collect immortalized cell lines, RNA, cDNA and DNA from 400 well-characterized subjects who participated in the southern California Children's Health Study (CHS) and to develop an accompanying database for these samples consisting of extensive phenotype, exposure, genome-wide genotype, gene expression, and methylation data. A subset of Hispanic-White participants (n=160) were included in the TOPMed project, including 77 asthma cases and 83 controls. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001603.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001603.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001604.v1.p1.c1 /programs/topmed/projects/ChildrensHS_MetaAir_GRU ChildrensHS_MetaAir_GRU phs001604.v1.p1.c1 c1 GRU p1 phs001604 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001604.v1.p1 v1 NHLBI TOPMed: Children's Health Study (CHS) Effects of Air Pollution on the Development of Obesity in Children (Meta-AIR) ChildrensHS_MetaAir_GRU topmed-ChildrensHS_MetaAir_GRU Yes ChildrensHS_MetaAir "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Effects of Air Pollution on the Development of Obesity in Children (Meta-AIR) study was proposed to study a subset of the Children's Health Study (CHS) participants representing the extremes of long-term traffic-related air pollution exposure occurring in Southern California CHS communities. The primary aim of the Meta-AIR study was to investigate whether lifetime exposure to air pollution increases risk for obesity and metabolic dysfunction at 17-18 years of age. A total of 56 Hispanic White participants (16 asthma cases and 40 controls) were included in the TOPMed project. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001604.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001604.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001605.v1.p1.c2 /programs/topmed/projects/CHIRAH_DS-ASTHMA-IRB-COL CHIRAH_DS-ASTHMA-IRB-COL phs001605.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001605 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001605.v1.p1 v1 NHLBI TOPMed: Chicago Initiative to Raise Asthma Health Equity (CHIRAH) CHIRAH_DS-ASTHMA-IRB-COL topmed-CHIRAH_DS-ASTHMA-IRB-COL Yes CHIRAH "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The CHIRAH project was a community based study of the factors associated with asthma morbidity in the African American population. CHIRAH evaluated the role of various variables (biologic / environmental, psychologic / behavioral, and socioeconomic) on asthma morbidity and the function of changes in these variables on asthma morbidity in a longitudinal fashion. This involved collection of a cohort based on school screening which was sampled to include similar numbers of underprivileged and non-underprivileged subjects which roughly equally represented self-classified African Americans and self-classified non-African Americans. Subjects were followed-up every 3 months of this cohort over the course of 2 years. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001605.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001605.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001606.v1.p1.c1 /programs/topmed/projects/EGCUT_GRU EGCUT_GRU phs001606.v1.p1.c1 c1 GRU p1 phs001606 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001606.v1.p1 v1 NHLBI TOPMed: Early-onset Atrial Fibrillation in the Estonian Biobank EGCUT_GRU topmed-EGCUT_GRU Yes EGCUT "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Estonian Biobank is the population-based biobank of the Estonian Genome Centre of University of Tartu. The biobank is conducted according to the Estonian Gene Research Act and all participants have signed broad informed consent. The cohort size is currently 51,535 people from 18 years of age and up. Study Weblinks: EGCUT Estonian BioBank Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001606.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001606.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001607.v2.p2.c1 /programs/topmed/projects/IPF_DS-ILD-IRB-NPU IPF_DS-ILD-IRB-NPU phs001607.v2.p2.c1 c1 DS-ILD-IRB-NPU p2 phs001607 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 v2 NHLBI TOPMed: Pulmonary Fibrosis Whole Genome Sequencing IPF_DS-ILD-IRB-NPU topmed-IPF_DS-ILD-IRB-NPU Yes IPF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a set of cases diagnosed with idiopathic pulmonary fibrosis, a fatal interstitial lung disease. These cases were included in the TOPMed phase three studies. The planned study will compare these cases to within-TOPMed controls for genome-wide association studies. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001607.v2.p2.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001607.v2.p2.c2 /programs/topmed/projects/IPF_DS-LD-IRB-NPU IPF_DS-LD-IRB-NPU phs001607.v2.p2.c2 c2 DS-LD-IRB-NPU p2 phs001607 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 v2 NHLBI TOPMed: Pulmonary Fibrosis Whole Genome Sequencing IPF_DS-LD-IRB-NPU topmed-IPF_DS-LD-IRB-NPU Yes IPF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a set of cases diagnosed with idiopathic pulmonary fibrosis, a fatal interstitial lung disease. These cases were included in the TOPMed phase three studies. The planned study will compare these cases to within-TOPMed controls for genome-wide association studies. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001607.v2.p2.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001607.v2.p2.c3 /programs/topmed/projects/IPF_DS-PFIB-IRB-NPU IPF_DS-PFIB-IRB-NPU phs001607.v2.p2.c3 c3 DS-PFIB-IRB-NPU p2 phs001607 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 v2 NHLBI TOPMed: Pulmonary Fibrosis Whole Genome Sequencing IPF_DS-PFIB-IRB-NPU topmed-IPF_DS-PFIB-IRB-NPU Yes IPF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a set of cases diagnosed with idiopathic pulmonary fibrosis, a fatal interstitial lung disease. These cases were included in the TOPMed phase three studies. The planned study will compare these cases to within-TOPMed controls for genome-wide association studies. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001607.v2.p2.c3 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001607.v2.p2.c4 /programs/topmed/projects/IPF_DS-PUL-ILD-IRB-NPU IPF_DS-PUL-ILD-IRB-NPU phs001607.v2.p2.c4 c4 DS-PUL-ILD-IRB-NPU p2 phs001607 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 v2 NHLBI TOPMed: Pulmonary Fibrosis Whole Genome Sequencing IPF_DS-PUL-ILD-IRB-NPU topmed-IPF_DS-PUL-ILD-IRB-NPU Yes IPF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a set of cases diagnosed with idiopathic pulmonary fibrosis, a fatal interstitial lung disease. These cases were included in the TOPMed phase three studies. The planned study will compare these cases to within-TOPMed controls for genome-wide association studies. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001607.v2.p2.c4 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001607.v2.p2.c5 /programs/topmed/projects/IPF_HMB-IRB-NPU IPF_HMB-IRB-NPU phs001607.v2.p2.c5 c5 HMB-IRB-NPU p2 phs001607 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 v2 NHLBI TOPMed: Pulmonary Fibrosis Whole Genome Sequencing IPF_HMB-IRB-NPU topmed-IPF_HMB-IRB-NPU Yes IPF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. This is a set of cases diagnosed with idiopathic pulmonary fibrosis, a fatal interstitial lung disease. These cases were included in the TOPMed phase three studies. The planned study will compare these cases to within-TOPMed controls for genome-wide association studies. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001607.v2.p2 on 2021-03-25 and may not include exact formatting or images." phs001607.v2.p2.c5 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001608.v1.p1.c1 /programs/topmed/projects/OMG_SCD_DS-SCD-IRB-PUB-COL-MDS-RD OMG_SCD_DS-SCD-IRB-PUB-COL-MDS-RD phs001608.v1.p1.c1 c1 DS-SCD-IRB-PUB-COL-MDS-RD p1 phs001608 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001608.v1.p1 v1 NHLBI TOPMed: Outcome Modifying Genes in Sickle Cell Disease (OMG) OMG_SCD_DS-SCD-IRB-PUB-COL-MDS-RD topmed-OMG_SCD_DS-SCD-IRB-PUB-COL-MDS-RD Yes OMG_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Sickle cell disease (SCD) is caused by homozygosity for a single mutation of the beta hemoglobin gene. Despite the constancy of this genetic abnormality, the clinical course of patients with SCD is remarkably variable. SCD can affect the function and cause the failure of multiple organ systems through the pathophysiologic processes of vaso-occlusion and hemolysis. These pathophysiological processes are complex and expected to impact multiple organ systems in a variety of ways. This study, therefore, was designed to identify genetic factors that predispose SCD patients to develop specific end-organ complications and to experience more or less severe clinical courses. We enrolled > 700 patients with Hb SS, Hb S-beta0 thalassemia and HbSC being followed primarily at three southeastern U.S. regional institutions (Duke University Medical Center, University of North Carolina Medical Center, and Emory University Medical Center). Medical information obtained included the presence or absence of specific targeted outcomes (overall disease severity as well as specific types of end organ damage). Clinical data include medical status (history, physical, examination, and laboratory results) and information regarding potentially confounding environmental factors. Limited plasma samples are available for correlative studies (e.g. of cytokine levels, coagulation activation). Targeted SNP for candidate gene analysis as well as GWAS has been performed on most samples. Whole genome sequencing has been conducted through the TOPMed Consortium. The subjects in this analysis were collected as part of a larger study, ""Outcome Modifying Genes in Sickle Cell Disease"" (OMG-SCD) aimed at identifying genetic modifiers for sickle cell disease. More information about the study can be found in Elmariah et al. (2014), PMID: 24478166. Clinical and genetic data have been used to identify genetic characteristics predisposing patients with SCD to a more or less severe overall clinical course as well as to individual organ-specific complications. It is anticipated that identification of such genetic factors will reveal new therapeutic targets individualized to specific complications of SCD, leading to improved outcomes and increased life expectancy for patients with SCD. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001608.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001608.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001612.v1.p1.c1 /programs/topmed/projects/CARDIA_HMB-IRB CARDIA_HMB-IRB phs001612.v1.p1.c1 c1 HMB-IRB p1 phs001612 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001612.v1.p1 v1 NHLBI TOPMed: Coronary Artery Risk Development in Young Adults (CARDIA) CARDIA_HMB-IRB topmed-CARDIA_HMB-IRB Yes CARDIA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. CARDIA is a study examining the etiology and natural history of cardiovascular disease beginning in young adulthood. In 1985-1986, a cohort of 5115 healthy black and white men and women, aged 18-30 years, were selected to have approximately the same number of people in subgroups of age (18-24 and 25-30), sex, race, and education (high school or less, and more than high school) within each of four US Field Centers. These same participants were asked to participate in follow-up examinations during 1987-1988 (Year 2), 1990-1991 (Year 5), 1992-1993 (Year 7), 1995-1996 (Year 10), 2000-2001 (Year 15), 2005-2006 (Year 20), 2010-2011 (Year 25) and 2015-2016 (Year 30). In addition to the follow-up examinations, participants are contacted regularly for the ascertainment of information on out-patient procedures and hospitalizations experienced between contacts. Within the past five years, 95% of the original surviving cohort has been contacted. While the specifics of each examination have differed somewhat, data have been collected on a variety of factors believed to be related to heart disease. These include conditions with clear links to heart disease, such as blood pressure, cholesterol and other lipids. Data have also been collected on physical measurements, such as weight and skinfold fat, as well as lifestyle factors such as substance use (tobacco and alcohol), dietary and exercise patterns, behavioral and psychological variables, medical and family history, and other chemistries (e.g., insulin and glucose). In addition, subclinical atherosclerosis was measured via echocardiography during Years 5, 10, and 25, computed tomography during Years 15 and 20, and carotid ultrasound during Year 20. Study Weblinks: CARDIA: Coronary Artery Risk Development in Young Adults Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001612.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001612.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001612.v1.p1.c2 /programs/topmed/projects/CARDIA_HMB-IRB-NPU CARDIA_HMB-IRB-NPU phs001612.v1.p1.c2 c2 HMB-IRB-NPU p1 phs001612 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001612.v1.p1 v1 NHLBI TOPMed: Coronary Artery Risk Development in Young Adults (CARDIA) CARDIA_HMB-IRB-NPU topmed-CARDIA_HMB-IRB-NPU Yes CARDIA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. CARDIA is a study examining the etiology and natural history of cardiovascular disease beginning in young adulthood. In 1985-1986, a cohort of 5115 healthy black and white men and women, aged 18-30 years, were selected to have approximately the same number of people in subgroups of age (18-24 and 25-30), sex, race, and education (high school or less, and more than high school) within each of four US Field Centers. These same participants were asked to participate in follow-up examinations during 1987-1988 (Year 2), 1990-1991 (Year 5), 1992-1993 (Year 7), 1995-1996 (Year 10), 2000-2001 (Year 15), 2005-2006 (Year 20), 2010-2011 (Year 25) and 2015-2016 (Year 30). In addition to the follow-up examinations, participants are contacted regularly for the ascertainment of information on out-patient procedures and hospitalizations experienced between contacts. Within the past five years, 95% of the original surviving cohort has been contacted. While the specifics of each examination have differed somewhat, data have been collected on a variety of factors believed to be related to heart disease. These include conditions with clear links to heart disease, such as blood pressure, cholesterol and other lipids. Data have also been collected on physical measurements, such as weight and skinfold fat, as well as lifestyle factors such as substance use (tobacco and alcohol), dietary and exercise patterns, behavioral and psychological variables, medical and family history, and other chemistries (e.g., insulin and glucose). In addition, subclinical atherosclerosis was measured via echocardiography during Years 5, 10, and 25, computed tomography during Years 15 and 20, and carotid ultrasound during Year 20. Study Weblinks: CARDIA: Coronary Artery Risk Development in Young Adults Study Design: Prospective Longitudinal Cohort Study Type: Longitudinal dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001612.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001612.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001624.v1.p1.c1 /programs/topmed/projects/BioVU_AF_HMB-GSO BioVU_AF_HMB-GSO phs001624.v1.p1.c1 c1 HMB-GSO p1 phs001624 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001624.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: The Vanderbilt University BioVU Atrial Fibrillation Genetics Study BioVU_AF_HMB-GSO topmed-BioVU_AF_HMB-GSO Yes BioVU_AF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Atrial fibrillation (also called AFib or AF) is a quivering or irregular heartbeat (arrhythmia) that can lead to blood clots, stroke, heart failure and other heart-related complications. At least 2.7 million Americans are living with AFib. Individuals with early onset atrial fibrillation (AF) are included in this study of cases from the BioVU sample repository. BioVU is Vanderbilt's biobank of DNA extracted from leftover and otherwise discarded clinical blood specimens. BioVU operates as a consented biorepository; all individuals must sign the BioVU consent form in order to donate future specimens. BioVU subjects are de-identified and linked to the Synthetic Derivative enabling researchers to access genetic data/DNA material as well as dense, longitudinal electronic medical record (EMR) information. Study Design: Case Set Study Type: Case Set dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001624.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001624.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001644.v1.p1.c1 /programs/topmed/projects/BioMe_HMB-NPU BioMe_HMB-NPU phs001644.v1.p1.c1 c1 HMB-NPU p1 phs001644 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001644.v1.p1 v1 NHLBI TOPMed - NHGRI CCDG: The BioMe Biobank at Mount Sinai BioMe_HMB-NPU topmed-BioMe_HMB-NPU Yes BioMe "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The IPM BioMe Biobank, founded in September 2007, is an ongoing, broadly-consented electronic health record (EHR)-linked clinical care biobank that enrolls participants non-selectively from the Mount Sinai Medical Center patient population. BioMe currently comprises >42,000 participants from diverse ancestries, characterized by a broad spectrum of longitudinal biomedical traits. Participants enroll through an opt-in process and consent to be followed throughout their clinical care (past, present, and future) in real-time, allowing us to integrate their genomic information with their EHRs for discovery research and clinical care implementation. BioMe participants consent for recall, based on their genotype and/or phenotype, permitting in-depth follow-up and functional studies for selected participants at any time. Phenotypic and genomic data are stored in a secure database and made available to investigators, contingent on approval by the BioMe Governing Board. BioMe uses a ""data-broker"" system to protect confidentiality. Ancestral diversity - BioMe participants represent a broad racial, ethnic and socioeconomic diversity with a distinct and population-specific disease burden. Specifically, BioMe participants are of African (AA), Hispanic/Latino (HL), European (EA) and other/mixed ancestry (Table 1, Figure 1). BioMe participants are predominantly of African (AA, 24%), Hispanic/Latino (HL, 35%), European (EA, 32%), and other ancestry (OA, 10%) (Table 1, Figure 1). Participants who self-identify as Hispanic/Latino further report to be of Puerto Rican (39%), Dominican (23%), Central/South American (17%), Mexican (5%) or other Hispanic (16%) ancestry. More than 40% of European ancestry participants are genetically determined to be of Ashkenazi Jewish ancestry. With this broad ancestral diversity, BioMe is uniquely positioned to examine the impact of demographic and evolutionary forces that have shaped common disease risk. Phenotypes available in BioMe - BioMe has available a high-quality and validated set of fully implemented clinical phenotype data that has been culled by a multi-disciplinary team of experienced investigators, clinicians, information technologists, data-managers, and programmers who apply advanced medical informatics and data mining tools to extract and harmonize EHRs. BioMe, as a cohort, offers great versatility for designing nested case-control sample-sets, particularly for studying longitudinal traits and co-morbidity in disease burden. ** Biomedical and clinical outcomes: The BioMe Biobank is linked to Mount Sinai's system-wide Epic EHR, which captures a full spectrum of biomedical phenotypes, including clinical outcomes, covariate and exposure data from past, present and future health care encounters. As such, the BioMe Biobank has a longitudinal design as participants consent to make all of their EHR data from past (dating back as far as 2003), present and future inpatient or outpatient encounters available for research, without restriction. The median number of outpatient encounters is 21 per participant, reflecting predominant enrollment of participants with common chronic conditions from primary care facilities. ** Environmental data: The clinical and EHR information is complemented by detailed demographic and lifestyle information, including ancestry, residence history, country of origin, personal and familial medical history, education, socio-economic status, physical activity, smoking, dietary habits, alcohol intake, and body weight history, which is collected in a systematic manner by interview-based questionnaire at time of enrollment. The IPM BioMe Biobank contributed ~10,600 DNA samples for whole genome sequencing to the TOPMed program. Samples were selected for the Coronary Artery Disease (CAD) and the Chronic Obstructive Pulmonary Disease (COPD) working groups. Using a Case-Definition-Algorithm (CDA), we identified ~4,100 individuals with CAD (~50% women) and ~3,000 individuals as controls (65% women). In addition, we identified ~800 individual with COPD (62% women) and 1800 as controls (72% women). Another 600 BioMe participants with Atrial Fibrillation, all of African ancestry, were included. Study Weblinks: The Charles Bronfman Institute for Personalized Medicine Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001644.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001644.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001661.v2.p1.c1 /programs/topmed/projects/GCPD-A_DS-ASTHMA-GSO GCPD-A_DS-ASTHMA-GSO phs001661.v2.p1.c1 c1 DS-ASTHMA-GSO p1 phs001661 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001661.v2.p1 v2 NHLBI TOPMed: Genetic Causes of Complex Pediatric Disorders - Asthma (GCPD-A) GCPD-A_DS-ASTHMA-GSO topmed-GCPD-A_DS-ASTHMA-GSO Yes GCPD-A "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Center for Applied Genomics (CAG) at the Children's Hospital of Philadelphia (CHOP) is focused on addressing the roles of both single nucleotide variants and structural copy number variants, and their functional impact, together with gene-environment interactions and their influence on asthma drug response. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001661.v2.p1 on 2021-03-25 and may not include exact formatting or images." phs001661.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001662.v1.p1.c2 /programs/topmed/projects/LTRC_HMB-MDS LTRC_HMB-MDS phs001662.v1.p1.c2 c2 HMB-MDS p1 phs001662 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001662.v1.p1 v1 NHLBI TOPMed: Lung Tissue Research Consortium (LTRC) LTRC_HMB-MDS topmed-LTRC_HMB-MDS Yes LTRC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Chronic obstructive pulmonary disease (COPD), a disease state characterized by airflow limitation that is not fully reversible, is the third leading cause of death in the U.S. COPD is a heterogeneous syndrome, with affected individuals demonstrating marked differences in lung structure (emphysema vs. airway disease); physiology (airflow obstruction); and other clinical features (e.g., exacerbations, co-morbid illnesses). Multiple genomic regions influencing COPD susceptibility have been identified by genome-wide association studies (GWAS), and rare coding variants can also influence risk for COPD. However, only a small percentage of the estimated heritability for COPD risk can be explained by known genetic loci. Like most complex diseases, COPD is influenced by multiple genetic determinants (each with modest individual effects). Emerging evidence supports the paradigm that complex disease genetic determinants are part of a network of interacting genes and proteins; perturbations of this network can increase disease risk. To identify this network, multiple Omics data will need to be analyzed with methods to account for nonlinear relationships and interactions between key genes and proteins. Our overall hypothesis is that integrated network analysis of genetic, transcriptomic, proteomic, and epigenetic data from biospecimens ranging from lung tissue to nasal epithelial cells to blood in highly phenotyped subjects will provide insights into COPD pathogenesis and heterogeneity. We will leverage the well-phenotyped, NHLBI-funded Lung Tissue Research Consortium (LTRC) to address these questions. We will perform multi-omics analysis in 1548 lung tissue and blood samples from the LTRC. With these multi-omics data, we will utilize a systems biology approach to understand relationships between multiple genetic determinants and multiple types of Omics data. We will begin by performing single Omics analyses in COPD vs. control lung, nasal, and blood samples. Next, we will integrate single Omics data with genetic variants identified by WGS to assist in fine mapping genetic determinants of COPD. We will then perform integrated network analysis of COPD with genetic and multiple Omics data using correlation-based, gene regulatory, and Bayesian networks. Subjects were recruited from Mayo Clinic, Universities of Colorado, Michigan, and Pittsburg, and Temple University. Study Weblinks: LTRC Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001662.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001662.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001682.v1.p1.c1 /programs/topmed/projects/PUSH_SCD_DS-SCD-IRB-PUB-COL PUSH_SCD_DS-SCD-IRB-PUB-COL phs001682.v1.p1.c1 c1 DS-SCD-IRB-PUB-COL p1 phs001682 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001682.v1.p1 v1 NHLBI TOPMed: Pulmonary Hypertension and the Hypoxic Response in SCD (PUSH) PUSH_SCD_DS-SCD-IRB-PUB-COL topmed-PUSH_SCD_DS-SCD-IRB-PUB-COL Yes PUSH_SCD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. During Visit One, the PUSH Study will perform echocardiography on 600 children and adolescent with patients with SCD and 100 control children and adolescents at three Field Centers, namely Howard University, Children's National Medical Center and University of Michigan. Patients or their parents will be approached and asked to give informed consent. If they appear to have difficulty reading, reading of the consent will be offered. Patients or their parents not appearing to comprehend the consent will not be eligible. As a part of this visit, each participant or parent will sign informed consent, complete a Participant Contact Information Form, complete a Medical History Form, undergo physical examination with completion of a Physical Examination Form and have blood drawn. Each participant must have echocardiography performed with measurement of Tricuspid Regurgitant Jet Velocity (TRV). In addition attempts will be made 1) to perform a six-minute walk test, 2) to collect information from a recent (within six months) Transcranial Doppler Study (TCD) or to perform TCD, and 3) to perform pulmonary function tests. Study personnel will review all forms for completeness and conduct phlebotomy. Blood will be shipped to the Central Lab. Results of all procedures and tests will be transmitted to the Data Manager at Howard University. Sequencing was only done on sickle cell participants. Study Design: Case-Control Study Type: Case-Control dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001682.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001682.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001725.v1.p1.c1 /programs/topmed/projects/GGAF_GRU GGAF_GRU phs001725.v1.p1.c1 c1 GRU p1 phs001725 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001725.v1.p1 v1 NHLBI TOPMed CCDG: Groningen Genetics of Atrial Fibrillation (GGAF) Study GGAF_GRU topmed-GGAF_GRU Yes GGAF "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Atrial fibrillation (also called AFib or AF) is a quivering or irregular heartbeat (arrhythmia) that can lead to blood clots, stroke, heart failure and other heart-related complications. The Groningen Genetics of Atrial Fibrillation (GGAF) cohort is a cohort composed from 5 different sources of individuals with atrial fibrillation (AF) and age and sex-matched controls. Written informed consent was provided from all participating individuals, and all 5 studies were approved by the ethical committee at the University Medical Center (www.atrialfibrillationresearch.nl) and Maastricht University. All samples selected for TOPMed WGS are from individuals with atrial fibrillation. Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001725.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001725.v1.p1.c1 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001726.v1.p1.c1 /programs/topmed/projects/CAMP_DS-AST-COPD CAMP_DS-AST-COPD phs001726.v1.p1.c1 c1 DS-AST-COPD p1 phs001726 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001726.v1.p1 v1 NHLBI TOPMed: Childhood Asthma Management Program (CAMP) CAMP_DS-AST-COPD topmed-CAMP_DS-AST-COPD Yes CAMP "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. The Childhood Asthma Management Program (CAMP) was designed to evaluate whether continuous, long-term treatment (over a period of four to six years) with either an inhaled corticosteroid (budesonide) or an inhaled noncorticosteroid drug (nedocromil) safely produces an improvement in lung growth as compared with treatment for symptoms only (with albuterol and, if necessary, prednisone, administered as needed). The primary outcome in the study was lung growth, as assessed by the change in forced expiratory volume in one second (FEV1, expressed as a percentage of the predicted value) after the administration of a bronchodilator. Secondary outcomes included the degree of airway responsiveness, morbidity, physical growth, and psychological development. Study Design: Family/Twin/Trios Study Type: Parent-Offspring Trios dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001726.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001726.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001727.v1.p1.c2 /programs/topmed/projects/PIMA_DS-ASTHMA-IRB-COL PIMA_DS-ASTHMA-IRB-COL phs001727.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001727 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001727.v1.p1 v1 NHLBI TOPMed: Pathways to Immunologically Mediated Asthma (PIMA) PIMA_DS-ASTHMA-IRB-COL topmed-PIMA_DS-ASTHMA-IRB-COL Yes PIMA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Study designed to further our understanding of the pathogenesis of asthma exacerbations in children. Children enrolled in the study (n=217) were all asthmatic and primarily Hispanic white. The children were followed for 18 months until they experienced an asthma exacerbation or completed the follow-up without an exacerbation. The time to the first asthma exacerbation was considered the outcome. The acute and convalescent immune phenotype of each asthma exacerbation was documented. Study Weblinks: PIMA Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001727.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001727.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001728.v1.p1.c2 /programs/topmed/projects/CARE_BADGER_DS-ASTHMA-IRB-COL CARE_BADGER_DS-ASTHMA-IRB-COL phs001728.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001728 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001728.v1.p1 v1 NHLBI TOPMed: Best ADd-on Therapy Giving Effective Response (BADGER) CARE_BADGER_DS-ASTHMA-IRB-COL topmed-CARE_BADGER_DS-ASTHMA-IRB-COL Yes CARE_BADGER "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. BADGER is a 56-week randomized, double-blind, three-treatment, three-period cross-over trial that will evaluate the differential improvement in control that is achieved following three separate treatment interventions in children whose asthma is not acceptably controlled on a low dose of ICS (per NAEPP guidelines). All participants will enter an 8-week run-in period during which time they will receive a dose of 1x ICS (fluticasone 200 μg/day). During this 8-week time period, running 2-week averages to establish the lack of acceptable asthma control will be calculated. Thus, a child could qualify for randomization at any time during this 8-week run-in period. This approach should maximize both patient safety and successful enrollment. Children will continue to receive 1x ICS during the entire treatment phase. During each period of the treatment phase, they also will receive one add-on therapy in the form of LABA, LTRA or additional 1x ICS. The order of the add-on therapy assignment will be determined by randomization into one of six treatment sequences (order determined randomly). Each treatment period will be 16 weeks in length; the initial 4 weeks of each period will be considered to be the washout period for the previous treatment. The primary outcome measures will be frequency of asthma exacerbations, asthma control days, and FEV1. Study Weblinks: BADGER Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001728.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001728.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001729.v1.p1.c2 /programs/topmed/projects/CARE_CLIC_DS-ASTHMA-IRB-COL CARE_CLIC_DS-ASTHMA-IRB-COL phs001729.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001729 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001729.v1.p1 v1 NHLBI TOPMed: Characterizing the Response to a Leukotriene Receptor Antagonist and an Inhaled Corticosteroid (CLIC) CARE_CLIC_DS-ASTHMA-IRB-COL topmed-CARE_CLIC_DS-ASTHMA-IRB-COL Yes CARE_CLIC "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. Within-subject clinical responses to either inhaled corticosteroids or Montelukast were compared in 126 children with mild to moderate asthma. Study Weblinks: CLIC Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001729.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001729.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001730.v1.p1.c2 /programs/topmed/projects/CARE_PACT_DS-ASTHMA-IRB-COL CARE_PACT_DS-ASTHMA-IRB-COL phs001730.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001730 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001730.v1.p1 v1 NHLBI TOPMed: Pediatric Asthma Controller Trial (PACT) CARE_PACT_DS-ASTHMA-IRB-COL topmed-CARE_PACT_DS-ASTHMA-IRB-COL Yes CARE_PACT "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. After a 2-4 week assessment/characterization run-in period, 6-14 year-old children who met NAEPP criteria for mild-moderate persistent asthma specifically based on symptom criteria and methacholine PC20 ≤ 12.5 mg/ml and FEV1 ≥ 80% were randomized to one of the three active treatment arms for 12 months. Randomization was stratified according to clinical center, bronchodilator response (< 12% or ≥ 12%), race (Caucasian or non-Caucasian), and methacholine PC20 (< 2 or ≥ 2 mg/ml). The primary outcome variable was the proportion of asthma-free days during the 12-month treatment period. Secondary outcomes included other measures of asthma control (percentage of rescue-free days, albuterol-free days, and episode-free days; the number of asthma exacerbations requiring prednisone therapy and the time to the first asthma exacerbation), forced oscillation and spirometry, reversibility (FEV1 pre- and post 2 puffs of albuterol MDI), methacholine PC20, exhaled nitric oxide, and asthma-related quality of life. Study Weblinks: PACT Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001730.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001730.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001732.v1.p1.c2 /programs/topmed/projects/CARE_TREXA_DS-ASTHMA-IRB-COL CARE_TREXA_DS-ASTHMA-IRB-COL phs001732.v1.p1.c2 c2 DS-ASTHMA-IRB-COL p1 phs001732 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001732.v1.p1 v1 NHLBI TOPMed: TReating Children to Prevent EXacerbations of Asthma (TREXA) CARE_TREXA_DS-ASTHMA-IRB-COL topmed-CARE_TREXA_DS-ASTHMA-IRB-COL Yes CARE_TREXA "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 5b (GRCh38) and Freeze 8 (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 5b, Phases 1 and 2"" and ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession. TREXA is a 44-week randomized, double-blind, double-masked, four-treatment, parallel trial that will evaluate the weaning strategy that provides the best protection against the development of exacerbations in children whose asthma is acceptably controlled on a low dose of ICS (per NAEPP guidelines). Following the 4 weeks of the run-in period on a 1x dose of ICS (100 µg fluticasone b.i.d. or its equivalent), children who do not meet the definition of acceptable asthma control will be randomized to the parallel BADGER protocol; those who meet the definition of acceptable asthma control will be enrolled into the 44-week treatment phase of the study. The primary outcome measure will be time to first exacerbation requiring a prednisone course. Study Weblinks: TREXA Study Design: Prospective Longitudinal Cohort Study Type: Cohort dbGaP estimated ancestry using GRAF-pop Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001732.v1.p1 on 2021-03-25 and may not include exact formatting or images." phs001732.v1.p1.c2 Program: TOPMed Data Type: Genotype Data Type: Clinical Phenotype Study Registration: dbGaP +phs001735.v2.p1.c1 /programs/topmed/projects/PCGC_CHD_HMB PCGC_CHD_HMB phs001735.v2.p1.c1 c1 HMB p1 phs001735 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001735.v2.p1 v2 NHLBI TOPMed: Pediatric Cardiac Genomics Consortium (PCGC)'s Congenital Heart Disease Biobank PCGC_CHD_HMB topmed-PCGC_CHD_HMB Yes PCGC_CHD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.The Pediatric Cardiovascular Genetics Consortium (PCGC) proposes to define genetic causes for congenital heart defects (CHD) as part of the TOPMed Program are the most common form of heart disease in childhood and are also the most prevalent form of birth defects, occurring in 2-3% of live births. The PCGC has recruited and clinically characterized = 10,000 CHD probands and parents (CHD trios). From whole exome sequencing (WES) of >2800 CHD trios, we identified a substantial enrichment of damaging de novo mutations in genes important for cardiogenesis, particularly implicating histone modifier enzyme gene defects. Analysis of whole genome sequencing (WGS) of 350 probands with CHD unexplained by WES and their parents preliminarily implicated de novo mutations in enhancers of genes previously shown to cause CHD in mouse knock out models. Sequencing of RNA (RNAseq) from discarded cardiac tissues from CHD probands has revealed likely causal allele-specific expression (ASE) as well as biallelic loss of expression (LOE). We have also discovered de novo epimutations, differentially methylated regions (DMRs), some with underlying de novo DNA variation, that are detectable in peripheral blood leukocytes and appear to underlie 10% of CHD. Of note, these assorted 'omic' approaches have enabled one another, both for attributing causality and assessing functional impact. Based on these extensive preliminary data, we hypothesize that PCGC probands with uninformative exomic analyses (WES-negative) harbor de novo genetic and/or epigenetic mutations in critical regulatory elements that participate in developmental expression of cardiac genes. To identify these etiologies, we propose analyses of WGS in 1000 WES-negative CHD trios, prioritizing those with probands with banked CHD tissues (n=78), one damaging variant in a recessive CHD gene, and older fathers (age>45). We also request WGS for 230 probands, for whom we have cardiac tissues but not parental DNAs. We request RNAseq for 308 cardiac tissues. For DNA methylation, which TOPMed will offer through the Illumina 850k array platform, we are requesting analysis of DNAs from peripheral blood leukocytes for all probands for whom WGS will be performed (1000 from trios, 230 singletons) as well as DNAs from cardiac tissues (n=308) to pair with the WGS, RNAseq and blood DNA methylation data. We will use existing resources and capabilities of the PCGC to confirm relevant mutations and those of its companion consortium in the Bench to Bassinet Program, the Cardiovascular Development Consortium, to inform analyses of non-coding mutations as well as to perform confirmatory functional genomics studies using cell and animal models. We expect that the studies resulting from data generated through TOPMed will provide novel insights into the molecular basis for CHD and fundamental knowledge about genes and pathways involved in cardiac development. Aside from being relevant to CHD, we anticipate that our findings will inform the understanding of later-onset cardiovascular diseases, including some arising in adulthood. Study Weblinks: From Bench to Bassinet: CHD Genes Study Design: Prospective Longitudinal Cohort Study Type:Case SetParent-Offspring Trios dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-07-13 and may not include exact formatting or images." phs001735.v2.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001735.v2.p1.c2 /programs/topmed/projects/PCGC_CHD_DS-CHD PCGC_CHD_DS-CHD phs001735.v2.p1.c2 c2 DS-CHD p1 phs001735 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001735.v2.p1 v2 NHLBI TOPMed: Pediatric Cardiac Genomics Consortium (PCGC)'s Congenital Heart Disease Biobank PCGC_CHD_DS-CHD topmed-PCGC_CHD_DS-CHD Yes PCGC_CHD "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.The Pediatric Cardiovascular Genetics Consortium (PCGC) proposes to define genetic causes for congenital heart defects (CHD) as part of the TOPMed Program are the most common form of heart disease in childhood and are also the most prevalent form of birth defects, occurring in 2-3% of live births. The PCGC has recruited and clinically characterized = 10,000 CHD probands and parents (CHD trios). From whole exome sequencing (WES) of >2800 CHD trios, we identified a substantial enrichment of damaging de novo mutations in genes important for cardiogenesis, particularly implicating histone modifier enzyme gene defects. Analysis of whole genome sequencing (WGS) of 350 probands with CHD unexplained by WES and their parents preliminarily implicated de novo mutations in enhancers of genes previously shown to cause CHD in mouse knock out models. Sequencing of RNA (RNAseq) from discarded cardiac tissues from CHD probands has revealed likely causal allele-specific expression (ASE) as well as biallelic loss of expression (LOE). We have also discovered de novo epimutations, differentially methylated regions (DMRs), some with underlying de novo DNA variation, that are detectable in peripheral blood leukocytes and appear to underlie 10% of CHD. Of note, these assorted 'omic' approaches have enabled one another, both for attributing causality and assessing functional impact. Based on these extensive preliminary data, we hypothesize that PCGC probands with uninformative exomic analyses (WES-negative) harbor de novo genetic and/or epigenetic mutations in critical regulatory elements that participate in developmental expression of cardiac genes. To identify these etiologies, we propose analyses of WGS in 1000 WES-negative CHD trios, prioritizing those with probands with banked CHD tissues (n=78), one damaging variant in a recessive CHD gene, and older fathers (age>45). We also request WGS for 230 probands, for whom we have cardiac tissues but not parental DNAs. We request RNAseq for 308 cardiac tissues. For DNA methylation, which TOPMed will offer through the Illumina 850k array platform, we are requesting analysis of DNAs from peripheral blood leukocytes for all probands for whom WGS will be performed (1000 from trios, 230 singletons) as well as DNAs from cardiac tissues (n=308) to pair with the WGS, RNAseq and blood DNA methylation data. We will use existing resources and capabilities of the PCGC to confirm relevant mutations and those of its companion consortium in the Bench to Bassinet Program, the Cardiovascular Development Consortium, to inform analyses of non-coding mutations as well as to perform confirmatory functional genomics studies using cell and animal models. We expect that the studies resulting from data generated through TOPMed will provide novel insights into the molecular basis for CHD and fundamental knowledge about genes and pathways involved in cardiac development. Aside from being relevant to CHD, we anticipate that our findings will inform the understanding of later-onset cardiovascular diseases, including some arising in adulthood. Study Weblinks: From Bench to Bassinet: CHD Genes Study Design: Prospective Longitudinal Cohort Study Type:Case SetParent-Offspring Trios dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-07-13 and may not include exact formatting or images." phs001735.v2.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001843.v1.p2.c1 /programs/PCGC/projects/CMG_WGS_HMB CMG_WGS_HMB phs001843.v1.p2.c1 c1 HMB p2 phs001843 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001843.v1.p2 v1 Pediatric Cardiac Genomics Consortium (PCGC) Study - Centers for Mendelian Genomics Collaboration CMG_WGS_HMB PCGC-CMG_WGS_HMB Yes CMG_WGS_HMB This substudy phs001843 PCGC Study - CMG Collaboration contains whole genome sequences. Summary level phenotypes for the PCGC Cohort study participants can be viewed at the top-level study page phs001194 PCGC Cohort. Individual level phenotype data and molecular data for all PCGC top-level study and substudies are available by requesting Authorized Access to the PCGC Cohort study phs001194. Mendelian cardiovascular disorders provide crucial insights into the genetic susceptibility to more common forms of cardiovascular disease. While Mendelian cardiovascular disorders are individually rare, collectively they impose a significant public health burden. This proposal focuses on 2 specific categories of cardiovascular disease for which we have extensive research expertise and existing cohorts, congenital heart disease (CHD) and inherited arrhythmia syndromes. The tremendous burden on the health care system and on families with these Mendelian cardiovascular disorders underscore the urgency to understand their genomic bases, in order to design improved strategies for risk stratification, surveillance and medical intervention. Emerging evidence supports the use of whole-genome sequencing (WGS) over whole-exome sequencing (WES) for detecting coding variants in discovery projects, in addition to the obvious advantages of detecting features invisible to WES: structural variants (SV) and non-coding variants. We believe the way forward lies in widening the scope for discovery to include the patient's entire genome - and all types of variants. While family-based studies are crucial for genomic discovery, obtaining a sufficient number of high-risk pedigrees to achieve meaningful conclusions remains a challenge for most research institutions. For this proposal, we will leverage 2 powerful resources for the identification, ascertainment and recruitment of high-risk cardiovascular disease pedigrees: (1) the NHLBI-sponsored Pediatric Cardiac Genomics Consortium (PCGC) and (2) the Utah Population Database (UPDB). We propose to perform WGS on PCGC and UPDB cohorts with autosomal dominant disease to achieve the following Specific Aims: Aim 1) Identify the genomic basis for CHD in high-risk pedigrees derived from the PCGC and UPDB; and Aim 2) Identify the genomic basis for inherited arrhythmia disorders, using extended pedigrees derived from the UPDB. Aim 2 focuses on familial forms of AF, undiagnosed Long QT Syndrome, Wolff-Parkinson White syndrome and progressive conduction disorders. A WGS approach in high-risk pedigrees coupled with our validated bioinformatics pipeline, will allow the identification and prioritization of disease-causing SVs and sequence variants in coding and non-coding regulatory elements. These variants will be functionally characterized and validated in downstream experiments (heterologous expression systems, zebrafish cardiac assays, induced pluripotent stem cell-derived cardiomyocytes) that are beyond the scope of this X01. For this proposal, we have assembled the right combination of clinical expertise, resources for patient recruitment and computational know-how to enable these game-changing methodologies and to apply them to the challenge of cardiovascular Mendelian disease-gene discovery. Study Weblinks: Bench to Bassinet Program Study Design: Family/Twin/Trios Study Type:FamilyCohortNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images. phs001843.v1.p2.c1 Data Type: Clinical Phenotype Study Registration: dbGaP +phs001927.v1.p1.c1 /programs/topmed/projects/SPIROMICS_DS-COPD-NPU SPIROMICS_DS-COPD-NPU phs001927.v1.p1.c1 c1 DS-COPD-NPU p1 phs001927 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001927.v1.p1 v1 NHLBI TOPMed: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) SPIROMICS_DS-COPD-NPU topmed-SPIROMICS_DS-COPD-NPU Yes SPIROMICS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.Subpopulations and Intermediate Outcome Measures in COPD Study Description Subpopulations and intermediate outcome measures in COPD study (SPIROMICS) supports the prospective collection and analysis of phenotypic, biomarker, genetic, genomic, and clinical data from subjects with COPD for the purpose of identifying subpopulations and intermediate outcome measures. It is funded by the National Heart, Lung, and Blood Institute and is coordinated by the University of North Carolina at Chapel Hill. Molecular fingerprinting and extensive subject phenotyping will be performed to identify disease subpopulations and to identify and validate surrogate markers of disease severity, which will be useful as intermediate outcome measures for future clinical trials. Secondary aims are to clarify the natural history of COPD, to develop bioinformatic resources that will enable the utilization and sharing of data in studies of COPD and related diseases, and to create a collection of clinical, biomarker, radiographic, and genetic data that can be used by external investigators for other studies of COPD. Participating Institutions: Research participants for SPIROMICS will be enrolled, phenotyped, and followed at twelve SPIROMICS Clinical Centers: Columbia University, Temple University, Johns Hopkins University, Wake Forest University, University of Michigan, University of Illinois at Chicago, University of Iowa, University of Utah, National Jewish Health, University of California at San Francisco, and University of California at Los Angeles. The University of North Carolina at Chapel Hill serves as the Genomics and Informatics Center. The Radiology Reading Center is based at the University of Iowa. The PFT Reading Center is based at the University of California at Los Angeles. Study Design: SPIROMICS is a prospective cohort study that enrolled approximately 2,981 participants at twelve clinical centers over five years. Participants are distributed across four enrollment strata (i.e., Never-smokers, Smokers without COPD, Mild/Moderate COPD, and Severe COPD). Study Visits: Participants have up to four in-person visits (Baseline and Annual Clinic Visits at years 1, 2, 3 after Baseline). Study questionnaires and spirometry are completed at all main study visits. Blood and urine samples are collected at visits 1, 2, and 4. Sputum samples are collected at Visit 1. The CT scans are completed and Baseline and Visit 2. Participants also receive quarterly follow-up calls to assess health status and determine if an exacerbation has occurred. Substudies Bronchoscopy and Immunophenotyping Substudy The Bronchoscopy Substudy will enroll 50 subjects per site, for a total of 300 participants. These participants will be recruited across all four study strata. This substudy includes two study visits. During the first visit, sputum samples are collected for Immunophenotyping analysis at the Immunophenotyping Core Lab based at the University of Michigan. Participants then return for a second visit during which samples are collected via bronchoscopy, including bronchoalveolar lavage, epithelial brushings and bronchial biopsies. Immunophenotyping analysis is also conducted on BAL and blood collected during the bronchoscopy study visit. Repeatability Substudy The entire baseline clinic visit was repeated on 98 volunteers to determine reliability of measurement procedures. All baseline study-related procedures and questionnaires, including the CT scan, were re-administered and new samples of blood, urine, saliva, and sputum were collected. Field center staff processed these biospecimen samples according to the same protocol. Exacerbation Substudy The Exacerbation Substudy is a prospective, longitudinal observational study of up to 400 participants, which will allow the assessment of participant-driven health care utilization (HCU) events and symptom-defined exacerbation events over time. HCU-driven events are defined by change in medical treatment in response to a perceived COPD Exacerbation. Symptom-based events will be defined by using EXACT-PRO (EXacerbations of Chronic Pulmonary Disease Tool - Patient Reported Outcome), a daily symptom diary developed to measure the frequency, severity, and duration of exacerbations in clinical trials. All participants are provided with a PDA on which to complete the diary. Participants reporting a possible COPD exacerbation will be brought into the study clinic for a study visit to collect biological specimens and questionnaire data. The overall objectives of the Exacerbation Substudy are to: Obtain clinical data and specimens on SPIROMICS participants before and during an acute COPD exacerbation defined by Health care utilization triggered by the subject, or Symptomatic change (triggered by an EXACT defined threshold) Describe symptomatic changes occurring around HCU and symptom-defined (EXACT) events and their relationship to clinical and specimen data, Characterize the non-exacerbation ""stable"" state in COPD using the EXACT, including: Symptom variability (EXACT), Clinical data and specimen parameters during a stable state (baseline), The relationship between clinical and specimen data and symptom severity and variability. Explore the characteristics of stable patients, defined as those who do not experience HCU or symptom-defined (EXACT) events during the sub-study period, using baseline clinical data and specimens, and compare these characteristics with patients who experience HCU and/or symptom-defined events. Examine the relationship between HCU and symptom-defined exacerbation frequency during the first one-year period of follow-up for exacerbations and health outcomes, including 12-month change in lung function and COPD health status, and longer-term morbidity and mortality, with the latter derived from long-term data from the larger SPIROMICS study. Study Weblinks: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) Study Design: Prospective Longitudinal Cohort Study Type:Cohort dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-05-24 and may not include exact formatting or images." phs001927.v1.p1.c1 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001927.v1.p1.c2 /programs/topmed/projects/SPIROMICS_DS-COPD SPIROMICS_DS-COPD phs001927.v1.p1.c2 c2 DS-COPD p1 phs001927 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001927.v1.p1 v1 NHLBI TOPMed: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) SPIROMICS_DS-COPD topmed-SPIROMICS_DS-COPD Yes SPIROMICS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.Subpopulations and Intermediate Outcome Measures in COPD Study Description Subpopulations and intermediate outcome measures in COPD study (SPIROMICS) supports the prospective collection and analysis of phenotypic, biomarker, genetic, genomic, and clinical data from subjects with COPD for the purpose of identifying subpopulations and intermediate outcome measures. It is funded by the National Heart, Lung, and Blood Institute and is coordinated by the University of North Carolina at Chapel Hill. Molecular fingerprinting and extensive subject phenotyping will be performed to identify disease subpopulations and to identify and validate surrogate markers of disease severity, which will be useful as intermediate outcome measures for future clinical trials. Secondary aims are to clarify the natural history of COPD, to develop bioinformatic resources that will enable the utilization and sharing of data in studies of COPD and related diseases, and to create a collection of clinical, biomarker, radiographic, and genetic data that can be used by external investigators for other studies of COPD. Participating Institutions: Research participants for SPIROMICS will be enrolled, phenotyped, and followed at twelve SPIROMICS Clinical Centers: Columbia University, Temple University, Johns Hopkins University, Wake Forest University, University of Michigan, University of Illinois at Chicago, University of Iowa, University of Utah, National Jewish Health, University of California at San Francisco, and University of California at Los Angeles. The University of North Carolina at Chapel Hill serves as the Genomics and Informatics Center. The Radiology Reading Center is based at the University of Iowa. The PFT Reading Center is based at the University of California at Los Angeles. Study Design: SPIROMICS is a prospective cohort study that enrolled approximately 2,981 participants at twelve clinical centers over five years. Participants are distributed across four enrollment strata (i.e., Never-smokers, Smokers without COPD, Mild/Moderate COPD, and Severe COPD). Study Visits: Participants have up to four in-person visits (Baseline and Annual Clinic Visits at years 1, 2, 3 after Baseline). Study questionnaires and spirometry are completed at all main study visits. Blood and urine samples are collected at visits 1, 2, and 4. Sputum samples are collected at Visit 1. The CT scans are completed and Baseline and Visit 2. Participants also receive quarterly follow-up calls to assess health status and determine if an exacerbation has occurred. Substudies Bronchoscopy and Immunophenotyping Substudy The Bronchoscopy Substudy will enroll 50 subjects per site, for a total of 300 participants. These participants will be recruited across all four study strata. This substudy includes two study visits. During the first visit, sputum samples are collected for Immunophenotyping analysis at the Immunophenotyping Core Lab based at the University of Michigan. Participants then return for a second visit during which samples are collected via bronchoscopy, including bronchoalveolar lavage, epithelial brushings and bronchial biopsies. Immunophenotyping analysis is also conducted on BAL and blood collected during the bronchoscopy study visit. Repeatability Substudy The entire baseline clinic visit was repeated on 98 volunteers to determine reliability of measurement procedures. All baseline study-related procedures and questionnaires, including the CT scan, were re-administered and new samples of blood, urine, saliva, and sputum were collected. Field center staff processed these biospecimen samples according to the same protocol. Exacerbation Substudy The Exacerbation Substudy is a prospective, longitudinal observational study of up to 400 participants, which will allow the assessment of participant-driven health care utilization (HCU) events and symptom-defined exacerbation events over time. HCU-driven events are defined by change in medical treatment in response to a perceived COPD Exacerbation. Symptom-based events will be defined by using EXACT-PRO (EXacerbations of Chronic Pulmonary Disease Tool - Patient Reported Outcome), a daily symptom diary developed to measure the frequency, severity, and duration of exacerbations in clinical trials. All participants are provided with a PDA on which to complete the diary. Participants reporting a possible COPD exacerbation will be brought into the study clinic for a study visit to collect biological specimens and questionnaire data. The overall objectives of the Exacerbation Substudy are to: Obtain clinical data and specimens on SPIROMICS participants before and during an acute COPD exacerbation defined by Health care utilization triggered by the subject, or Symptomatic change (triggered by an EXACT defined threshold) Describe symptomatic changes occurring around HCU and symptom-defined (EXACT) events and their relationship to clinical and specimen data, Characterize the non-exacerbation ""stable"" state in COPD using the EXACT, including: Symptom variability (EXACT), Clinical data and specimen parameters during a stable state (baseline), The relationship between clinical and specimen data and symptom severity and variability. Explore the characteristics of stable patients, defined as those who do not experience HCU or symptom-defined (EXACT) events during the sub-study period, using baseline clinical data and specimens, and compare these characteristics with patients who experience HCU and/or symptom-defined events. Examine the relationship between HCU and symptom-defined exacerbation frequency during the first one-year period of follow-up for exacerbations and health outcomes, including 12-month change in lung function and COPD health status, and longer-term morbidity and mortality, with the latter derived from long-term data from the larger SPIROMICS study. Study Weblinks: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) Study Design: Prospective Longitudinal Cohort Study Type:Cohort dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-05-24 and may not include exact formatting or images." phs001927.v1.p1.c2 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001927.v1.p1.c3 /programs/topmed/projects/SPIROMICS_GRU-NPU SPIROMICS_GRU-NPU phs001927.v1.p1.c3 c3 GRU-NPU p1 phs001927 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001927.v1.p1 v1 NHLBI TOPMed: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) SPIROMICS_GRU-NPU topmed-SPIROMICS_GRU-NPU Yes SPIROMICS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.Subpopulations and Intermediate Outcome Measures in COPD Study Description Subpopulations and intermediate outcome measures in COPD study (SPIROMICS) supports the prospective collection and analysis of phenotypic, biomarker, genetic, genomic, and clinical data from subjects with COPD for the purpose of identifying subpopulations and intermediate outcome measures. It is funded by the National Heart, Lung, and Blood Institute and is coordinated by the University of North Carolina at Chapel Hill. Molecular fingerprinting and extensive subject phenotyping will be performed to identify disease subpopulations and to identify and validate surrogate markers of disease severity, which will be useful as intermediate outcome measures for future clinical trials. Secondary aims are to clarify the natural history of COPD, to develop bioinformatic resources that will enable the utilization and sharing of data in studies of COPD and related diseases, and to create a collection of clinical, biomarker, radiographic, and genetic data that can be used by external investigators for other studies of COPD. Participating Institutions: Research participants for SPIROMICS will be enrolled, phenotyped, and followed at twelve SPIROMICS Clinical Centers: Columbia University, Temple University, Johns Hopkins University, Wake Forest University, University of Michigan, University of Illinois at Chicago, University of Iowa, University of Utah, National Jewish Health, University of California at San Francisco, and University of California at Los Angeles. The University of North Carolina at Chapel Hill serves as the Genomics and Informatics Center. The Radiology Reading Center is based at the University of Iowa. The PFT Reading Center is based at the University of California at Los Angeles. Study Design: SPIROMICS is a prospective cohort study that enrolled approximately 2,981 participants at twelve clinical centers over five years. Participants are distributed across four enrollment strata (i.e., Never-smokers, Smokers without COPD, Mild/Moderate COPD, and Severe COPD). Study Visits: Participants have up to four in-person visits (Baseline and Annual Clinic Visits at years 1, 2, 3 after Baseline). Study questionnaires and spirometry are completed at all main study visits. Blood and urine samples are collected at visits 1, 2, and 4. Sputum samples are collected at Visit 1. The CT scans are completed and Baseline and Visit 2. Participants also receive quarterly follow-up calls to assess health status and determine if an exacerbation has occurred. Substudies Bronchoscopy and Immunophenotyping Substudy The Bronchoscopy Substudy will enroll 50 subjects per site, for a total of 300 participants. These participants will be recruited across all four study strata. This substudy includes two study visits. During the first visit, sputum samples are collected for Immunophenotyping analysis at the Immunophenotyping Core Lab based at the University of Michigan. Participants then return for a second visit during which samples are collected via bronchoscopy, including bronchoalveolar lavage, epithelial brushings and bronchial biopsies. Immunophenotyping analysis is also conducted on BAL and blood collected during the bronchoscopy study visit. Repeatability Substudy The entire baseline clinic visit was repeated on 98 volunteers to determine reliability of measurement procedures. All baseline study-related procedures and questionnaires, including the CT scan, were re-administered and new samples of blood, urine, saliva, and sputum were collected. Field center staff processed these biospecimen samples according to the same protocol. Exacerbation Substudy The Exacerbation Substudy is a prospective, longitudinal observational study of up to 400 participants, which will allow the assessment of participant-driven health care utilization (HCU) events and symptom-defined exacerbation events over time. HCU-driven events are defined by change in medical treatment in response to a perceived COPD Exacerbation. Symptom-based events will be defined by using EXACT-PRO (EXacerbations of Chronic Pulmonary Disease Tool - Patient Reported Outcome), a daily symptom diary developed to measure the frequency, severity, and duration of exacerbations in clinical trials. All participants are provided with a PDA on which to complete the diary. Participants reporting a possible COPD exacerbation will be brought into the study clinic for a study visit to collect biological specimens and questionnaire data. The overall objectives of the Exacerbation Substudy are to: Obtain clinical data and specimens on SPIROMICS participants before and during an acute COPD exacerbation defined by Health care utilization triggered by the subject, or Symptomatic change (triggered by an EXACT defined threshold) Describe symptomatic changes occurring around HCU and symptom-defined (EXACT) events and their relationship to clinical and specimen data, Characterize the non-exacerbation ""stable"" state in COPD using the EXACT, including: Symptom variability (EXACT), Clinical data and specimen parameters during a stable state (baseline), The relationship between clinical and specimen data and symptom severity and variability. Explore the characteristics of stable patients, defined as those who do not experience HCU or symptom-defined (EXACT) events during the sub-study period, using baseline clinical data and specimens, and compare these characteristics with patients who experience HCU and/or symptom-defined events. Examine the relationship between HCU and symptom-defined exacerbation frequency during the first one-year period of follow-up for exacerbations and health outcomes, including 12-month change in lung function and COPD health status, and longer-term morbidity and mortality, with the latter derived from long-term data from the larger SPIROMICS study. Study Weblinks: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) Study Design: Prospective Longitudinal Cohort Study Type:Cohort dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-05-24 and may not include exact formatting or images." phs001927.v1.p1.c3 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs001927.v1.p1.c4 /programs/topmed/projects/SPIROMICS_GRU SPIROMICS_GRU phs001927.v1.p1.c4 c4 GRU p1 phs001927 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs001927.v1.p1 v1 NHLBI TOPMed: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) SPIROMICS_GRU topmed-SPIROMICS_GRU Yes SPIROMICS "This study is part of the NHLBI Trans-Omics for Precision Medicine (TOPMed) Whole Genome Sequencing Program. TOPMed is part of a broader Precision Medicine Initiative, which aims to provide disease treatments that are tailored to an individual's unique genes and environment. TOPMed will contribute to this initiative through the integration of whole-genome sequencing (WGS) and other -omics (e.g., metabolic profiles, protein and RNA expression patterns) data with molecular, behavioral, imaging, environmental, and clinical data. In doing so, this program aims to uncover factors that increase or decrease the risk of disease, to identify subtypes of disease, and to develop more targeted and personalized treatments. Two genotype call sets derived from WGS are now available, Freeze 8 (GRCh38) and Freeze 9b (GRCh38), with largely overlapping sample sets. Information about how to identify other TOPMed WGS accessions for cross-study analysis, as well as descriptions of TOPMed methods of data acquisition, data processing and quality control, are provided in the accompanying documents, ""TOPMed Whole Genome Sequencing Project - Freeze 8, Phases 1-4"" and ""TOPMed Whole Genome Sequencing Project - Freeze 9b, Phases 1-4"". Please check the study list at the top of each of these methods documents to determine whether it applies to this study accession.Subpopulations and Intermediate Outcome Measures in COPD Study Description Subpopulations and intermediate outcome measures in COPD study (SPIROMICS) supports the prospective collection and analysis of phenotypic, biomarker, genetic, genomic, and clinical data from subjects with COPD for the purpose of identifying subpopulations and intermediate outcome measures. It is funded by the National Heart, Lung, and Blood Institute and is coordinated by the University of North Carolina at Chapel Hill. Molecular fingerprinting and extensive subject phenotyping will be performed to identify disease subpopulations and to identify and validate surrogate markers of disease severity, which will be useful as intermediate outcome measures for future clinical trials. Secondary aims are to clarify the natural history of COPD, to develop bioinformatic resources that will enable the utilization and sharing of data in studies of COPD and related diseases, and to create a collection of clinical, biomarker, radiographic, and genetic data that can be used by external investigators for other studies of COPD. Participating Institutions: Research participants for SPIROMICS will be enrolled, phenotyped, and followed at twelve SPIROMICS Clinical Centers: Columbia University, Temple University, Johns Hopkins University, Wake Forest University, University of Michigan, University of Illinois at Chicago, University of Iowa, University of Utah, National Jewish Health, University of California at San Francisco, and University of California at Los Angeles. The University of North Carolina at Chapel Hill serves as the Genomics and Informatics Center. The Radiology Reading Center is based at the University of Iowa. The PFT Reading Center is based at the University of California at Los Angeles. Study Design: SPIROMICS is a prospective cohort study that enrolled approximately 2,981 participants at twelve clinical centers over five years. Participants are distributed across four enrollment strata (i.e., Never-smokers, Smokers without COPD, Mild/Moderate COPD, and Severe COPD). Study Visits: Participants have up to four in-person visits (Baseline and Annual Clinic Visits at years 1, 2, 3 after Baseline). Study questionnaires and spirometry are completed at all main study visits. Blood and urine samples are collected at visits 1, 2, and 4. Sputum samples are collected at Visit 1. The CT scans are completed and Baseline and Visit 2. Participants also receive quarterly follow-up calls to assess health status and determine if an exacerbation has occurred. Substudies Bronchoscopy and Immunophenotyping Substudy The Bronchoscopy Substudy will enroll 50 subjects per site, for a total of 300 participants. These participants will be recruited across all four study strata. This substudy includes two study visits. During the first visit, sputum samples are collected for Immunophenotyping analysis at the Immunophenotyping Core Lab based at the University of Michigan. Participants then return for a second visit during which samples are collected via bronchoscopy, including bronchoalveolar lavage, epithelial brushings and bronchial biopsies. Immunophenotyping analysis is also conducted on BAL and blood collected during the bronchoscopy study visit. Repeatability Substudy The entire baseline clinic visit was repeated on 98 volunteers to determine reliability of measurement procedures. All baseline study-related procedures and questionnaires, including the CT scan, were re-administered and new samples of blood, urine, saliva, and sputum were collected. Field center staff processed these biospecimen samples according to the same protocol. Exacerbation Substudy The Exacerbation Substudy is a prospective, longitudinal observational study of up to 400 participants, which will allow the assessment of participant-driven health care utilization (HCU) events and symptom-defined exacerbation events over time. HCU-driven events are defined by change in medical treatment in response to a perceived COPD Exacerbation. Symptom-based events will be defined by using EXACT-PRO (EXacerbations of Chronic Pulmonary Disease Tool - Patient Reported Outcome), a daily symptom diary developed to measure the frequency, severity, and duration of exacerbations in clinical trials. All participants are provided with a PDA on which to complete the diary. Participants reporting a possible COPD exacerbation will be brought into the study clinic for a study visit to collect biological specimens and questionnaire data. The overall objectives of the Exacerbation Substudy are to: Obtain clinical data and specimens on SPIROMICS participants before and during an acute COPD exacerbation defined by Health care utilization triggered by the subject, or Symptomatic change (triggered by an EXACT defined threshold) Describe symptomatic changes occurring around HCU and symptom-defined (EXACT) events and their relationship to clinical and specimen data, Characterize the non-exacerbation ""stable"" state in COPD using the EXACT, including: Symptom variability (EXACT), Clinical data and specimen parameters during a stable state (baseline), The relationship between clinical and specimen data and symptom severity and variability. Explore the characteristics of stable patients, defined as those who do not experience HCU or symptom-defined (EXACT) events during the sub-study period, using baseline clinical data and specimens, and compare these characteristics with patients who experience HCU and/or symptom-defined events. Examine the relationship between HCU and symptom-defined exacerbation frequency during the first one-year period of follow-up for exacerbations and health outcomes, including 12-month change in lung function and COPD health status, and longer-term morbidity and mortality, with the latter derived from long-term data from the larger SPIROMICS study. Study Weblinks: SubPopulations and InteRmediate Outcome Measures In COPD Study (SPIROMICS) Study Design: Prospective Longitudinal Cohort Study Type:Cohort dbGaP estimated ancestry using GRAF-popNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-05-24 and may not include exact formatting or images." phs001927.v1.p1.c4 Program: TOPMed Data Type: Genotype Study Registration: dbGaP +phs002299.v1.p1.c1 /programs/COVID19/projects/ORCHID_HMB ORCHID_HMB phs002299.v1.p1.c1 c1 HMB p1 phs002299 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002299.v1.p1 v1 PETAL Network: Outcomes Related to COVID-19 Treated With Hydroxychloroquine Among Inpatients With Symptomatic Disease (ORCHID) Trial ORCHID_HMB COVID19-ORCHID_HMB Yes ORCHID ORCHID was a multicenter, blinded, placebo-controlled randomized trial conducted at 34 hospitals in the US between April 2 and June 19, 2020. Adults hospitalized with respiratory symptoms from severe acute respiratory syndrome coronavirus 2 infection were enrolled, with the last outcome assessment on July 17, 2020. The planned sample size was 510 patients with five interim analyses; however, the trial was stopped at the fourth interim analysis for futility with a sample size of 479 patients.The distribution of the day 14 clinical status score (measured using a 7-category ordinal scale) was not significantly different for patients randomized to receive hydroxychloroquine compared with placebo.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: PETAL Network ORCHID Study Study Design: Clinical Trial Study Type: Clinical Trial Controlled Trial Placebo-Controlled Randomized Randomized Controlled Clinical Trial Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002299.v1.p1 on 2021-03-25 and may not include exact formatting or images. phs002299.v1.p1.c1 Program: COVID 19 Study Registration: dbGaP +phs002348.v1.p1.c1 /programs/BioLINCC/projects/MSH_GRU MSH_GRU phs002348.v1.p1.c1 c1 GRU p1 phs002348 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002348.v1.p1 v1 Multicenter Study of Hydroxyurea (MSH) MSH_GRU BioLINCC-MSH_GRU Yes MSH This study aimed to determine whether or not treatment with hydroxyurea titrated to maximum tolerated doses would reduce the frequency of vaso-occlusive (painful) crises by at least 50% in 299 men and women between 18 and 50 years old with a diagnosis of sickle cell anemia by gel electrophoresis conducted by a Core Laboratory. A secondary objective investigated correlations of fetal hemoglobin (HbF) levels and other patient or treatment characteristics with the occurrence of vaso-occlusive (painful) crises, and the effect of treatment on the quality of life.This controlled trial made hydroxyurea the first drug of proven benefit in preventing vaso-occlusive pain crisis and acute chest syndrome caused by sickle cell disease, with additional findings including reduced mortality in adult patients taking hydroxyurea for frequent painful sickle cell episodes after 9 of years follow-up. No significant side-effects of hydroxyurea therapy were noted.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: ClinicalTrials.gov (MSH) NHLBI BioLINCC (MSH) Study Design: Clinical Trial Study Type: Double-Blind Randomized Controlled Clinical Trial Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs002348.v1.p1.c1 Program: BioLINCC Study Registration: dbGaP Data Type: Clinical Phenotype +phs002362.v1.p1.c1 /programs/BioLINCC/projects/CSSCD_GRU CSSCD_GRU phs002362.v1.p1.c1 c1 GRU p1 phs002362 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002386.v1.p1 v1 Cooperative Study of Sickle Cell Disease (CSSCD) CSSCD_GRU BioLINCC-CSSCD_GRU Yes CSSCD The Cooperative Study of Sickle Cell Disease was initiated in 1977 to determine the natural history of sickle cell disease (SCD) from birth to death in order to identify those factors contributing to the morbidity and mortality of the disease. Specific objectives included: 1) to study the effect of sickle cell disease on growth and development from birth through adolescence 2) to study the conditions or events that may be related to the onset of painful crises 3) to obtain data on the nature, duration, and outcome of major complications of SCD 4) determine the nature, prevalence, and age- related incidence of organ damage due to SCD, and 5) study the role of SCD and its interaction with selected health events.Phases 2 and 3 of the study involved followup of the infant cohort. A total of 709 infants (age less than 6 months) were enrolled during Phase 1 of the Cooperative Study of Sickle Cell Disease (CSSCD), and Phases 2 and 3 of the CSSCD was designed to follow these children for an additional 10 years. The study objectives included: 1) define prospectively the natural history of sickle cell disease; 2) determine the relationships between cognitive and academic functioning and brain status as determined by MRI; 3) determine the cognitive or behavioral markers of silent infarct; 4) determine the relationship of family functioning on the Family Environment Scale (FES) to brain status, cognitive functioning, and social and demographic factors; 5) continue studies that will enhance the state of knowledge on the influence of sickle cell disease on the psychosocial adjustment of children and adolescents. Phase 2A of the study sought to examine the progression of organ damage in the heart, lung, kidney, and liver in adult cohort patients (born before 1/1/56) enrolled in phase 1 of the study between 3/79 and 5/81. A total of 620 patients from 11 centers were eligible for phase 2A.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: ClinicalTrials.gov (CSSCD) BioLINCC (CSSCD) - For biospecimen requests Study Design: Clinical Trial Study Type: Case-Control Clinical Trial Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs002362.v1.p1.c1 Program: BioLINCC Study Registration: dbGaP Data Type: Clinical Phenotype +phs002363.v1.p1.c1 /programs/COVID19/projects/RED_CORAL_HMB RED_CORAL_HMB phs002363.v1.p1.c1 c1 HMB p1 phs002363 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002363.v1.p1 v1 PETAL - Repository of Electronic Data COVID-19 Observational Study RED_CORAL_HMB COVID19-RED_CORAL_HMB Yes RED_CORAL_HMB To describe characteristics, treatment, and outcomes among patients hospitalized with COVID-19 early in the pandemic, 1480 consecutive adult inpatients with laboratory-confirmed, symptomatic SARS-CoV-2 infection admitted to 57 US hospitals from March 1 to April 1, 2020 were studied.It was found that in a geographically diverse early-pandemic COVID-19 cohort with complete hospital folllow-up, hospital mortality was associated with older age, comorbidity burden, and male sex. Intensive care unit admissions occurred early and were associated with protracted hospital stays. Survivors often required new health care services or respiratory support at discharge.The PETAL Network central institutional review board at Vanderbilt University and the institutional review boards at each participating hospital approved the study or determined that the study was exempt from review.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: PETAL Network RED CORAL StudyNHLBI BioLINCC (RED CORAL) Study Design: Control Set Study Type:Case-CohortClinical CohortCohortMulticenter NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images. phs002363.v1.p1.c1 Program: COVID 19 Study Registration: dbGaP Data Type: Clinical Phenotype +phs002383.v1.p1.c1 /programs/BioLINCC/projects/Walk_PHaSST_GRU Walk_PHaSST_GRU phs002383.v1.p1.c1 c1 GRU p1 phs002383 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002383.v1.p1 v1 Treatment of Pulmonary Hypertension and Sickle Cell Disease With Sildenafil Therapy (walk-PHaSST) Walk_PHaSST_GRU BioLINCC-Walk_PHaSST_GRU Yes Walk_PHaSST_GRU Pulmonary arterial hypertension (PAH) is a progressive condition characterized by narrowing or stiffening pulmonary arterioles resulting in increased pulmonary blood pressure and reduced delivery of oxygenated blood to the body. It is a common complication of sickle cell disease and initially presents with the symptom of shortness of breath (dyspnea) on exertion. As the condition worsens, other symptoms such as dizziness, lower extremity edema, and chest pain can develop. The drug, sildenafil, works by relaxing blood vessels in the lungs which reduces pulmonary blood pressure and allows more oxygenated blood to circulate. Increased levels of oxygenated blood allows individuals with PAH to tolerate more activity, but guidelines for using sildenafil in patients with PAH and sickle cell disease were unavailable at the time of the Walk-PHaSST trial.Participants were screened for the existence of pulmonary hypertension with a six minute walk test and a Doppler echocardiogram that assessed TRV, diastolic function, and valvular and systolic function. Subjects with TRV ≥ 2.7 m/s received further clinical evaluation for possible causes of pulmonary hypertension. Other screening data included medical history, a physical exam, and standard laboratory testing. For individuals with moderate to severe pulmonary hypertension (TRV ≥ 3.0), a cardiac catheterization was done at the baseline and week 16 data collection periods.Subjects eligible for the main intervention trial based on screening results were randomized in a 1:1 double blind fashion to receive sildenafil or placebo for 16 weeks. Subjects received 20 mg of oral sildenafil or matching placebo 3 times daily for 6 weeks, followed by 40 mg 3 times daily for 4 weeks, followed by 80 mg 3 times daily for 6 weeks, as tolerated. Participants could also receive other therapies as needed to manage sickle cell and related complications. The primary outcome measure of the trial was change in the six minute walk test, a standard indicator of a person's heart and lung function and exercise capacity, from baseline to week 16. After completing the study treatment (or placebo), participants could choose to be part of the open-label follow-up phase of the study and continue to be assessed for up to one year.The study was intended to screen about 1000 subjects and randomize 132 subjects, however it was terminated early due to the unforeseen increase in adverse events in participants treated with sildenafil as compared to placebo. When the study was stopped, 33 participants had completed the trial. Subjects continued to be monitored, but were instructed to taper sildenafil treatment over three to seven days.There was no evidence that treatment with sildenafil impacted the six minute walk distance from baseline to week 16. In addition, treatment with sildenafil appeared to increase rates of hospitalization due to sickle cell disease pain.Due to in part to the early termination of the trial, the majority of subject data was collected from the screening phase of the study (n=720), as opposed to the main intervention trial (n=74).Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: ClinicalTrials.gov (Walk-PHaSST) BioLINCC (Walk-PHaSST) Study Design: Clinical Trial Study Type: Clinical Trial Double-Blind Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs002383.v1.p1.c1 Program: BioLINCC Study Registration: dbGaP Data Type: Clinical Phenotype +phs002385.v1.p1.c1 /programs/BioLINCC/projects/CIBMTR_GRU CIBMTR_GRU phs002385.v1.p1.c1 c1 GRU p1 phs002385 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002385.v1.p1 v1 Hematopoietic Cell Transplant for Sickle Cell Disease (HCT for SCD) CIBMTR_GRU BioLINCC-CIBMTR_GRU Yes CIBMTR The Center for International Blood and Marrow Transplant Research (CIBMTR) is a hematopoietic cell transplant registry that was established in 1972 at the Medical College of Wisconsin. The overarching goal of the registry is to study trends in transplantations and to advance the understanding and application of allogeneic hematopoietic cell transplantation for malignant and non-malignant diseases. Included in this dataset are children, adolescents and young adults with severe sickle cell disease who received an allogeneic hematopoietic cell transplant in the United States and provided written informed consent for research.Hematopoietic cell transplant for sickle cell disease is curative. Offering this treatment for patients with severe disease is challenging as only about 20-25% of patients expected to benefit have an HLA-matched sibling. Consequently, several transplantations have utilized an HLA-matched or mismatched unrelated adult donor and HLA-mismatched relative. Transplantation strategies have also evolved over time that has included transplant conditioning regimens of varying intensity, grafts other than bone marrow and novel approaches to overcome the donor-recipient histocompatibility barrier and limit graft-versus-host disease. The data that is available for sickle cell disease transplants have been utilized to report on outcomes after transplantation and compare outcomes after transplantation of grafts HLA-matched related, HLA-mismatched related, HLA-matched and HLA-mismatched unrelated donors. Collectively, these data have advanced our knowledge and understanding of hematopoietic cell transplant for this disease. These data can also serve as 'contemporaneous controls' for comparison with other more recent curative treatments like gene therapy and gene editing.Data available for request include allogeneic hematopoietic cell transplants for sickle cell disease (Hb SS and Hb Sβ thalassemia) in the United States from 1991 to 2019. Follow-up data through December 2020 are available.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: ClinicalTrials.gov (HCT for SCD) BioLINCC (HCT for SCD) Study Design: Prospective Longitudinal Cohort Study Type: Clinical Cohort Cohort Control Set Longitudinal Longitudinal Cohort Multicenter Observational Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs002385.v1.p1.c1 Program: BioLINCC Study Registration: dbGaP Data Type: Clinical Phenotype +phs002386.v1.p1.c1 /programs/BioLINCC/projects/STOPII_GRU STOPII_GRU phs002386.v1.p1.c1 c1 GRU p1 phs002386 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002386.v1.p1 v1 Optimizing Primary Stroke Prevention in Children with Sickle Cell Anemia (STOP II) STOPII_GRU BioLINCC-STOPII_GRU Yes STOPII The STOP II trial evaluated whether prophylactic transfusion in patients with sickle cell disease and high risk of stroke can be safely halted after 30 months of treatment during which patients became low risk for stroke.Stroke causes substantial morbidity in children with sickle cell disease. To prevent first strokes, the Stroke Prevention Trial in Sickle Cell Anemia (STOP) used prophylactic transfusions in children who were identified by transcranial Doppler (TCD) ultrasonography as being at high risk for stroke. This strategy reduced the incidence of stroke among such children from 10% per year to less than 1% per year, leading to recommendations for TCD screening and prophylactic transfusion for children with abnormal velocities on ultrasonography. Despite the reduced risk of stroke, long-term use of transfusions can cause adverse side effects, such as iron overload or alloimmunization. However, cessation of transfusions is associated with recurrence of stroke, and at the time of the STOP II trial, there were no clinical or laboratory indicators to guide the duration of prophylaxis. Therefore the STOP II trial was initiated to determine whether transfusions could be limited by monitoring patients with TCD examinations after transfusions were halted and resuming transfusions if the examination indicated a high risk of stroke.The trial was halted for safety concerns after 79 of a planned 100 children were randomized. Discontinuation of transfusion for the prevention of stroke in children with sickle cell disease resulted in a high rate of reversion to abnormal blood-flow velocities on Doppler studies and stroke incidence.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: BioLINCC (STOP II) ClinicalTrials.gov (STOP II) Study Design: Clinical Trial Study Type: Clinical Trial Randomized Number of study subjects that have individual-level data available through Authorized Access: NOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2021-07-07 and may not include exact formatting or images. phs002386.v1.p1.c1 Program: BioLINCC Study Registration: dbGaP Data Type: Clinical Phenotype +phs002415.v1.p1.c1 /programs/BioLINCC/projects/BabyHug_DS-SCD-IRB-RD BabyHug_DS-SCD-IRB-RD phs002415.v1.p1.c1 c1 DS-SCD-IRB-RD p1 phs002415 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002415.v1.p1 v1 Hydroxyurea to Prevent Organ Damage in Children with Sickle Cell Anemia (BABY HUG) BabyHug_DS-SCD-IRB-RD BioLINCC-BabyHug_DS-SCD-IRB-RD Yes BabyHug Sickle cell anemia is associated with substantial morbidity from acute complications and organ dysfunction beginning in the first year of life. In 1995, the Multicenter Study of Hydroxyurea (MSH) (dbGaP phs002348) demonstrated that, in adults, hydroxyurea is effective in decreasing the frequency of painful crises, hospitalizations for crises, acute chest syndrome, and blood transfusions by 50%. The phase I/II study of hydroxyurea in children (HUG KIDS) demonstrated that children have a response to hydroxyurea similar to that seen in adults in terms of increasing fetal hemoglobin levels and total hemoglobin, and decreasing complications associated with sickle cell anemia. In addition, this study demonstrated that the drug does not adversely affect growth and development between the ages of 5 and 15. A pilot study of hydroxyurea (HUSOFT) given to children between the ages of 6 months and 24 months demonstrated that the drug was well tolerated and that the fetal hemoglobin levels rose and remained elevated compared to baseline with continued hydroxyurea administration.A Special Emphasis Panel (SEP) met on April 12, 1996 to review the results of the MSH trial and the progress to date of the HUG KIDS study. The SEP recommended that NHLBI undertake the BABY HUG trial.The BABY HUG Randomized Controlled Trial concluded that hydroxyurea treatment in very young children seemed to have an acceptable safety profile and to reduce complications of sickle cell anemia. However, more data were needed on the long-term safety of hydroxyurea use in very young children. As a result, follow-up studies were initiated. The Follow-Up Study II provided longer follow-up than Follow-Up Study I, and included more assessment types than Follow-Up Study I.The BABY HUG program consisted of three related studies, each of which has associated datasets and bio-specimens.A randomized controlled trial comparing hydroxyurea to placebo in very young children with sickle cell anemia (BABY HUG Randomized Controlled Trial)The first observational follow-up study of children from the randomized controlled trial (BABY HUG Follow-Up Study I). All children in Follow-Up Study I were offered the option of taking open-label hydroxyurea, with treatment decisions made by the family and the clinical team caring for the child.The second observational follow-up study of children from BABY HUG Follow-Up Study I. All children in Follow-Up Study II were offered the option of taking open-label hydroxyurea, with treatment decisions made by the family and the clinical team caring for the child.The purpose of the Randomized Controlled Trial was to determine if hydroxyurea can safely prevent early end organ damage in very young children with sickle cell anemia.The purpose of the BABY HUG Follow-up Study I was to provide structured follow-up of the children enrolled in the BABY HUG Randomized Controlled Trial, in order to characterize the long-term toxicities and unexpected risks (if any) associated with treatment with hydroxyurea at an early age.The objective of Follow-Up Study II was to obtain additional data about the long-term safety and efficacy of hydroxyurea use in children with Sickle Cell Anemia through at least the first decade of life.Instructions for requesting individual-level data are available on BioData Catalyst at https://biodatacatalyst.nhlbi.nih.gov/resources/data/. Apply for data access in dbGaP. Upon approval, users may begin accessing requested data in BioData Catalyst. For questions about availability, you may contact the BioData Catalyst team at https://biodatacatalyst.nhlbi.nih.gov/contact. Study Weblinks: Randomized Control TrialFollow-Up Study IFollow-Up Study IIBioLINCC - BABY HUG Study Design: Clinical Trial Study Type:Clinical CohortClinical TrialCollectionControlled TrialDouble-BlindNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images. phs002415.v1.p1.c1 Study Registration: dbGaP Data Type: Clinical Phenotype +phs002694.v1.p1.c1 /programs/COVID19/projects/ACTIV4A_GRU ACTIV4A_GRU phs002694.v1.p1.c1 c1 GRU p1 phs002694 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002694.v1.p1 v1 Accelerating COVID-19 Therapeutic Interventions and Vaccines 4 ACUTE (ACTIV-4A) ACTIV4A_GRU COVID19-ACTIV4A_GRU Yes ACTIV-4A This is a randomized, open label, adaptive platform trial to compare the effectiveness of antithrombotic strategies for prevention of adverse outcomes in COVID-19 positive inpatients. Study Design: Interventional Study Type:Clinical TrialControlled TrialInterventionalRandomizedRandomized Controlled Clinical TrialNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images. phs002694.v1.p1.c1 Program: COVID 19 Study Registration: dbGaP Data Type: Clinical Phenotype +phs002710.v1.p1.c1 /programs/COVID19/projects/ACTIV4B_GRU ACTIV4B_GRU phs002710.v1.p1.c1 c1 GRU p1 phs002710 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002710.v1.p1 v1 COVID-19 Positive Outpatient Thrombosis Prevention in Adults Aged 40-80 ACTIV4B_GRU COVID19-ACTIV4B_GRU Yes ACTIV-4B An adaptive randomized double-blind placebo-controlled platform trial to compare the effectiveness of anticoagulation with antiplatelet agents and with placebo to prevent thrombotic events in patients diagnosed with COVID-19 who are not admitted to hospital as COVID-19 related symptoms are currently stable. Study Design: Interventional Study Type:Clinical TrialDouble-BlindInterventionalPlacebo-ControlledRandomizedRandomized Controlled Clinical TrialNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-03-29 and may not include exact formatting or images. phs002710.v1.p1.c1 Program: COVID 19 Study Registration: dbGaP Data Type: Clinical Phenotype +phs002715.v1.p1.c1 /programs/NSRR/projects/NSRR-CFS_DS-HLBS-IRB-NPU NSRR-CFS_DS-HLBS-IRB-NPU phs002715.v1.p1.c1 c1 DS-HLBS-IRB-NPU p1 phs002715 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002715.v1.p1 v1 Cleveland Family Study NSRR-CFS_DS-HLBS-IRB-NPU NSRR-NSRR-CFS_DS-HLBS-IRB-NPU Yes NSRR-CFS The Cleveland Family Study (CFS) is a family-based study of sleep apnea, consisting of 2,284 individuals (46% African American) from 361 families studied on up to 4 occasions over a period of 16 years. The study began in 1990 with the initial aims of quantifying the familial aggregation of sleep apnea. National Institutes of Health (NIH) renewals provided expansion of the original cohort, including increased minority recruitment, and longitudinal follow-up, with the last exam occurring in February 2006. The CFS was designed to provide fundamental epidemiological data on risk factors for sleep disordered breathing (SDB). The sample was selected by identifying affected probands who had laboratory diagnosed obstructive sleep apnea. All first-degree relatives, spouses and available second-degree relatives of affected probands were studied. In addition, during the first 5 study years, neighborhood control families were identified through a neighborhood proband, and his/her spouses and first-degree relatives. Each exam, occurring at approximately 4-year intervals, included new enrollment as well as follow up exams for previously enrolled subjects. For the first three visits, data, including an overnight sleep study, were collected in participants' homes while the last visit occurred in a general clinical research center (GCRC). Phenotypic characterization of the entire cohort included overnight sleep apnea studies, blood pressure, spirometry, anthropometry and questionnaires. Currently, data of 710 individuals are available for use through BioData Catalyst (with genotype data available through dbGaP).The National Sleep Research Resource (NSRR) is a NIH-supported sleep data repository that offers free access to large collections of de-identified physiological signals and related clinical data from a large range of cohort studies, clinical trials and other data sources from children and adults, including healthy individuals from the community and individuals with known sleep or other health disorders. The goals of NSRR are to facilitate rigorous research that requires access to large or more diverse data sets, including raw physiological signals, to promote a better understanding of risk factors for sleep and circadian disorders and/or the impact of sleep disturbances on health-related outcomes. Data from over 15 data sources and more than 40,000 individual sleep studies, many linked to dozens if not hundreds of clinical data elements, are available (as of Feb. 2022). Query tools are available to identify variables of interest, and their meta-data and provenance. Study Weblinks: Cleveland Family Study Study Design: Prospective Longitudinal Cohort Study Type:Longitudinal CohortNOTE: This text was scraped from https://www.ncbi.nlm.nih.gov/ on 2022-05-24 and may not include exact formatting or images. phs002715.v1.p1.c1 Study Registration: dbGaP +phs002752.v1.p1.c1 /programs/COVID19/projects/C3PO_GRU C3PO_GRU phs002752.v1.p1.c1 c1 GRU p1 phs002752 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs002752.v1.p1 v1 Clinical-trial of COVID-19 Convalescent Plasma in Outpatients C3PO_GRU COVID19-C3PO_GRU Yes C3PO The overarching goal of this project is to confirm or refute the role of passive immunization as a safe and efficacious therapy in preventing the progression from mild to severe/critical COVID-19 illness and to understand the immunologic kinetics of anti-SARS-CoV-2 antibodies after passive immunization.The primary objective is to determine the efficacy and safety of a single dose of convalescent plasma (CP) for preventing the progression from mild to severe COVID-19 illness. The secondary objective is to characterize the immunologic response to CP administration.This study will enroll adults presenting to the emergency department (ED) with mild, symptomatic, laboratory-confirmed COVID-19 illness, who are at high risk for progression to severe/critical illness, but who are clinically stable for outpatient management at randomization. phs002752.v1.p1.c1 Program: COVID 19 Study Registration: dbGaP Data Type: Clinical Phenotype +tutorial-biolincc_camp [{"md5sum": "a1890eb3da180416a3a1e2c4e4527356", "file_name": "camp_teach.sav", "file_size": 1291786, "object_id": "dg.4503/8d84511c-76f9-4464-8fdf-6dd668ed9c64"}, {"md5sum": "32d8152b09a2ed05a0fde2f21ff46479", "file_name": "CAMP_Teaching.zip", "file_size": 2565265, "object_id": "dg.4503/3ca7d383-d340-4439-82cc-a30d4fb0bac3"}, {"md5sum": "dde1b1d86b3b4ed88fa5b42974ecfd79", "file_name": "tutorial-biolincc_camp_structured_data.zip", "file_size": 94535, "object_id": "dg.4503/0c8df5e3-22c0-40cd-beac-1ae8559920b5"}, {"md5sum": "8f5b9b28004210865a0c1d7fc9834b1a", "file_name": "camp_teach.csv", "file_size": 932272, "object_id": "dg.4503/03ed62aa-2500-412d-9734-b92713098154"}, {"md5sum": "819f37ffdb4469fb4377b8da07c9db35", "file_name": "camp_teach.sas7bdat", "file_size": 2032640, "object_id": "dg.4503/b26ad8db-eb00-4c22-9ff9-ce642c77e256"}, {"md5sum": "5dad2f1de7a1f89652157f13bc8b4dab", "file_name": "camp_teach.xlsx", "file_size": 924492, "object_id": "dg.4503/e1671902-afa6-45eb-9a14-92eae6836dda"}, {"md5sum": "fe1d85a7d7bc35a65a1b602f8edc303f", "file_name": "CAMP_Teaching_Documentation.pdf", "file_size": 612043, "object_id": "dg.4503/05224455-3227-40ec-a383-19e5f385ae7a"}, {"md5sum": "2048b318ccae42dffaf15a861fa32e6e", "file_name": "camp_teach.dta", "file_size": 782016, "object_id": "dg.4503/356480a2-e5b9-4347-988c-c4b592956d46"}] /programs/tutorial/projects/biolincc_camp biolincc_camp https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. biolincc_camp tutorial-biolincc_camp Yes tutorial-biolincc_camp Program: Tutorial Data Type: Clinical Phenotype +tutorial-biolincc_digitalis [{"md5sum": "c9a3d6d5651218d8311724bf3d2a8e09", "file_name": "DIG Documentation.pdf", "file_size": 121152, "object_id": "dg.4503/f833eed0-11f5-403c-bd37-795b16ef313b"}, {"md5sum": "6b0e8cd2edc39075f4774a4769ccf4e9", "file_name": "xfer_dig_teaching_v2021_07_15.xlsx", "file_size": 1543371, "object_id": "dg.4503/11ab156e-65ca-49ef-b876-cc3bd22e38be"}, {"md5sum": "e719bff7b86e8ceb851df050db862c92", "file_name": "DIG example program.sas", "file_size": 7834, "object_id": "dg.4503/d809e145-0b6c-4c91-b186-5ca4ce91706a"}, {"md5sum": "dd9c2799d8ed8129f3895e5a89f0fb62", "file_name": "xfer_dig_teaching_v2021_07_15.csv", "file_size": 1422793, "object_id": "dg.4503/4a871b36-54d3-485e-b19a-19f499984a9e"}, {"md5sum": "b1de7dc8ad2c20140045ffda257a2658", "file_name": "DIG_teaching.zip", "file_size": 3406143, "object_id": "dg.4503/0ee96c5c-cc53-4a31-a0c0-7bcc52cb40da"}, {"md5sum": "672ed88a9957da1ce7849ef4965c68f0", "file_name": "xfer_dig_teaching_v2021_07_15.dta", "file_size": 3928580, "object_id": "dg.4503/e5e54d83-ae08-420e-902c-2121e7b3df49"}, {"md5sum": "29692730d627f380ea8af657a9211f7d", "file_name": "xfer_dig_teaching_v2021_07_15.sas7bdat", "file_size": 4063232, "object_id": "dg.4503/b8fe1b2d-0208-40fc-80e0-289bc0de10bb"}, {"md5sum": "b7f240d4f5acd3f61594ed62e2aad3bc", "file_name": "tutorial-biolincc_digitalis_structured_data.zip", "file_size": 606056, "object_id": "dg.4503/1183172c-3a5e-44d3-8691-c69daf289fd3"}, {"md5sum": "f0eb3ab3e8cd2ae1088cc7634cb44142", "file_name": "DIG Documentation with supplement.pdf", "file_size": 163564, "object_id": "dg.4503/3a51b188-e140-4a72-9a57-bc5602e8ca08"}, {"md5sum": "63e41fab0f0edb0c0cdc1e536fdf4bd5", "file_name": "xfer_dig_teaching_v2021_07_15.sav", "file_size": 3922665, "object_id": "dg.4503/37e653e4-0fbe-4dd6-bb20-db2fbba3e0e2"}, {"md5sum": "cd62957f381a4212ade32e6f6f60e5fa", "file_name": "Xfer_dig_teaching.lst", "file_size": 2970306, "object_id": "dg.4503/d90ef4cc-b7ea-4e4d-a535-925628f7168e"}] programs/tutorial/projects/biolincc_digitalis biolincc_digitalis https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. biolincc_digitalis tutorial-biolincc_digitalis Yes biolincc_digitalis_study Program: Tutorial Data Type: Clinical Phenotype +tutorial-biolincc_framingham [{"md5sum": "424253be27f59ddd147c95715849180c", "file_name": "tutorial-biolincc_framingham_structured_data.zip", "file_size": 416055, "object_id": "dg.4503/6cb03533-c079-47e2-a1af-29c92280a9cc"}, {"md5sum": "81aa3bb1d1b8743541ef2870b31c4484", "file_name": "frmgham2.csv", "file_size": 1407548, "object_id": "dg.4503/9c277b3d-3fab-401e-b1dd-d2e6c7991cbc"}, {"md5sum": "71a8e7b2cc6e314f7b69a3e9bab8ff35", "file_name": "FRAMINGHAM_teaching_2019a.zip", "file_size": 1827052, "object_id": "dg.4503/7be3c6bb-602c-402a-88d2-50394bf8b433"}, {"md5sum": "ceb12258639e3e5e2efc0899f3321a0e", "file_name": "frmgham2.sav", "file_size": 1547748, "object_id": "dg.4503/c97507dd-bb79-45ce-9186-3d14ad823f81"}, {"md5sum": "5a6a6515c4d70f42e97c6300930ee7ad", "file_name": "frmgham2.xls", "file_size": 3127296, "object_id": "dg.4503/f4654f72-3b9a-4536-8fb7-73f61b7c5fb7"}, {"md5sum": "d5cd8a0b42d7982662844b202fd998ef", "file_name": "frmgham2.dta", "file_size": 762189, "object_id": "dg.4503/8ac6d3f5-29fa-42ff-870c-5ba143455083"}, {"md5sum": "c1ff1e344feb993f6e7c1eda9a26ed8f", "file_name": "frmgham2.sas7bdat", "file_size": 3671040, "object_id": "dg.4503/f2c2d44c-a099-4bc6-bc8b-7012a28b73d7"}, {"md5sum": "8b341998742d540b6d0fbc86a050056d", "file_name": "Framingham Longitudinal Data Documentation.pdf", "file_size": 179883, "object_id": "dg.4503/f87f27ed-f70b-485b-8631-00c1216681fd"}] /programs/tutorial/projects/biolincc_framingham biolincc_framingham https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. biolincc_framingham tutorial-biolincc_framingham Yes The Framingham Heart Study is a long term prospective study of the etiology of cardiovascular\\ndisease among a population of free living subjects in the community of Framingham,\\nMassachusetts. The Framingham Heart Study was a landmark study in epidemiology in that it\\nwas the first prospective study of cardiovascular disease and identified the concept of risk\\nfactors and their joint effects. The study began in 1948 and 5,209 subjects were initially enrolled\\nin the study. Participants have been examined biennially since the inception of the study and all\\nsubjects are continuously followed through regular surveillance for cardiovascular outcomes.\\nClinic examination data has included cardiovascular disease risk factors and markers of\\ndisease such as blood pressure, blood chemistry, lung function, smoking history, health\\nbehaviors, ECG tracings, Echocardiography, and medication use. Through regular surveillance\\nof area hospitals, participant contact, and death certificates, the Framingham Heart Study\\nreviews and adjudicates events for the occurrence of Angina Pectoris, Myocardial Infarction,\\nHeart Failure, and Cerebrovascular disease.\\nThe enclosed dataset is a subset of the data collected as part of the Framingham study and\\nincludes laboratory, clinic, questionnaire, and adjudicated event data on 4,434 participants.\\nParticipant clinic data was collected during three examination periods, approximately 6 years\\napart, from roughly 1956 to 1968. Each participant was followed for a total of 24 years for the\\noutcome of the following events: Angina Pectoris, Myocardial Infarction, Atherothrombotic\\nInfarction or Cerebral Hemorrhage (Stroke) or death. (NOTE: Although the enclosed dataset\\ncontains Framingham data 'as collected' by Framingham investigators, specific methods\\nwere employed to ensure an anonymous dataset that protects patient confidentiality;\\ntherefore, this dataset is inappropriate for publication purposes. All persons teaching\\nwith this dataset are encouraged to ensure all users are aware that this dataset is\\ninappropriate for publication purposes.) tutorial-biolincc_framingham Program: Tutorial Data Type: Clinical Phenotype +tutorial-synthetic_data_set_1 [{"md5sum": "7204a6a585eab709f58d7173d6b45860", "file_name": "ALL.chr8.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 15769211, "object_id": "dg.4503/93f98458-e816-4e56-9bea-013dc6c0ea4b"}, {"md5sum": "cdb26235b79473d3da3f88959e849c65", "file_name": "ALL.chr18.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 158422243, "object_id": "dg.4503/0fbb8b5d-81a5-4928-a42d-7cac707f746e"}, {"md5sum": "9172e20f9e6804dbd1daf64d5f72de22", "file_name": "ALL.chr10.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 13026331, "object_id": "dg.4503/f151add8-5b17-46da-88e8-86f61c653fac"}, {"md5sum": "bf90e87afde687f14bf26f4801484722", "file_name": "ALL.chr13.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 6403066, "object_id": "dg.4503/53b304e1-353e-4286-bff8-581d57f5bcd6"}, {"md5sum": "6d92a07d725e933bee40c132c60c22ef", "file_name": "tutorial-synthetic_data_set_1_structured_data.zip", "file_size": 2105748, "object_id": "dg.4503/1e4d2737-5878-4f5a-bc1c-1ed4dd4839cc"}, {"md5sum": "fd8d6dc6524cc980eff56b65133802ff", "file_name": "ALL.chr20.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 10445312, "object_id": "dg.4503/3d935803-579e-4c6d-8f54-367dd07e7473"}, {"md5sum": "d0a7fefd916b9ac0f94b8f62d8e46144", "file_name": "ALL.chr9.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 13062989, "object_id": "dg.4503/a4e82b9f-28bd-4762-ad27-83d5b2801aba"}, {"md5sum": "f46e2d458148427baaf067a09c7adf66", "file_name": "ALL.chr2.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 23214980, "object_id": "dg.4503/69e6e863-f16c-428f-ae5f-60ce1aecee82"}, {"md5sum": "097b7865d15eb75bd170e5c270e311fe", "file_name": "ALL.chr21.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 3153836, "object_id": "dg.4503/201d37b1-b2e1-4432-a473-d1b89283875b"}, {"md5sum": "88f50b917e7990b0e793eff124e7db00", "file_name": "ALL.chr6.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 57777602, "object_id": "dg.4503/6a4ada9b-756b-44ff-ba4d-49f35fe9a9ee"}, {"md5sum": "e4001829e6e59f1f37db39c08a29dd97", "file_name": "ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 21134780, "object_id": "dg.4503/73f904d1-de54-4ee3-9ae3-ba8af9d0aa7a"}, {"md5sum": "34ec3657c883d673e1f8f74ee7ab7109", "file_name": "ALL.chr13.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 55828550, "object_id": "dg.4503/b4a7afff-d8ba-41e7-ab12-b046768252df"}, {"md5sum": "d3e8f13cfeaec0560757295493773620", "file_name": "ALL.chr14.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 61024080, "object_id": "dg.4503/80cb7adc-9e5e-4a55-9795-97015f2eaa7c"}, {"md5sum": "d29e17a46da1f1ac2d0c2a014c1bf2bd", "file_name": "ALL.chr15.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 137813244, "object_id": "dg.4503/375f68a7-da66-4ea4-bd08-2419a401ab2a"}, {"md5sum": "4e5f7050d2fd82f9a78347feabdf8bbb", "file_name": "ALL.chr18.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 4947415, "object_id": "dg.4503/e74d72ab-eaad-4c30-8ebc-6ca8d0ab918e"}, {"md5sum": "3509dbbec02950f0d5a266ac75717bf8", "file_name": "ALL.chr17.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 12080594, "object_id": "dg.4503/0329422d-a068-4a78-add8-ef6ce6126e8f"}, {"md5sum": "d52d1a7c65754f87b8e3560fc16b2907", "file_name": "ALL.chr21.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 22001111, "object_id": "dg.4503/81754e5d-484e-4079-b7f3-01d34e2bba18"}, {"md5sum": "4a8764944edde5798aef931b41cf1fa4", "file_name": "ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 423318555, "object_id": "dg.4503/61d536fd-6304-48e4-9dc7-b49fd1eb672c"}, {"md5sum": "3fe2d11da3986248f3420f2ac89cb2ee", "file_name": "ALL.chr3.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 16390120, "object_id": "dg.4503/9d3f85b5-2172-401a-9216-1b4dbf71d101"}, {"md5sum": "0eb8b3caa45d2da4383fab0a979270a5", "file_name": "ALL.chr9.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 142160539, "object_id": "dg.4503/7a828ef4-e474-48f3-87ff-cd0a93d4737a"}, {"md5sum": "9652132bacb417440375ac53e6018936", "file_name": "ALL.chr5.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 17031737, "object_id": "dg.4503/f7266cee-f2e1-4a10-86ff-0c33e5d0dbd5"}, {"md5sum": "255e732ac6263392d21b5d842187b22e", "file_name": "ALL.chr14.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 7761343, "object_id": "dg.4503/21e0d175-94d2-4369-bd34-a83aa329a3b0"}, {"md5sum": "fe33369b13a51f69eba32cf14bb11ddf", "file_name": "ALL.chr12.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 225684874, "object_id": "dg.4503/bfcf0183-5e77-4835-a560-1cfd28412bed"}, {"md5sum": "f52551b6b6bc6d24b2f337281375a056", "file_name": "ALL.chr12.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 14192563, "object_id": "dg.4503/4d663042-3e83-4976-8858-d76964220bba"}, {"md5sum": "6ea158d4ebfdcdfd6d18631c9673a338", "file_name": "ALL.chr19.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 11081905, "object_id": "dg.4503/dbbd1fe3-84e9-408e-98a8-a185a7b22d77"}, {"md5sum": "118a476bdfc8a9182b6ee8ab0996bca0", "file_name": "ALL.chr22.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 3436972, "object_id": "dg.4503/a0c1a8db-a301-4b36-b3c6-a2277b4e825f"}, {"md5sum": "7c9ccda7f36bcbde395f078b08776250", "file_name": "ALL.chr8.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 174703056, "object_id": "dg.4503/063d5ae8-aa0e-40dd-8513-a667a6d25a24"}, {"md5sum": "3970b13eb88c6d81bfe83f9235df498b", "file_name": "ALL.chr16.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 201094970, "object_id": "dg.4503/7a98f880-c788-4b72-abe9-578b608f4c50"}, {"md5sum": "fd09af72365b17ff5e6097cf7d73e2fa", "file_name": "ALL.chr6.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 894564039, "object_id": "dg.4503/5a23e238-0e17-4c17-97fb-5f44c9ee8760"}, {"md5sum": "cabc6f005c87c2f8a70e178f2d637478", "file_name": "ALL.chr15.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 10735955, "object_id": "dg.4503/4f3ed736-9ff8-45f0-90d6-2e23bdaa8094"}, {"md5sum": "8d374ffdeaa1a20e4830b179e38d6eb3", "file_name": "ALL.chr7.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 15015187, "object_id": "dg.4503/d021f911-c786-483d-a355-f97a91f98d6a"}, {"md5sum": "b9d0ea35b5e44edadb26e563dd516706", "file_name": "ALL.chr2.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 465821927, "object_id": "dg.4503/26064764-0427-4b2c-8b57-d7e70ffdf6d0"}, {"md5sum": "07de37e7240689f8f35532fc27b09eb7", "file_name": "ALL.chr7.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 176991884, "object_id": "dg.4503/43f265aa-ce30-45fb-babd-9d6562004dac"}, {"md5sum": "082303d97bd81af618de0e7fa3e9f1be", "file_name": "ALL.chr4.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 180784921, "object_id": "dg.4503/475dd7a8-096d-40d3-b699-2b2dcb38cf02"}, {"md5sum": "f6c325ede7eb986681fb6df30b5531ef", "file_name": "ALL.chr11.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 14892185, "object_id": "dg.4503/28b4568b-09d9-4c6c-bbb6-533b4d9168e5"}, {"md5sum": "cafd6ac1e9f360ba2394c66820c4cb8b", "file_name": "ALL.chr10.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 127509951, "object_id": "dg.4503/6d9cc35b-0ab7-4cce-b3d3-7da87c0bd286"}, {"md5sum": "e7a2dd6a02b000ffccf228dc8b2c559b", "file_name": "ALL.chr11.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 259505039, "object_id": "dg.4503/6a82da45-7755-4ea1-9cda-119f0d3ae4a6"}, {"md5sum": "3a507de53be120363e45a581cba183a0", "file_name": "ALL.chr16.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 13246395, "object_id": "dg.4503/85828ca5-f789-4e93-b28d-3b3f629df3e0"}, {"md5sum": "9db89fda7b2291316400fcc4813a904c", "file_name": "ALL.chr20.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 139850732, "object_id": "dg.4503/4e9ccdb7-1ac9-4aec-a8e9-ec7dedd0dc74"}, {"md5sum": "744376ebea4c80de61b5865e0db3c8d6", "file_name": "ALL.chr5.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 230627046, "object_id": "dg.4503/4e92074e-44fb-4707-92e5-bad8e0e23516"}, {"md5sum": "91a725e3765290e2cffcebc6412e3812", "file_name": "ALL.chr17.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 119966238, "object_id": "dg.4503/0ca13cd0-7be6-482d-9d4b-50324d6ca0d2"}, {"md5sum": "7e43c97353c6df0d9ddb9ffd021ff1c8", "file_name": "ALL.chr4.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz.gds", "file_size": 13811220, "object_id": "dg.4503/00795140-8eae-4764-849a-863949d54c80"}, {"md5sum": "51cb3d8cfb512c0c0c9f149212445741", "file_name": "ALL.chr3.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 227870878, "object_id": "dg.4503/c11533b0-d5ff-4e8a-bdd0-7442d94b5691"}, {"md5sum": "57a3bf18311015120b40e0b4680fa3e4", "file_name": "ALL.chr22.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 22910605, "object_id": "dg.4503/f66902fa-97cb-48ec-9671-9cca840cd0b1"}, {"md5sum": "4a82817cde6d0e25aa00e8c7fed401d3", "file_name": "ALL.chr19.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.bi_maf001.vcf.bgz", "file_size": 177987693, "object_id": "dg.4503/2d686863-3337-4bc0-b5f6-366aaf575459"}] /programs/tutorial/projects/synthetic_data_set_1 synthetic_data_set_1 https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=.. synthetic_data_set_1 tutorial-synthetic_data_set_1 Yes high_coverage_2019_Public tutorial-synthetic_data_set_1 Program: Tutorial Data Type: Genotype Data Type: Clinical Phenotype diff --git a/tests/merge_manifests/discovery_combine/metadata_file.tsv b/tests/merge_manifests/discovery_combine/metadata_file.tsv new file mode 100644 index 000000000..d1f3730c3 --- /dev/null +++ b/tests/merge_manifests/discovery_combine/metadata_file.tsv @@ -0,0 +1,4 @@ +Category Citers Condition Description Disclaimer Enrollment Focus Id Identifier Keyword NumAnalyses NumDocuments NumMolecularDatasets NumPhenotypeDatasets NumSamples NumSubStudies NumSubjects NumVariables ReleaseDate ResearchStudyURL ResourceType Sponsor Status StudyConsents StudyOverviewUrl Title +Prospective Longitudinal Cohort "[{""Title"": ""Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk"", ""Url"": ""h""}, {""Title"": ""The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity"", ""Url"": ""h""}, {""Title"": ""Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort"", ""Url"": ""h""}, {""Title"": ""Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1"", ""Url"": ""h""}, {""Title"": ""Evaluating prognostic accuracy of biomarkers in nested case\u00e2\u0080\u0093control studies"", ""Url"": ""h""}, {""Title"": ""Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations"", ""Url"": ""h""}, {""Title"": ""Evaluating the Evidence for Transmission Distortion in Human Pedigrees"", ""Url"": ""h""}, {""Title"": ""Knowledge-Driven Analysis Identifies a Gene\u00e2\u0080\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations"", ""Url"": ""h""}, {""Title"": ""Family-Based Association Studies for Next-Generation Sequencing"", ""Url"": ""h""}, {""Title"": ""Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study"", ""Url"": ""h""}, {""Title"": ""Prediction of Expected Years of Life Using Whole-Genome Markers"", ""Url"": ""h""}, {""Title"": ""Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality"", ""Url"": ""h""}, {""Title"": ""How Genes Influence Life Span: The Biodemography of Human Survival"", ""Url"": ""h""}, {""Title"": ""d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes"", ""Url"": ""h""}, {""Title"": ""Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans"", ""Url"": ""h""}, {""Title"": ""Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study"", ""Url"": ""h""}, {""Title"": ""Obesity\u00e2\u0080\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice"", ""Url"": ""h""}, {""Title"": ""Genomics of human health and aging"", ""Url"": ""h""}, {""Title"": ""Inter-chromosomal level of genome organization and longevity-related phenotypes in humans"", ""Url"": ""h""}, {""Title"": ""The role of lipid-related genes, aging-related processes, and environment in healthspan"", ""Url"": ""h""}, {""Title"": ""A family-based joint test for mean and variance heterogeneity for quantitative traits"", ""Url"": ""h""}, {""Title"": ""A Systematic Heritability Analysis of the Human Whole Blood Transcriptome"", ""Url"": ""h""}, {""Title"": ""Assessment of Whole-Genome Regression for Type II Diabetes"", ""Url"": ""h""}, {""Title"": ""Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease"", ""Url"": ""h""}, {""Title"": ""The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits"", ""Url"": ""h""}, {""Title"": ""Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes"", ""Url"": ""h""}, {""Title"": ""Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies"", ""Url"": ""h""}, {""Title"": ""Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease"", ""Url"": ""h""}, {""Title"": ""Genomic prediction of coronary heart disease"", ""Url"": ""h""}, {""Title"": ""KLB is associated with alcohol drinking, and its gene product \u00c3\u009f-Klotho is necessary for FGF21 regulation of alcohol preference"", ""Url"": ""h""}, {""Title"": ""Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits"", ""Url"": ""h""}, {""Title"": ""Using information of relatives in genomic prediction to apply effective stratified medicine"", ""Url"": ""h""}, {""Title"": ""Metabolomic profiles as reliable biomarkers of dietary composition"", ""Url"": ""h""}, {""Title"": ""Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes"", ""Url"": ""h""}, {""Title"": ""Structural variants caused by Alu insertions are associated with risks for many human diseases"", ""Url"": ""h""}, {""Title"": ""An Exploration of Gene-Gene Interactions and Their Effects on Hypertension"", ""Url"": ""h""}, {""Title"": ""Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits"", ""Url"": ""h""}, {""Title"": ""Cytosolic proteome profiling of monocytes for male osteoporosis"", ""Url"": ""h""}, {""Title"": ""Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets"", ""Url"": ""h""}, {""Title"": ""Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis"", ""Url"": ""h""}, {""Title"": ""Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution"", ""Url"": ""h""}, {""Title"": ""rqt: an R package for gene-level meta-analysis"", ""Url"": ""h""}, {""Title"": ""Strong impact of natural-selection\u00e2\u0080\u0093free heterogeneity in genetics of age-related phenotypes"", ""Url"": ""h""}, {""Title"": ""Apolipoprotein E region molecular signatures of Alzheimer's disease"", ""Url"": ""h""}, {""Title"": ""The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study"", ""Url"": ""h""}, {""Title"": ""Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms"", ""Url"": ""h""}, {""Title"": ""Genetic heterogeneity of Alzheimer\u00e2\u0080\u0099s disease in subjects with and without hypertension"", ""Url"": ""h""}, {""Title"": ""The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports"", ""Url"": ""h""}, {""Title"": ""A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Final Draft Status of the Epidemiology of Atrial Fibrillation"", ""Url"": ""h""}, {""Title"": ""Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study"", ""Url"": ""h""}, {""Title"": ""SLEEP MEDICINE NEWS AND UPDATES"", ""Url"": ""h""}, {""Title"": ""Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study"", ""Url"": ""h""}, {""Title"": ""Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index"", ""Url"": ""h""}, {""Title"": ""GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA"", ""Url"": ""h""}, {""Title"": ""A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project"", ""Url"": ""h""}, {""Title"": ""Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009"", ""Url"": ""h""}, {""Title"": ""Current Perceptions of the Epidemiology of Atrial Fibrillation"", ""Url"": ""h""}, {""Title"": ""Consent for Genetic Research in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women"", ""Url"": ""h""}, {""Title"": ""Genetics of the Framingham Heart Study Population"", ""Url"": ""h""}, {""Title"": ""Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience"", ""Url"": ""h""}, {""Title"": ""Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?"", ""Url"": ""h""}, {""Title"": ""Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years"", ""Url"": ""h""}, {""Title"": ""Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Heritability of pulmonary function estimated from pedigree and whole-genome markers"", ""Url"": ""h""}, {""Title"": ""Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction"", ""Url"": ""h""}, {""Title"": ""Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations"", ""Url"": ""h""}, {""Title"": ""Phenotypic extremes in rare variant study designs"", ""Url"": ""h""}, {""Title"": ""Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology"", ""Url"": ""h""}, {""Title"": ""Genome-wide association study of subclinical interstitial lung disease in MESA"", ""Url"": ""h""}, {""Title"": ""Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models"", ""Url"": ""h""}, {""Title"": ""A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking"", ""Url"": ""h""}, {""Title"": ""Protein Biomarkers of Cardiovascular Disease and Mortality in the Community"", ""Url"": ""h""}, {""Title"": ""Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes"", ""Url"": ""h""}, {""Title"": ""Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\u00e2\u0080\u0094The Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Evaluating the Evidence for Transmission Distortion in Human Pedigrees"", ""Url"": ""h""}, {""Title"": ""Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis"", ""Url"": ""h""}, {""Title"": ""Whole-genome association study identifies STK39 as a hypertension susceptibility gene"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15"", ""Url"": ""h""}, {""Title"": ""Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males"", ""Url"": ""h""}, {""Title"": ""Genetic Analysis of Variation in Human Meiotic Recombination"", ""Url"": ""h""}, {""Title"": ""Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway"", ""Url"": ""h""}, {""Title"": ""New Lesions Detected by Single Nucleotide Polymorphism Array\u00e2\u0080\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia"", ""Url"": ""h""}, {""Title"": ""ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis"", ""Url"": ""h""}, {""Title"": ""Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study"", ""Url"": ""h""}, {""Title"": ""Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry"", ""Url"": ""h""}, {""Title"": ""GWAF: an R package for genome-wide association analyses with family data"", ""Url"": ""h""}, {""Title"": ""Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data"", ""Url"": ""h""}, {""Title"": ""Natural selection in a contemporary human population"", ""Url"": ""h""}, {""Title"": ""Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology"", ""Url"": ""h""}, {""Title"": ""Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height"", ""Url"": ""h""}, {""Title"": ""A PCA-based method for ancestral informative markers selection in structured populations"", ""Url"": ""h""}, {""Title"": ""HMGA2 Is Confirmed To Be Associated with Human Adult Height"", ""Url"": ""h""}, {""Title"": ""Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Joint influence of small-effect genetic variants on human longevity"", ""Url"": ""h""}, {""Title"": ""Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study"", ""Url"": ""h""}, {""Title"": ""Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\u00e2\u0080\u0099s disease risk loci and reveals interactions with APOE genotypes"", ""Url"": ""h""}, {""Title"": ""Beyond Missing Heritability: Prediction of Complex Traits"", ""Url"": ""h""}, {""Title"": ""Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests"", ""Url"": ""h""}, {""Title"": ""SNP array\u00e2\u0080\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes"", ""Url"": ""h""}, {""Title"": ""Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women"", ""Url"": ""h""}, {""Title"": ""IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study for Femoral Neck Bone Geometry"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study"", ""Url"": ""h""}, {""Title"": ""Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD"", ""Url"": ""h""}, {""Title"": ""Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts"", ""Url"": ""h""}, {""Title"": ""Atrial natriuretic peptide is negatively regulated by microRNA-425"", ""Url"": ""h""}, {""Title"": ""A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension"", ""Url"": ""h""}, {""Title"": ""Genome-wide Identification of microRNA Expression Quantitative Trait Loci"", ""Url"": ""h""}, {""Title"": ""Subgroup specific incremental value of new markers for risk prediction"", ""Url"": ""h""}, {""Title"": ""Gene Expression Signatures of Coronary Heart Disease"", ""Url"": ""h""}, {""Title"": ""Evaluating incremental values from new predictors with net reclassification improvement in survival analysis"", ""Url"": ""h""}, {""Title"": ""Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design"", ""Url"": ""h""}, {""Title"": ""Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9"", ""Url"": ""h""}, {""Title"": ""Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity"", ""Url"": ""h""}, {""Title"": ""Resampling Procedures for Making Inference under Nested Case-control Studies"", ""Url"": ""h""}, {""Title"": ""Adopting nested case\u00e2\u0080\u0093control quota sampling designs for the evaluation of risk markers"", ""Url"": ""h""}, {""Title"": ""Multistage genome-wide association meta-analyses identified two new loci for bone mineral density"", ""Url"": ""h""}, {""Title"": ""Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development"", ""Url"": ""h""}, {""Title"": ""Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates"", ""Url"": ""h""}, {""Title"": ""Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics"", ""Url"": ""h""}, {""Title"": ""The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets"", ""Url"": ""h""}, {""Title"": ""Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis"", ""Url"": ""h""}, {""Title"": ""FTO association and interaction with time spent sitting"", ""Url"": ""h""}, {""Title"": ""Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene"", ""Url"": ""h""}, {""Title"": ""Understanding multicellular function and disease with human tissue-specific networks"", ""Url"": ""h""}, {""Title"": ""Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants"", ""Url"": ""h""}, {""Title"": ""Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1"", ""Url"": ""h""}, {""Title"": ""GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium"", ""Url"": ""h""}, {""Title"": ""Identification of polymorphisms in cancer patients that differentially affect survival with age"", ""Url"": ""h""}, {""Title"": ""Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship"", ""Url"": ""h""}, {""Title"": ""Integrative network analysis reveals molecular mechanisms of blood pressure regulation"", ""Url"": ""h""}, {""Title"": ""Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes"", ""Url"": ""h""}, {""Title"": ""Diverse human extracellular RNAs are widely detected in human plasma"", ""Url"": ""h""}, {""Title"": ""An exome array study of the plasma metabolome"", ""Url"": ""h""}, {""Title"": ""Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors"", ""Url"": ""h""}, {""Title"": ""Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population"", ""Url"": ""h""}, {""Title"": ""Genetic architecture of gene expression traits across diverse populations"", ""Url"": ""h""}, {""Title"": ""Pathway-based analysis of genome-wide association study of circadian phenotypes"", ""Url"": ""h""}, {""Title"": ""Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function"", ""Url"": ""h""}, {""Title"": ""Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis"", ""Url"": ""h""}, {""Title"": ""Genome-wide analysis of genetic predisposition to Alzheimer\u00e2\u0080\u0099s disease and related sex disparities"", ""Url"": ""h""}, {""Title"": ""Independent associations of TOMM40 and APOE variants with body mass index"", ""Url"": ""h""}, {""Title"": ""Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries"", ""Url"": ""h""}, {""Title"": ""Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)"", ""Url"": ""h""}, {""Title"": ""Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes"", ""Url"": ""h""}, {""Title"": ""An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction"", ""Url"": ""h""}, {""Title"": ""Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density"", ""Url"": ""h""}, {""Title"": ""The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees"", ""Url"": ""h""}, {""Title"": ""Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups"", ""Url"": ""h""}, {""Title"": ""Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci"", ""Url"": ""h""}, {""Title"": ""Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\u00e2\u0080\u0099s Disease"", ""Url"": ""h""}, {""Title"": ""Integrative analysis of multiple diverse omics datasets by sparse group multitask regression"", ""Url"": ""h""}, {""Title"": ""Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs"", ""Url"": ""h""}, {""Title"": ""Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations"", ""Url"": ""h""}, {""Title"": ""Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders"", ""Url"": ""h""}, {""Title"": ""Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality"", ""Url"": ""h""}]" "[""Cardiovascular Diseases"", ""Disease, Cardiovascular"", ""Diseases, Cardiovascular"", ""Cardiovascular Disease""]" "\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\n\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\n\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\n\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\n\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\n\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\n\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the ""Variables"" tab above. \n\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \n\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\n" This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 "[""phs000007.v32.p13""]" "[""Cardiovascular Diseases"", ""Disease, Cardiovascular"", ""Diseases, Cardiovascular"", ""Cardiovascular Disease""]" 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""HMB-IRB-MDS"", ""HMB-IRB-NPU-MDS""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort +Cross-Sectional "[{""Title"": ""Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma"", ""Url"": ""h""}, {""Title"": ""Following the footprints of polymorphic inversions on SNP data: from detection to association tests"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma"", ""Url"": ""h""}, {""Title"": ""Measuring the Corticosteroid Responsiveness Endophenotype in Asthma"", ""Url"": ""h""}, {""Title"": ""African ancestry is associated with cluster-based childhood asthma subphenotypes"", ""Url"": ""h""}, {""Title"": ""The Pharmacogenetics and Pharmacogenomics of Asthma Therapy"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study of Short-Acting \u00c3\u009f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3"", ""Url"": ""h""}, {""Title"": ""Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children"", ""Url"": ""h""}, {""Title"": ""Identification of ATPAF1 as a novel candidate gene for asthma in children"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus"", ""Url"": ""h""}, {""Title"": ""Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids"", ""Url"": ""h""}, {""Title"": ""Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations"", ""Url"": ""h""}, {""Title"": ""A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity"", ""Url"": ""h""}, {""Title"": ""Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma"", ""Url"": ""h""}, {""Title"": ""FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA"", ""Url"": ""h""}]" \nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\n\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000166.v2.p1-all-subjects phs000166 "[""phs000166.v2.p1""]" 39 1 9 4046 1 4046 348 2009-09-09 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000166 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""ARR""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP) +Case-Control "[{""Title"": ""Telomerase mutations in smokers with severe emphysema"", ""Url"": ""h""}, {""Title"": ""Multi-scale Analysis of Imaging Features and Its Use in the Study of COPD Exacerbation Susceptible Phenotypes"", ""Url"": ""h""}, {""Title"": ""Schizophrenia copy number variants and associative learning"", ""Url"": ""h""}, {""Title"": ""Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution"", ""Url"": ""h""}, {""Title"": ""DSP variants may be associated with longitudinal change in quantitative emphysema"", ""Url"": ""h""}, {""Title"": ""Genetic Epidemiology of COPD (COPDGene) Study Design"", ""Url"": ""h""}, {""Title"": ""Hemizygous Deletion on Chromosome 3p26.1 Is Associated with Heavy Smoking among African American Subjects in the COPDGene Study"", ""Url"": ""h""}, {""Title"": ""Integrative Omics Approach Identifies Interleukin-16 as a Biomarker of Emphysema"", ""Url"": ""h""}, {""Title"": ""Common Genetic Variants Associated with Resting Oxygenation in Chronic Obstructive Pulmonary Disease"", ""Url"": ""h""}, {""Title"": ""A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity"", ""Url"": ""h""}, {""Title"": ""A genome-wide association study identifies risk loci for spirometric measures among smokers of European and African ancestry"", ""Url"": ""h""}, {""Title"": ""Automatic Synthesis of Anthropomorphic Pulmonary CT Phantoms"", ""Url"": ""h""}, {""Title"": ""Pulmonary Lobe Segmentation with Probabilistic Segmentation of the Fissures and a Groupwise Fissure Prior"", ""Url"": ""h""}, {""Title"": ""Clonal Evolution of Chemotherapy-resistant Urothelial Carcinoma"", ""Url"": ""h""}, {""Title"": ""NEK1 variants confer susceptibility to amyotrophic lateral sclerosis"", ""Url"": ""h""}, {""Title"": ""Genetic Pleiotropy between Nicotine Dependence and Respiratory Outcomes"", ""Url"": ""h""}, {""Title"": ""Manifold Learning of COPD"", ""Url"": ""h""}, {""Title"": ""Risk factors for COPD exacerbations in inhaled medication users: the COPDGene study biannual longitudinal follow-up prospective cohort"", ""Url"": ""h""}, {""Title"": ""Common Genetic Polymorphisms Influence Blood Biomarker Measurements in COPD"", ""Url"": ""h""}, {""Title"": ""Susceptibility to Childhood Pneumonia: A Genome-Wide Analysis"", ""Url"": ""h""}, {""Title"": ""Genetic loci associated with chronic obstructive pulmonary disease overlap with loci for lung function and pulmonary fibrosis"", ""Url"": ""h""}, {""Title"": ""Childhood asthma is associated with COPD and known asthma variants in COPDGene: a genome-wide association study"", ""Url"": ""h""}, {""Title"": ""Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders"", ""Url"": ""h""}, {""Title"": ""Analysis of Intellectual Disability Copy Number Variants for Association With Schizophrenia"", ""Url"": ""h""}, {""Title"": ""An Adaptive Fisher\u00e2\u0080\u0099s Combination Method for Joint Analysis of Multiple Phenotypes in Association Studies"", ""Url"": ""h""}]" "[""Pulmonary Disease, Chronic Obstructive"", ""Airflow Obstruction, Chronic"", ""Airflow Obstructions, Chronic"", ""COAD"", ""COPD"", ""Chronic Airflow Obstructions"", ""Chronic Obstructive Lung Disease"", ""Chronic Obstructive Pulmonary Disease"", ""Pulmonary Disease, Chronic Obstructive"", ""COPD""]" "\nChronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. **The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease.** The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity.\n\n**The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies.** To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this top-level study page phs000179 COPDGene_v6 Cohort. - [phs000296](./study.cgi?study_id=phs000296) ESP LungGO COPDGene - [phs000765](./study.cgi?study_id=phs000765) COPDGene_Geno \n" This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000179.v6.p2-all-subjects Pulmonary Disease, Chronic Obstructive phs000179 "[""phs000179.v6.p2""]" "[""Pulmonary Disease, Chronic Obstructive"", ""Airflow Obstruction, Chronic"", ""Airflow Obstructions, Chronic"", ""COAD"", ""COPD"", ""Chronic Airflow Obstructions"", ""Chronic Obstructive Lung Disease"", ""Chronic Obstructive Pulmonary Disease"", ""Pulmonary Disease, Chronic Obstructive"", ""COPD""]" 4 16 5 4 11951 2 10371 341 2019-05-03 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000179 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""HMB"", ""DS-CS""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 Genetic Epidemiology of COPD (COPDGene) diff --git a/tests/merge_manifests/discovery_combine/metadata_file_exact_match.tsv b/tests/merge_manifests/discovery_combine/metadata_file_exact_match.tsv new file mode 100644 index 000000000..5b9e29036 --- /dev/null +++ b/tests/merge_manifests/discovery_combine/metadata_file_exact_match.tsv @@ -0,0 +1,4 @@ +guid_exact_match Category Citers Condition Description Disclaimer Enrollment Focus Id Identifier Keyword NumAnalyses NumDocuments NumMolecularDatasets NumPhenotypeDatasets NumSamples NumSubStudies NumSubjects NumVariables ReleaseDate ResearchStudyURL ResourceType Sponsor Status StudyConsents StudyOverviewUrl Title +phs000007.v31.p12.c1 Prospective Longitudinal Cohort "[{""Title"": ""Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk"", ""Url"": ""h""}, {""Title"": ""The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity"", ""Url"": ""h""}, {""Title"": ""Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort"", ""Url"": ""h""}, {""Title"": ""Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1"", ""Url"": ""h""}, {""Title"": ""Evaluating prognostic accuracy of biomarkers in nested case\u00e2\u0080\u0093control studies"", ""Url"": ""h""}, {""Title"": ""Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations"", ""Url"": ""h""}, {""Title"": ""Evaluating the Evidence for Transmission Distortion in Human Pedigrees"", ""Url"": ""h""}, {""Title"": ""Knowledge-Driven Analysis Identifies a Gene\u00e2\u0080\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations"", ""Url"": ""h""}, {""Title"": ""Family-Based Association Studies for Next-Generation Sequencing"", ""Url"": ""h""}, {""Title"": ""Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study"", ""Url"": ""h""}, {""Title"": ""Prediction of Expected Years of Life Using Whole-Genome Markers"", ""Url"": ""h""}, {""Title"": ""Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality"", ""Url"": ""h""}, {""Title"": ""How Genes Influence Life Span: The Biodemography of Human Survival"", ""Url"": ""h""}, {""Title"": ""d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes"", ""Url"": ""h""}, {""Title"": ""Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans"", ""Url"": ""h""}, {""Title"": ""Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study"", ""Url"": ""h""}, {""Title"": ""Obesity\u00e2\u0080\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice"", ""Url"": ""h""}, {""Title"": ""Genomics of human health and aging"", ""Url"": ""h""}, {""Title"": ""Inter-chromosomal level of genome organization and longevity-related phenotypes in humans"", ""Url"": ""h""}, {""Title"": ""The role of lipid-related genes, aging-related processes, and environment in healthspan"", ""Url"": ""h""}, {""Title"": ""A family-based joint test for mean and variance heterogeneity for quantitative traits"", ""Url"": ""h""}, {""Title"": ""A Systematic Heritability Analysis of the Human Whole Blood Transcriptome"", ""Url"": ""h""}, {""Title"": ""Assessment of Whole-Genome Regression for Type II Diabetes"", ""Url"": ""h""}, {""Title"": ""Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease"", ""Url"": ""h""}, {""Title"": ""The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits"", ""Url"": ""h""}, {""Title"": ""Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes"", ""Url"": ""h""}, {""Title"": ""Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies"", ""Url"": ""h""}, {""Title"": ""Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease"", ""Url"": ""h""}, {""Title"": ""Genomic prediction of coronary heart disease"", ""Url"": ""h""}, {""Title"": ""KLB is associated with alcohol drinking, and its gene product \u00c3\u009f-Klotho is necessary for FGF21 regulation of alcohol preference"", ""Url"": ""h""}, {""Title"": ""Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits"", ""Url"": ""h""}, {""Title"": ""Using information of relatives in genomic prediction to apply effective stratified medicine"", ""Url"": ""h""}, {""Title"": ""Metabolomic profiles as reliable biomarkers of dietary composition"", ""Url"": ""h""}, {""Title"": ""Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes"", ""Url"": ""h""}, {""Title"": ""Structural variants caused by Alu insertions are associated with risks for many human diseases"", ""Url"": ""h""}, {""Title"": ""An Exploration of Gene-Gene Interactions and Their Effects on Hypertension"", ""Url"": ""h""}, {""Title"": ""Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits"", ""Url"": ""h""}, {""Title"": ""Cytosolic proteome profiling of monocytes for male osteoporosis"", ""Url"": ""h""}, {""Title"": ""Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets"", ""Url"": ""h""}, {""Title"": ""Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis"", ""Url"": ""h""}, {""Title"": ""Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution"", ""Url"": ""h""}, {""Title"": ""rqt: an R package for gene-level meta-analysis"", ""Url"": ""h""}, {""Title"": ""Strong impact of natural-selection\u00e2\u0080\u0093free heterogeneity in genetics of age-related phenotypes"", ""Url"": ""h""}, {""Title"": ""Apolipoprotein E region molecular signatures of Alzheimer's disease"", ""Url"": ""h""}, {""Title"": ""The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study"", ""Url"": ""h""}, {""Title"": ""Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms"", ""Url"": ""h""}, {""Title"": ""Genetic heterogeneity of Alzheimer\u00e2\u0080\u0099s disease in subjects with and without hypertension"", ""Url"": ""h""}, {""Title"": ""The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports"", ""Url"": ""h""}, {""Title"": ""A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Final Draft Status of the Epidemiology of Atrial Fibrillation"", ""Url"": ""h""}, {""Title"": ""Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study"", ""Url"": ""h""}, {""Title"": ""SLEEP MEDICINE NEWS AND UPDATES"", ""Url"": ""h""}, {""Title"": ""Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study"", ""Url"": ""h""}, {""Title"": ""Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index"", ""Url"": ""h""}, {""Title"": ""GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA"", ""Url"": ""h""}, {""Title"": ""A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project"", ""Url"": ""h""}, {""Title"": ""Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009"", ""Url"": ""h""}, {""Title"": ""Current Perceptions of the Epidemiology of Atrial Fibrillation"", ""Url"": ""h""}, {""Title"": ""Consent for Genetic Research in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women"", ""Url"": ""h""}, {""Title"": ""Genetics of the Framingham Heart Study Population"", ""Url"": ""h""}, {""Title"": ""Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience"", ""Url"": ""h""}, {""Title"": ""Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?"", ""Url"": ""h""}, {""Title"": ""Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years"", ""Url"": ""h""}, {""Title"": ""Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Heritability of pulmonary function estimated from pedigree and whole-genome markers"", ""Url"": ""h""}, {""Title"": ""Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction"", ""Url"": ""h""}, {""Title"": ""Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations"", ""Url"": ""h""}, {""Title"": ""Phenotypic extremes in rare variant study designs"", ""Url"": ""h""}, {""Title"": ""Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology"", ""Url"": ""h""}, {""Title"": ""Genome-wide association study of subclinical interstitial lung disease in MESA"", ""Url"": ""h""}, {""Title"": ""Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models"", ""Url"": ""h""}, {""Title"": ""A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking"", ""Url"": ""h""}, {""Title"": ""Protein Biomarkers of Cardiovascular Disease and Mortality in the Community"", ""Url"": ""h""}, {""Title"": ""Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes"", ""Url"": ""h""}, {""Title"": ""Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\u00e2\u0080\u0094The Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Evaluating the Evidence for Transmission Distortion in Human Pedigrees"", ""Url"": ""h""}, {""Title"": ""Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis"", ""Url"": ""h""}, {""Title"": ""Whole-genome association study identifies STK39 as a hypertension susceptibility gene"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15"", ""Url"": ""h""}, {""Title"": ""Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males"", ""Url"": ""h""}, {""Title"": ""Genetic Analysis of Variation in Human Meiotic Recombination"", ""Url"": ""h""}, {""Title"": ""Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway"", ""Url"": ""h""}, {""Title"": ""New Lesions Detected by Single Nucleotide Polymorphism Array\u00e2\u0080\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia"", ""Url"": ""h""}, {""Title"": ""ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis"", ""Url"": ""h""}, {""Title"": ""Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study"", ""Url"": ""h""}, {""Title"": ""Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry"", ""Url"": ""h""}, {""Title"": ""GWAF: an R package for genome-wide association analyses with family data"", ""Url"": ""h""}, {""Title"": ""Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data"", ""Url"": ""h""}, {""Title"": ""Natural selection in a contemporary human population"", ""Url"": ""h""}, {""Title"": ""Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology"", ""Url"": ""h""}, {""Title"": ""Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height"", ""Url"": ""h""}, {""Title"": ""A PCA-based method for ancestral informative markers selection in structured populations"", ""Url"": ""h""}, {""Title"": ""HMGA2 Is Confirmed To Be Associated with Human Adult Height"", ""Url"": ""h""}, {""Title"": ""Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies"", ""Url"": ""h""}, {""Title"": ""Joint influence of small-effect genetic variants on human longevity"", ""Url"": ""h""}, {""Title"": ""Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study"", ""Url"": ""h""}, {""Title"": ""Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\u00e2\u0080\u0099s disease risk loci and reveals interactions with APOE genotypes"", ""Url"": ""h""}, {""Title"": ""Beyond Missing Heritability: Prediction of Complex Traits"", ""Url"": ""h""}, {""Title"": ""Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests"", ""Url"": ""h""}, {""Title"": ""SNP array\u00e2\u0080\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes"", ""Url"": ""h""}, {""Title"": ""Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women"", ""Url"": ""h""}, {""Title"": ""IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study for Femoral Neck Bone Geometry"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study"", ""Url"": ""h""}, {""Title"": ""Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD"", ""Url"": ""h""}, {""Title"": ""Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts"", ""Url"": ""h""}, {""Title"": ""Atrial natriuretic peptide is negatively regulated by microRNA-425"", ""Url"": ""h""}, {""Title"": ""A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension"", ""Url"": ""h""}, {""Title"": ""Genome-wide Identification of microRNA Expression Quantitative Trait Loci"", ""Url"": ""h""}, {""Title"": ""Subgroup specific incremental value of new markers for risk prediction"", ""Url"": ""h""}, {""Title"": ""Gene Expression Signatures of Coronary Heart Disease"", ""Url"": ""h""}, {""Title"": ""Evaluating incremental values from new predictors with net reclassification improvement in survival analysis"", ""Url"": ""h""}, {""Title"": ""Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design"", ""Url"": ""h""}, {""Title"": ""Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study"", ""Url"": ""h""}, {""Title"": ""Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9"", ""Url"": ""h""}, {""Title"": ""Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity"", ""Url"": ""h""}, {""Title"": ""Resampling Procedures for Making Inference under Nested Case-control Studies"", ""Url"": ""h""}, {""Title"": ""Adopting nested case\u00e2\u0080\u0093control quota sampling designs for the evaluation of risk markers"", ""Url"": ""h""}, {""Title"": ""Multistage genome-wide association meta-analyses identified two new loci for bone mineral density"", ""Url"": ""h""}, {""Title"": ""Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development"", ""Url"": ""h""}, {""Title"": ""Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates"", ""Url"": ""h""}, {""Title"": ""Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics"", ""Url"": ""h""}, {""Title"": ""The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets"", ""Url"": ""h""}, {""Title"": ""Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis"", ""Url"": ""h""}, {""Title"": ""FTO association and interaction with time spent sitting"", ""Url"": ""h""}, {""Title"": ""Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene"", ""Url"": ""h""}, {""Title"": ""Understanding multicellular function and disease with human tissue-specific networks"", ""Url"": ""h""}, {""Title"": ""Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants"", ""Url"": ""h""}, {""Title"": ""Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1"", ""Url"": ""h""}, {""Title"": ""GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium"", ""Url"": ""h""}, {""Title"": ""Identification of polymorphisms in cancer patients that differentially affect survival with age"", ""Url"": ""h""}, {""Title"": ""Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship"", ""Url"": ""h""}, {""Title"": ""Integrative network analysis reveals molecular mechanisms of blood pressure regulation"", ""Url"": ""h""}, {""Title"": ""Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes"", ""Url"": ""h""}, {""Title"": ""Diverse human extracellular RNAs are widely detected in human plasma"", ""Url"": ""h""}, {""Title"": ""An exome array study of the plasma metabolome"", ""Url"": ""h""}, {""Title"": ""Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors"", ""Url"": ""h""}, {""Title"": ""Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population"", ""Url"": ""h""}, {""Title"": ""Genetic architecture of gene expression traits across diverse populations"", ""Url"": ""h""}, {""Title"": ""Pathway-based analysis of genome-wide association study of circadian phenotypes"", ""Url"": ""h""}, {""Title"": ""Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function"", ""Url"": ""h""}, {""Title"": ""Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis"", ""Url"": ""h""}, {""Title"": ""Genome-wide analysis of genetic predisposition to Alzheimer\u00e2\u0080\u0099s disease and related sex disparities"", ""Url"": ""h""}, {""Title"": ""Independent associations of TOMM40 and APOE variants with body mass index"", ""Url"": ""h""}, {""Title"": ""Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries"", ""Url"": ""h""}, {""Title"": ""Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)"", ""Url"": ""h""}, {""Title"": ""Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes"", ""Url"": ""h""}, {""Title"": ""An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction"", ""Url"": ""h""}, {""Title"": ""Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density"", ""Url"": ""h""}, {""Title"": ""The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees"", ""Url"": ""h""}, {""Title"": ""Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups"", ""Url"": ""h""}, {""Title"": ""Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci"", ""Url"": ""h""}, {""Title"": ""Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\u00e2\u0080\u0099s Disease"", ""Url"": ""h""}, {""Title"": ""Integrative analysis of multiple diverse omics datasets by sparse group multitask regression"", ""Url"": ""h""}, {""Title"": ""Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs"", ""Url"": ""h""}, {""Title"": ""Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations"", ""Url"": ""h""}, {""Title"": ""Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders"", ""Url"": ""h""}, {""Title"": ""Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases"", ""Url"": ""h""}, {""Title"": ""Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality"", ""Url"": ""h""}]" "[""Cardiovascular Diseases"", ""Disease, Cardiovascular"", ""Diseases, Cardiovascular"", ""Cardiovascular Disease""]" "\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\n\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\n\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\n\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\n\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\n\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\n\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the ""Variables"" tab above. \n\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the ""Substudies"" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \n\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\n" This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 "[""phs000007.v32.p13""]" "[""Cardiovascular Diseases"", ""Disease, Cardiovascular"", ""Diseases, Cardiovascular"", ""Cardiovascular Disease""]" 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""HMB-IRB-MDS"", ""HMB-IRB-NPU-MDS""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort +phs000166.v2.p1.c1 Cross-Sectional "[{""Title"": ""Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma"", ""Url"": ""h""}, {""Title"": ""Following the footprints of polymorphic inversions on SNP data: from detection to association tests"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma"", ""Url"": ""h""}, {""Title"": ""Measuring the Corticosteroid Responsiveness Endophenotype in Asthma"", ""Url"": ""h""}, {""Title"": ""African ancestry is associated with cluster-based childhood asthma subphenotypes"", ""Url"": ""h""}, {""Title"": ""The Pharmacogenetics and Pharmacogenomics of Asthma Therapy"", ""Url"": ""h""}, {""Title"": ""Genome-Wide Association Study of Short-Acting \u00c3\u009f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3"", ""Url"": ""h""}, {""Title"": ""Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children"", ""Url"": ""h""}, {""Title"": ""Identification of ATPAF1 as a novel candidate gene for asthma in children"", ""Url"": ""h""}, {""Title"": ""Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus"", ""Url"": ""h""}, {""Title"": ""Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids"", ""Url"": ""h""}, {""Title"": ""Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations"", ""Url"": ""h""}, {""Title"": ""A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity"", ""Url"": ""h""}, {""Title"": ""Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma"", ""Url"": ""h""}, {""Title"": ""FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA"", ""Url"": ""h""}]" \nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\n\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000166.v2.p1-all-subjects phs000166 "[""phs000166.v2.p1""]" 39 1 9 4046 1 4046 348 2009-09-09 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000166 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""ARR""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP) +phs000179.v6.p2.c2 Case-Control "[{""Title"": ""Telomerase mutations in smokers with severe emphysema"", ""Url"": ""h""}, {""Title"": ""Multi-scale Analysis of Imaging Features and Its Use in the Study of COPD Exacerbation Susceptible Phenotypes"", ""Url"": ""h""}, {""Title"": ""Schizophrenia copy number variants and associative learning"", ""Url"": ""h""}, {""Title"": ""Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution"", ""Url"": ""h""}, {""Title"": ""DSP variants may be associated with longitudinal change in quantitative emphysema"", ""Url"": ""h""}, {""Title"": ""Genetic Epidemiology of COPD (COPDGene) Study Design"", ""Url"": ""h""}, {""Title"": ""Hemizygous Deletion on Chromosome 3p26.1 Is Associated with Heavy Smoking among African American Subjects in the COPDGene Study"", ""Url"": ""h""}, {""Title"": ""Integrative Omics Approach Identifies Interleukin-16 as a Biomarker of Emphysema"", ""Url"": ""h""}, {""Title"": ""Common Genetic Variants Associated with Resting Oxygenation in Chronic Obstructive Pulmonary Disease"", ""Url"": ""h""}, {""Title"": ""A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity"", ""Url"": ""h""}, {""Title"": ""A genome-wide association study identifies risk loci for spirometric measures among smokers of European and African ancestry"", ""Url"": ""h""}, {""Title"": ""Automatic Synthesis of Anthropomorphic Pulmonary CT Phantoms"", ""Url"": ""h""}, {""Title"": ""Pulmonary Lobe Segmentation with Probabilistic Segmentation of the Fissures and a Groupwise Fissure Prior"", ""Url"": ""h""}, {""Title"": ""Clonal Evolution of Chemotherapy-resistant Urothelial Carcinoma"", ""Url"": ""h""}, {""Title"": ""NEK1 variants confer susceptibility to amyotrophic lateral sclerosis"", ""Url"": ""h""}, {""Title"": ""Genetic Pleiotropy between Nicotine Dependence and Respiratory Outcomes"", ""Url"": ""h""}, {""Title"": ""Manifold Learning of COPD"", ""Url"": ""h""}, {""Title"": ""Risk factors for COPD exacerbations in inhaled medication users: the COPDGene study biannual longitudinal follow-up prospective cohort"", ""Url"": ""h""}, {""Title"": ""Common Genetic Polymorphisms Influence Blood Biomarker Measurements in COPD"", ""Url"": ""h""}, {""Title"": ""Susceptibility to Childhood Pneumonia: A Genome-Wide Analysis"", ""Url"": ""h""}, {""Title"": ""Genetic loci associated with chronic obstructive pulmonary disease overlap with loci for lung function and pulmonary fibrosis"", ""Url"": ""h""}, {""Title"": ""Childhood asthma is associated with COPD and known asthma variants in COPDGene: a genome-wide association study"", ""Url"": ""h""}, {""Title"": ""Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders"", ""Url"": ""h""}, {""Title"": ""Analysis of Intellectual Disability Copy Number Variants for Association With Schizophrenia"", ""Url"": ""h""}, {""Title"": ""An Adaptive Fisher\u00e2\u0080\u0099s Combination Method for Joint Analysis of Multiple Phenotypes in Association Studies"", ""Url"": ""h""}]" "[""Pulmonary Disease, Chronic Obstructive"", ""Airflow Obstruction, Chronic"", ""Airflow Obstructions, Chronic"", ""COAD"", ""COPD"", ""Chronic Airflow Obstructions"", ""Chronic Obstructive Lung Disease"", ""Chronic Obstructive Pulmonary Disease"", ""Pulmonary Disease, Chronic Obstructive"", ""COPD""]" "\nChronic obstructive pulmonary disease (COPD) is the fourth leading cause of death in the United States and the only leading cause of death that is steadily increasing in frequency. This project will establish a racially diverse cohort that is sufficiently large and appropriately designed for genome-wide association analysis of COPD. A total of 10,000 subjects will be recruited, including control smokers, definite COPD cases (GOLD Stage 2 to 4), and subjects not included in either group (GOLD 1 or GOLD-Unclassified). This cohort will be used for cross-sectional analysis, although long-term longitudinal follow-up will be a future goal. The primary focus of the study will be genome-wide association analysis to identify the genetic risk factors that determine susceptibility for COPD and COPD-related phenotypes. Detailed phenotyping of both cases and controls, including chest CT scan assessment of emphysema and airway disease, will allow identification of genetic determinants for the heterogeneous components of the COPD syndrome. **The hypotheses to be studied are: 1) Precise phenotypic characterization of COPD subjects using computed tomography, as well as clinical and physiological measures, will provide data that will enable the broad COPD syndrome to be decomposed into clinically significant subtypes. 2) Genome-wide association studies will identify genetic determinants for COPD susceptibility that will provide insight into clinically relevant COPD subtypes. 3) Distinct genetic determinants influence the development of emphysema and airway disease.** The initial phase of genome-wide association analysis included 500 COPD cases and 500 control subjects (all non-Hispanic White) genotyped with the Illumina Omni-1 chip. The second phase genotyped the entire study cohort using the Illumina Omni-Express chip. Unique aspects of the study include: 1) Inclusion of large numbers of African American subjects (approximately 1/3 of the cohort); 2) Obtaining chest CT scans (including inspiratory and expiratory images); and 3) Inclusion of the full range of disease severity.\n\n**The COPDGene_v6 Cohort is utilized in the following dbGaP sub-studies.** To view genotypes, other molecular data, and derived variables collected in these sub-studies, please click on the following sub-studies below or in the ""Sub-studies"" section of this top-level study page phs000179 COPDGene_v6 Cohort. - [phs000296](./study.cgi?study_id=phs000296) ESP LungGO COPDGene - [phs000765](./study.cgi?study_id=phs000765) COPDGene_Geno \n" This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000179.v6.p2-all-subjects Pulmonary Disease, Chronic Obstructive phs000179 "[""phs000179.v6.p2""]" "[""Pulmonary Disease, Chronic Obstructive"", ""Airflow Obstruction, Chronic"", ""Airflow Obstructions, Chronic"", ""COAD"", ""COPD"", ""Chronic Airflow Obstructions"", ""Chronic Obstructive Lung Disease"", ""Chronic Obstructive Pulmonary Disease"", ""Pulmonary Disease, Chronic Obstructive"", ""COPD""]" 4 16 5 4 11951 2 10371 341 2019-05-03 https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/ResearchStudy/phs000179 ResearchStudy National Heart, Lung, and Blood Institute completed "[""NRUP"", ""HMB"", ""DS-CS""]" https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000179.v6.p2 Genetic Epidemiology of COPD (COPDGene) diff --git a/tests/test_auth.py b/tests/test_auth.py index a6ba82440..5a560c482 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -517,3 +517,40 @@ def _mock_request(url, **kwargs): if os.path.isfile(test_cred_file_name): os.remove(test_cred_file_name) + + +def test_auth_init_with_client_credentials(): + """ + Test that a Gen3Auth instance can be initialized with client credentials and an endpoint. + """ + client_id = "id" + client_secret = "secret" + + def _mock_request(url, **kwargs): + mocked_response = MagicMock(requests.Response) + if "/user/oauth2/token" in url: + mocked_response.status_code = 200 + mocked_response.json.return_value = test_access_token + return mocked_response + + with patch("gen3.auth.requests.post") as mock_request_post: + mock_request_post.side_effect = _mock_request + auth = gen3.auth.Gen3Auth( + endpoint=test_endpoint, client_credentials=(client_id, client_secret) + ) + + assert auth.endpoint == test_endpoint + assert auth._client_credentials == (client_id, client_secret) + assert auth._client_scopes == "user data openid" + assert auth._use_wts == False + assert auth._access_token == test_access_token["access_token"] + + +def test_auth_init_with_client_credentials_no_endpoint(): + """ + Test that a Gen3Auth instance CANNOT be initialized with client credentials and NO endpoint. + """ + client_id = "id" + client_secret = "secret" + with pytest.raises(ValueError, match="'endpoint' must be specified"): + gen3.auth.Gen3Auth(client_credentials=(client_id, client_secret)) diff --git a/tests/test_configure.py b/tests/test_configure.py index beb92f317..ac2fab155 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -65,7 +65,7 @@ def test_update_config_lines(test_lines, monkeypatch): monkeypatch.setattr(config_tool, "CONFIG_FILE_PATH", file_name) try: config_tool.update_config_lines(test_lines, expected_profile_line, new_lines) - with (open(file_name, "r")) as f: + with open(file_name, "r") as f: assert f.readlines() == [expected_profile_line] + new_lines finally: if os.path.exists(file_name): diff --git a/tests/test_crosswalk.py b/tests/test_crosswalk.py index b5c09fe81..04cdb822a 100644 --- a/tests/test_crosswalk.py +++ b/tests/test_crosswalk.py @@ -104,7 +104,7 @@ def test_publish_multiple_crosswalks( guid_3 = "33333333-aac4-11ed-861d-0242ac120002" guid_4 = "44444444-aac4-11ed-861d-0242ac120002" - async def mock_async_update_metadata(guid, metadata, *_, **__): + async def mock_async_update_metadata(guid, metadata, *args, **kwargs): assert metadata["_guid_type"] == GUID_TYPE crosswalk_metadata = metadata[CROSSWALK_NAMESPACE] @@ -139,6 +139,11 @@ async def mock_async_get_metadata(guid, *_, **__): assert get_valid_guids_patch.called assert create_metadata_patch.called + # ensure the correct aliases were requested + assert sorted(["A01-00888", "phs002363.v1_RC-1358"]) == sorted( + create_metadata_patch.call_args.kwargs.get("aliases") + ) + async def mock_async_get_metadata(guid, *_, **__): return { "_guid_type": GUID_TYPE, @@ -167,6 +172,11 @@ async def mock_async_get_metadata(guid, *_, **__): assert get_valid_guids_patch.called assert update_metadata_patch.called + # ensure the correct aliases were requested + assert sorted(["A01-00888", "foobar", "123dfj4ia5oi*@a"]) == sorted( + update_metadata_patch.call_args.kwargs.get("aliases") + ) + @patch("gen3.metadata.Gen3Metadata.async_update") @patch("gen3.index.Gen3Index.get_valid_guids") @@ -220,6 +230,11 @@ async def mock_async_get_metadata(guid, *_, **__): assert get_valid_guids_patch.called assert create_metadata_patch.called + # ensure the correct aliases were requested + assert sorted( + ["foobar", "A01-00888", "123dfj4ia5oi*@a", "phs002363.v1_RC-1358"] + ) == sorted(create_metadata_patch.call_args.kwargs.get("aliases")) + @pytest.mark.parametrize( "file,info", diff --git a/tests/test_data/diff_manifests/manifest3.tsv b/tests/test_data/diff_manifests/manifest3.tsv new file mode 100644 index 000000000..f72816ac7 --- /dev/null +++ b/tests/test_data/diff_manifests/manifest3.tsv @@ -0,0 +1,4 @@ +guid md5 size authz url +255e396f-f1f8-11e9-9a07-0a80fada096c 473d83400bc1bc9dc635e334fadd133c 363455714 ['phs0001', 'phs0002'] ['s3://pdcdatastore/test4.raw'] +255e396f-f1f8-11e9-9a07-0a80fada010c 473d83400bc1bc9dc635e334fadde33c 363455714 ['Open'] ['s3://pdcdatastore/test5.raw'] +255e396f-f1f8-11e9-9a07-0a80fada012c 473d83400bc1bc9dc635e334fadde33c 363455714 ['Open'] ['s3://pdcdatastore/test6.raw'] diff --git a/tests/test_data/diff_manifests/manifest4.tsv b/tests/test_data/diff_manifests/manifest4.tsv new file mode 100644 index 000000000..bd76d8114 --- /dev/null +++ b/tests/test_data/diff_manifests/manifest4.tsv @@ -0,0 +1,4 @@ +guid md5 size authz url +255e396f-f1f8-11e9-9a07-0a80fada096c 473d83400bc1bc9dc635e334fadd133c 363455714 ['phs0002', 'phs0001'] ['s3://pdcdatastore/test4.raw'] +255e396f-f1f8-11e9-9a07-0a80fada010c 473d83400bc1bc9dc635e334fadde33c 363455714 ['Open'] ['s3://pdcdatastore/test4.raw'] +255e396f-f1f8-11e9-9a07-0a80fada012c 473d83400bc1bc9dc635e334fadde33c 363455715 ['Open'] ['s3://pdcdatastore/test6.raw'] diff --git a/tests/test_data/fhir_metadata.tsv b/tests/test_data/fhir_metadata.tsv new file mode 100644 index 000000000..f9b513ffd --- /dev/null +++ b/tests/test_data/fhir_metadata.tsv @@ -0,0 +1,3 @@ +Category Citers Condition Description Disclaimer Enrollment Focus Id Identifier Keyword NumAnalyses NumDocuments NumMolecularDatasets NumPhenotypeDatasets NumSamples NumSubStudies NumSubjects NumVariables ReleaseDate ResearchStudyURL ResourceType Sponsor Status StudyConsents StudyOverviewUrl Title +Prospective Longitudinal Cohort [{"Title": "Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Evaluating prognostic accuracy of biomarkers in nested case\\u00e2\\u0080\\u0093control studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Knowledge-Driven Analysis Identifies a Gene\\u00e2\\u0080\\u0093Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Family-Based Association Studies for Next-Generation Sequencing", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Prediction of Expected Years of Life Using Whole-Genome Markers", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "How Genes Influence Life Span: The Biodemography of Human Survival", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Obesity\\u00e2\\u0080\\u0093insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genomics of human health and aging", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Inter-chromosomal level of genome organization and longevity-related phenotypes in humans", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The role of lipid-related genes, aging-related processes, and environment in healthspan", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A family-based joint test for mean and variance heterogeneity for quantitative traits", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A Systematic Heritability Analysis of the Human Whole Blood Transcriptome", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Assessment of Whole-Genome Regression for Type II Diabetes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genomic prediction of coronary heart disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "KLB is associated with alcohol drinking, and its gene product \\u00c3\\u009f-Klotho is necessary for FGF21 regulation of alcohol preference", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Using information of relatives in genomic prediction to apply effective stratified medicine", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Metabolomic profiles as reliable biomarkers of dietary composition", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Structural variants caused by Alu insertions are associated with risks for many human diseases", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "An Exploration of Gene-Gene Interactions and Their Effects on Hypertension", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Cytosolic proteome profiling of monocytes for male osteoporosis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "rqt: an R package for gene-level meta-analysis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Strong impact of natural-selection\\u00e2\\u0080\\u0093free heterogeneity in genetics of age-related phenotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Apolipoprotein E region molecular signatures of Alzheimer's disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetic heterogeneity of Alzheimer\\u00e2\\u0080\\u0099s disease in subjects with and without hypertension", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Final Draft Status of the Epidemiology of Atrial Fibrillation", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "SLEEP MEDICINE NEWS AND UPDATES", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Current Perceptions of the Epidemiology of Atrial Fibrillation", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Consent for Genetic Research in the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetics of the Framingham Heart Study Population", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Heritability of pulmonary function estimated from pedigree and whole-genome markers", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Phenotypic extremes in rare variant study designs", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide association study of subclinical interstitial lung disease in MESA", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Protein Biomarkers of Cardiovascular Disease and Mortality in the Community", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenase\\u00e2\\u0080\\u0094The Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Whole-genome association study identifies STK39 as a hypertension susceptibility gene", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetic Analysis of Variation in Human Meiotic Recombination", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "New Lesions Detected by Single Nucleotide Polymorphism Array\\u00e2\\u0080\\u0093Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "GWAF: an R package for genome-wide association analyses with family data", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Natural selection in a contemporary human population", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A PCA-based method for ancestral informative markers selection in structured populations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "HMGA2 Is Confirmed To Be Associated with Human Adult Height", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Joint influence of small-effect genetic variants on human longevity", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimer\\u00e2\\u0080\\u0099s disease risk loci and reveals interactions with APOE genotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Beyond Missing Heritability: Prediction of Complex Traits", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "SNP array\\u00e2\\u0080\\u0093based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Association Study for Femoral Neck Bone Geometry", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Atrial natriuretic peptide is negatively regulated by microRNA-425", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Identification of microRNA Expression Quantitative Trait Loci", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Subgroup specific incremental value of new markers for risk prediction", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene Expression Signatures of Coronary Heart Disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Evaluating incremental values from new predictors with net reclassification improvement in survival analysis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Resampling Procedures for Making Inference under Nested Case-control Studies", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Adopting nested case\\u00e2\\u0080\\u0093control quota sampling designs for the evaluation of risk markers", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Multistage genome-wide association meta-analyses identified two new loci for bone mineral density", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "FTO association and interaction with time spent sitting", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Understanding multicellular function and disease with human tissue-specific networks", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Identification of polymorphisms in cancer patients that differentially affect survival with age", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Integrative network analysis reveals molecular mechanisms of blood pressure regulation", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Diverse human extracellular RNAs are widely detected in human plasma", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "An exome array study of the plasma metabolome", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetic architecture of gene expression traits across diverse populations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pathway-based analysis of genome-wide association study of circadian phenotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide analysis of genetic predisposition to Alzheimer\\u00e2\\u0080\\u0099s disease and related sex disparities", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Independent associations of TOMM40 and APOE variants with body mass index", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimer\\u00e2\\u0080\\u0099s Disease", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Integrative analysis of multiple diverse omics datasets by sparse group multitask regression", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] \\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\\n\\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\\n\\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\\n\\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\\n\\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\\n\\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\\n\\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. \\n\\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \\n\\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000007.v32.p13-all-subjects Cardiovascular Diseases phs000007 ["phs000007.v32.p13"] ["Cardiovascular Diseases", "Disease, Cardiovascular", "Diseases, Cardiovascular", "Cardiovascular Disease"] 3029 1493 28 462 51752 8 15144 80372 2020-12-22 https://example.com/fhir/x1/ResearchStudy/phs000007 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "HMB-IRB-MDS", "HMB-IRB-NPU-MDS"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13 Framingham Cohort +Cross-Sectional [{"Title": "Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Following the footprints of polymorphic inversions on SNP data: from detection to association tests", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Measuring the Corticosteroid Responsiveness Endophenotype in Asthma", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "African ancestry is associated with cluster-based childhood asthma subphenotypes", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "The Pharmacogenetics and Pharmacogenomics of Asthma Therapy", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-Wide Association Study of Short-Acting \\u00c3\\u009f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Identification of ATPAF1 as a novel candidate gene for asthma in children", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}, {"Title": "FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA", "Url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer"}] \\nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\\n\\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\\n This information was retrieved from dbGaP's FHIR API for discoverability purposes and may not contain fully up-to-date information. Please refer to the official dbGaP FHIR server for up-to-date FHIR data. Group/phs000166.v2.p1-all-subjects phs000166 ["phs000166.v2.p1"] 39 1 9 4046 1 4046 348 2009-09-09 https://example.com/fhir/x1/ResearchStudy/phs000166 ResearchStudy National Heart, Lung, and Blood Institute completed ["NRUP", "ARR"] https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1 SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP) diff --git a/tests/test_data/manifest1.csv b/tests/test_data/manifest1.csv new file mode 100644 index 000000000..7d8660e07 --- /dev/null +++ b/tests/test_data/manifest1.csv @@ -0,0 +1,4 @@ +guid,md5,size,authz,url +255e396f-f1f8-11e9-9a07-0a80fada099c,473d83400bc1bc9dc635e334faddf33c,363455714,['Open'],['s3://pdcdatastore/test1.raw'] +255e396f-f1f8-11e9-9a07-0a80fada098c,473d83400bc1bc9dc635e334faddd33c,343434344,['Open'],['s3://pdcdatastore/test2.raw'] +255e396f-f1f8-11e9-9a07-0a80fada097c,473d83400bc1bc9dc635e334fadd433c,543434443,"['phs0001', 'phs0002']",['s3://pdcdatastore/test3.raw'] diff --git a/tests/test_data/manifest2.csv b/tests/test_data/manifest2.csv new file mode 100644 index 000000000..66e339686 --- /dev/null +++ b/tests/test_data/manifest2.csv @@ -0,0 +1,4 @@ +guid,md5,size,authz,url +255e396f-f1f8-11e9-9a07-0a80fada099c,473d83400bc1bc9dc635e334faddf33d,363455714,['Open'],['s3://pdcdatastore/test1.raw'] +255e396f-f1f8-11e9-9a07-0a80fada098d,473d83400bc1bc9dc635e334faddd33c,343434344,['Open'],['s3://pdcdatastore/test2.raw'] +255e396f-f1f8-11e9-9a07-0a80fada097c,473d83400bc1bc9dc635e334fadd433c,543434443,['phs0001'],['s3://pdcdatastore/test3.raw'] diff --git a/tests/test_dbgap_fhir.py b/tests/test_dbgap_fhir.py new file mode 100644 index 000000000..fb75e40c9 --- /dev/null +++ b/tests/test_dbgap_fhir.py @@ -0,0 +1,159 @@ +""" +Tests gen3.nih +""" +import json +import os +import pytest +import sys + +import requests +from requests.auth import HTTPBasicAuth +from unittest.mock import MagicMock, patch + +try: + from gen3.external.nih.dbgap_fhir import dbgapFHIR +except ModuleNotFoundError as exc: + raise ModuleNotFoundError( + "Missing some modules for optional external API parsing. Ensure you've " + "installed all optional extras using `poetry install --all-extras`. " + f"Original error: {exc}" + ) +from tests.test_discovery import _get_tsv_data +from tests.utils_mock_fhir_response import ( + MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000007, + MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000166, +) + + +def test_dbgap_fhir(tmp_path): + """ + Test dbGaP FHIR parsing works and outputs expected fields and values. + + Note that the dbGaP FHIR response is mocked, but the response provided + is a real response from the dbGaP FHIR Server (to simulate current state). + + This does not integration test the dbGaP FHIR server. In other words, + if they change format and it would break our code, this will not catch that + (and it's not the intention to catch that here). This is intended to unit + test our code to ensure we don't break specifically our parsing in the future. + """ + dbgap_fhir = dbgapFHIR( + api="https://example.com/fhir/x1", + auth_provider=HTTPBasicAuth("DATACITE_USERNAME", "DATACITE_PASSWORD"), + ) + + def _mock_request(path, **kwargs): + assert "ResearchStudy" in path + + output = None + + if path == "ResearchStudy/phs000007": + output = MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000007 + elif path == "ResearchStudy/phs000166": + output = MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000166 + else: + # should have requested these studies from the API, + # if it didn't, something went wrong + assert path in ["ResearchStudy/phs000007", "ResearchStudy/phs000166"] + + return output + + dbgap_fhir.fhir_client.server.request_json = MagicMock(side_effect=_mock_request) + + phsids = [ + "phs000007.v1.p1.c1", + "phs000166.c3", + ] + + metadata = dbgap_fhir.get_metadata_for_ids(phsids) + + assert metadata + + assert "phs000007.v1.p1.c1" in metadata + assert "phs000166.c3" in metadata + + expected_phs000007_keys = [ + "StudyOverviewUrl", + "ReleaseDate", + "StudyConsents", + "Citers", + "NumPhenotypeDatasets", + "NumMolecularDatasets", + "NumVariables", + "NumDocuments", + "NumAnalyses", + "NumSubjects", + "NumSamples", + "NumSubStudies", + "Id", + "Category", + "Condition", + "Description", + "Enrollment", + "Focus", + "Identifier", + "Keyword", + "Sponsor", + "Status", + "Title", + "ResourceType", + ] + + expected_phs000166_keys = [ + "StudyOverviewUrl", + "ReleaseDate", + "StudyConsents", + "Citers", + "NumPhenotypeDatasets", + "NumMolecularDatasets", + "NumVariables", + "NumDocuments", + "NumSubjects", + "NumSamples", + "NumSubStudies", + "Id", + "Category", + "Description", + "Enrollment", + "Identifier", + "Sponsor", + "Status", + "Title", + "ResourceType", + ] + + for key in expected_phs000007_keys: + assert key in metadata["phs000007.v1.p1.c1"] + + for key in expected_phs000166_keys: + assert key in metadata["phs000166.c3"] + + # check a few values to ensure correct parsing and representation as string + assert metadata["phs000007.v1.p1.c1"]["NumSubjects"] == "15144" + assert metadata["phs000166.c3"]["NumSubjects"] == "4046" + + assert metadata["phs000007.v1.p1.c1"]["Title"] == "Framingham Cohort" + assert type(metadata["phs000166.c3"]["Citers"]) == list + + # these should have been converted to a single string, not a list + for item in dbgap_fhir.suspected_single_item_list_fields: + capitalized_item = item[:1].upper() + item[1:] + if capitalized_item in metadata["phs000007.v1.p1.c1"]: + assert type(metadata["phs000007.v1.p1.c1"][capitalized_item]) != list + if capitalized_item in metadata["phs000166.c3"]: + assert type(metadata["phs000166.c3"][capitalized_item]) != list + + # ensure the custom fields got added + assert "ResearchStudyURL" in metadata["phs000007.v1.p1.c1"] + assert "phs000007" in metadata["phs000007.v1.p1.c1"]["ResearchStudyURL"] + assert "ResearchStudyURL" in metadata["phs000166.c3"] + assert "phs000166" in metadata["phs000166.c3"]["ResearchStudyURL"] + + assert "Disclaimer" in metadata["phs000007.v1.p1.c1"] + assert "Disclaimer" in metadata["phs000166.c3"] + + file_name = tmp_path / "fhir_metadata_file_TEST.tsv" + dbgapFHIR.write_data_to_file(metadata, file_name) + assert _get_tsv_data(file_name) == _get_tsv_data( + "tests/test_data/fhir_metadata.tsv" + ) diff --git a/tests/test_dbgap_study_registration.py b/tests/test_dbgap_study_registration.py new file mode 100644 index 000000000..5672abcc7 --- /dev/null +++ b/tests/test_dbgap_study_registration.py @@ -0,0 +1,175 @@ +from unittest.mock import patch, MagicMock + +import pytest +import requests + +from gen3.external.nih.dbgap_study_registration import dbgapStudyRegistration +from tests.utils_mock_dbgap_study_registration_response import ( + MOCK_PHS001173, + MOCK_PHS001172, + MOCK_BAD_RESPONSE, + MOCK_PHS001174, +) +from urllib.parse import urlparse, parse_qs + + +def _mock_requests_get(url): + """ + Mocks responses for get requests, depending on the query parameters in the provided URL. + """ + mock_response = MagicMock(spec=requests.Response) + params = parse_qs(urlparse(url).query) + output = None + if params["phs"][0] == "001174": + output = MOCK_PHS001174 + elif params["phs"][0] == "001173": + output = MOCK_PHS001173 + elif params["phs"][0] == "001172": + output = MOCK_PHS001172 + elif params["phs"][0] == "001171": + output = MOCK_BAD_RESPONSE + else: + # should have requested these studies from the API, + # if it didn't, something went wrong + assert "001173" in params or "001172" in params + + mock_response.status_code = 200 + mock_response.text = output + return mock_response + + +@pytest.mark.parametrize("include_version", [True, False]) +def test_dbgap_study_registration(include_version): + """ + Test dbGaP study registration metadata parsing works and outputs expected fields and values. + + Note that the dbGaP response is mocked, but the response provided + is a real response from the dbGaP Study Registration Server (to simulate current state). + + This does not integration test the dbGaP Study Registration server. In other words, + if they change format and it would break our code, this will not catch that + (and it's not the intention to catch that here). This is intended to unit + test our code to ensure we don't break specifically our parsing in the future. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + version = "v1" + phsid_1 = "phs001173" + phsid_2 = "phs001172" + phsid_1_req = phsid_1 + f"{('.' + version) if include_version else ''}" + phsid_2_req = phsid_2 + f"{('.' + version) if include_version else ''}" + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + metadata = dbgap_study_reg.get_metadata_for_ids([phsid_1_req]) + assert metadata + assert "phs001173.v1.p1" in metadata + assert "StudyInfo" in metadata[f"{phsid_1}.v1.p1"] + metadata = dbgap_study_reg.get_metadata_for_ids([phsid_2_req]) + assert metadata + assert "phs001172.v1.p2" in metadata + assert "StudyInfo" in metadata[f"{phsid_2}.v1.p2"] + + +@pytest.mark.parametrize("include_version", [True, False]) +def test_dbgap_study_registration_multiple_reqs(include_version): + """ + Tests response parsing for requests with multiple phsIds. See test_dbgap_study_registration for more info. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + version = "v1" + phsid_1 = "phs001173" + phsid_2 = "phs001172" + phsid_1_req = phsid_1 + f"{('.' + version) if include_version else ''}" + phsid_2_req = phsid_2 + f"{('.' + version) if include_version else ''}" + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + metadata = dbgap_study_reg.get_metadata_for_ids([phsid_1_req, phsid_2_req]) + assert metadata + assert f"{phsid_2}.v1.p2" in metadata + assert f"{phsid_1}.v1.p1" in metadata + assert "StudyInfo" in metadata[f"{phsid_1}.v1.p1"] + assert "StudyInfo" in metadata[f"{phsid_2}.v1.p2"] + + +def test_dbgap_study_registration_bad_dbgap_resp(): + """ + Tests handling when attempting to parse an invalid response. See test_dbgap_study_registration for more info. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + bad_phsid = "phs001171" + metadata = dbgap_study_reg.get_metadata_for_ids([bad_phsid]) + assert bad_phsid not in metadata + + +def test_dbgap_study_registration_multi_req_bad_dbgap_resp(): + """ + Tests handling when attempting to parse a mixture of valid responses and invalid responses. See test_dbgap_study_registration for more info. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + phsid_1 = "phs001173" + phsid_2 = "phs001172" + bad_phsid = "phs001171" + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + metadata = dbgap_study_reg.get_metadata_for_ids([phsid_1, phsid_2, bad_phsid]) + assert metadata + assert f"{phsid_2}.v1.p2" in metadata + assert f"{phsid_1}.v1.p1" in metadata + assert bad_phsid not in metadata + assert "StudyInfo" in metadata[f"{phsid_1}.v1.p1"] + assert "StudyInfo" in metadata[f"{phsid_2}.v1.p2"] + + +def test_dbgap_study_registration_multi_resp(): + """ + Tests responses where multiple studies are returned for a single phsId. See test_dbgap_study_registration for more info. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + multi_resp_phs = "phs001174" + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + metadata = dbgap_study_reg.get_metadata_for_ids([multi_resp_phs]) + assert metadata + assert f"{multi_resp_phs}.v1.p1" in metadata + assert "StudyInfo" in metadata[f"{multi_resp_phs}.v1.p1"] + + +def test_get_child_studies_for_ids(): + """ + Test retrieving child accessions from dbGaP study registration metadata. + + test_dbgap_study_registration disclaimers also apply to this test. + """ + dbgap_study_reg = dbgapStudyRegistration(api="https://example.com/ss/dbgapssws.cgi") + + with patch( + "gen3.external.nih.dbgap_study_registration.requests.get", + side_effect=_mock_requests_get, + ): + parent_to_child_ids = dbgap_study_reg.get_child_studies_for_ids(["phs001173"]) + assert len(parent_to_child_ids["phs001173.v1.p1"]) == 0 + parent_to_child_ids = dbgap_study_reg.get_child_studies_for_ids(["phs001172"]) + assert parent_to_child_ids["phs001172.v1.p2"] == [ + "phs000089.v4.p2", + "phs001103.v1.p2", + ] + parent_to_child_ids = dbgap_study_reg.get_child_studies_for_ids( + ["phs001173", "phs001172"] + ) + assert len(parent_to_child_ids["phs001173.v1.p1"]) == 0 + assert parent_to_child_ids["phs001172.v1.p2"] == [ + "phs000089.v4.p2", + "phs001103.v1.p2", + ] diff --git a/tests/test_diff.py b/tests/test_diff.py new file mode 100644 index 000000000..23adc5fc2 --- /dev/null +++ b/tests/test_diff.py @@ -0,0 +1,141 @@ +import pytest +import csv +import os +from gen3.tools.diff import manifest_diff +from pathlib import Path + +cwd = os.path.dirname(os.path.realpath(__file__)) + + +def test_directory_input_diff(): + """ + Test that the output manifest produced by manifest_diff for a + given input directory matches the expected output manifest. + """ + + manifest_diff( + directory=f"{cwd}/test_data/diff_manifests", + output_manifest=f"{cwd}/test_data/manifest_diff1.tsv", + key_column="guid", + ) + assert check_diff( + file=f"{cwd}/test_data/manifest_diff1.tsv", + expected={ + "255e396f-f1f8-11e9-9a07-0a80fada010c": [ + "473d83400bc1bc9dc635e334fadde33c", + "363455714", + "['Open']", + "['s3://pdcdatastore/test4.raw']", + ], + "255e396f-f1f8-11e9-9a07-0a80fada012c": [ + "473d83400bc1bc9dc635e334fadde33c", + "363455715", + "['Open']", + "['s3://pdcdatastore/test6.raw']", + ], + }, + ) + + +def test_file_input_diff(): + """ + Test that the output manifest produced by manifest_diff for a + given file strings matches the expected output manifest. + """ + + manifest_diff( + files=[f"{cwd}/test_data/manifest1.csv", f"{cwd}/test_data/manifest2.csv"], + output_manifest=f"{cwd}/test_data/manifest_diff2.csv", + key_column="guid", + ) + assert check_diff( + file=f"{cwd}/test_data/manifest_diff2.csv", + expected={ + "255e396f-f1f8-11e9-9a07-0a80fada099c": [ + "473d83400bc1bc9dc635e334faddf33d", + "363455714", + "['Open']", + "['s3://pdcdatastore/test1.raw']", + ], + "255e396f-f1f8-11e9-9a07-0a80fada098d": [ + "473d83400bc1bc9dc635e334faddd33c", + "343434344", + "['Open']", + "['s3://pdcdatastore/test2.raw']", + ], + "255e396f-f1f8-11e9-9a07-0a80fada097c": [ + "473d83400bc1bc9dc635e334fadd433c", + "543434443", + "['phs0001']", + "['s3://pdcdatastore/test3.raw']", + ], + }, + ) + + +def test_file_input_mismatch(): + """ + Test for fail due to different file types. + """ + + with pytest.raises(ValueError): + manifest_diff( + files=[ + "tests/test_data/manifest1.csv", + "tests/test_data/diff_manifests/manifest3.tsv", + ], + ) + + +def test_no_diff(): + """ + Test for an empty diff. + """ + + manifest_diff( + files=[f"{cwd}/test_data/manifest1.csv", f"{cwd}/test_data/manifest1.csv"], + output_manifest=f"{cwd}/test_data/manifest_diff3.csv", + key_column="guid", + ) + + assert check_diff( + file=f"{cwd}/test_data/manifest_diff3.csv", + expected={}, + ) + + +def check_diff( + file, + expected, + **kwargs, +): + """ + Check resulting diff file with given dict of expected change. + """ + + if ".tsv" in file.lower(): + file_delimiter = "\t" + else: + file_delimiter = "," + + equivalent = True + with open(file, "r", encoding="utf-8-sig") as csvfile: + file_reader = csv.DictReader(csvfile, delimiter=file_delimiter) + next(file_reader, []) + + for row in file_reader: + diff_guid = row["guid"] + expected_values = expected[diff_guid] + for column in row: + if column != "guid" and row[column] not in expected_values: + equivalent = False + + remove_manifest(file) + return equivalent + + +def remove_manifest(file): + if os.path.exists(file): + os.remove(file) + else: + print("The file does not exist") diff --git a/tests/test_discovery.py b/tests/test_discovery.py index 3bcad8419..370d67416 100644 --- a/tests/test_discovery.py +++ b/tests/test_discovery.py @@ -7,15 +7,18 @@ from gen3.tools.metadata.discovery import ( output_expanded_discovery_metadata, + combine_discovery_metadata, publish_discovery_metadata, BASE_CSV_PARSER_SETTINGS, _try_parse, ) -@patch("gen3.tools.metadata.discovery._metadata_file_from_auth") +@patch("gen3.tools.metadata.discovery._create_metadata_output_filename") @patch("gen3.metadata.Gen3Metadata.query") -def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): +def test_discovery_read( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): guid1_discovery_metadata = { # this value should be written to the file exactly as shown "str_key": "str_val \n \t \\", @@ -32,20 +35,23 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): metadata_query_patch.side_effect = lambda *_, **__: { "guid1": { - "_guid_type": "discovery_metadata", + "_guid_type": guid_type, "gen3_discovery": guid1_discovery_metadata, }, "guid2": { - "_guid_type": "discovery_metadata", + "_guid_type": guid_type, "gen3_discovery": guid2_discovery_metadata, }, } + # TSV output tests with tempfile.NamedTemporaryFile(suffix=".csv", mode="a+") as outfile: metadata_file_patch.side_effect = lambda *_, **__: outfile.name loop = asyncio.new_event_loop() loop.run_until_complete( - output_expanded_discovery_metadata(gen3_auth, endpoint="excommons.org") + output_expanded_discovery_metadata( + gen3_auth, endpoint="excommons.org", guid_type=guid_type + ) ) outfile.seek(0) csv_rows = list(csv.DictReader(outfile, **BASE_CSV_PARSER_SETTINGS)) @@ -62,7 +68,7 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): assert metadata_keys - metadata_columns == set(["tags"]) assert metadata_columns - metadata_keys == set(["_tag_0", "_tag_1", "guid"]) - # output should jsonify all dicts/lists, leave everthing else the same + # output should jsonify all dicts/lists, leave everything else the same assert guid1_row["listval"] == json.dumps(guid1_discovery_metadata["listval"]) assert guid1_row["dictval"] == json.dumps(guid1_discovery_metadata["dictval"]) assert guid2_row["other_key"] == guid2_discovery_metadata["other_key"] @@ -76,7 +82,7 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): # should also be able to handle empty discovery metadata metadata_query_patch.side_effect = lambda *_, **__: { - "guid1": {"_guid_type": "discovery_metadata", "gen3_discovery": {}} + "guid1": {"_guid_type": guid_type, "gen3_discovery": {}} } outfile.truncate(0) @@ -91,7 +97,7 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): "commons1": [ { "guid1": { - "_guid_type": "discovery_metadata", + "_guid_type": guid_type, "gen3_discovery": guid1_discovery_metadata, } } @@ -99,7 +105,7 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): "commons2": [ { "guid2": { - "_guid_type": "discovery_metadata", + "_guid_type": guid_type, "gen3_discovery": guid2_discovery_metadata, } } @@ -118,6 +124,89 @@ def test_discovery_read(metadata_query_patch, metadata_file_patch, gen3_auth): # agg mds should parse identical to single-commons mds assert agg_csv_rows == csv_rows + # JSON output tests + metadata_query_patch.side_effect = lambda *_, **__: { + "guid1": { + "_guid_type": guid_type, + "gen3_discovery": guid1_discovery_metadata, + }, + "guid2": { + "_guid_type": guid_type, + "gen3_discovery": guid2_discovery_metadata, + }, + } + with tempfile.NamedTemporaryFile(suffix=".json", mode="a+") as outfile: + expected_output = [ + { + "guid": "guid1", + "_guid_type": guid_type, + "gen3_discovery": guid1_discovery_metadata, + }, + { + "guid": "guid2", + "_guid_type": guid_type, + "gen3_discovery": guid2_discovery_metadata, + }, + ] + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_expanded_discovery_metadata( + gen3_auth, + endpoint="excommons.org", + guid_type=guid_type, + output_format="json", + ) + ) + outfile.seek(0) + assert json.load(outfile) == expected_output + + # test discovering data from aggregate MDS + metadata_query_patch.side_effect = lambda *_, **__: { + "commons1": [ + { + "guid1": { + "_guid_type": guid_type, + "gen3_discovery": guid1_discovery_metadata, + } + } + ], + "commons2": [ + { + "guid2": { + "_guid_type": guid_type, + "gen3_discovery": guid2_discovery_metadata, + } + } + ], + } + + outfile.truncate(0) + loop.run_until_complete( + output_expanded_discovery_metadata( + gen3_auth, + endpoint="excommons.org", + use_agg_mds=True, + output_format="json", + ) + ) + outfile.seek(0) + + # agg mds should parse identical to single-commons mds + assert json.load(outfile) == expected_output + + # illegal output_format value + with pytest.raises(ValueError): + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_expanded_discovery_metadata( + gen3_auth, + endpoint="excommons.org", + guid_type=guid_type, + output_format="blah", + ) + ) + @patch("gen3.metadata.Gen3Metadata.async_create") @pytest.mark.parametrize("ignore_empty_columns", [True, False]) @@ -188,3 +277,87 @@ async def mock_async_create_metadata(guid, metadata, *_, **__): omit_empty_values=ignore_empty_columns, ) ) + + +def test_discovery_combine(): + """ + Test the underlying logic for combining metadata manifests. + """ + current_discovery_metadata_file = ( + "tests/merge_manifests/discovery_combine/discovery.tsv" + ) + metadata_filename = "tests/merge_manifests/discovery_combine/metadata_file.tsv" + discovery_column_to_map_on = "guid" + metadata_column_to_map = "Id" + output_filename = "test_combined_discovery_metadata.tsv" + metadata_prefix = "DBGAP_FHIR_" + + output_file = combine_discovery_metadata( + current_discovery_metadata_file, + metadata_filename, + discovery_column_to_map_on, + metadata_column_to_map, + output_filename, + metadata_prefix=metadata_prefix, + ) + + assert _get_tsv_data(output_file) == _get_tsv_data( + "tests/merge_manifests/discovery_combine/combined_discovery_metadata.tsv" + ) + + _remove_temporary_file(output_file) + + +def test_discovery_combine_exact_match(): + """ + Test the underlying logic for combining metadata manifests when there's a column + with an exact match. + """ + current_discovery_metadata_file = ( + "tests/merge_manifests/discovery_combine/discovery.tsv" + ) + metadata_filename = ( + "tests/merge_manifests/discovery_combine/metadata_file_exact_match.tsv" + ) + discovery_column_to_map_on = "guid" + metadata_column_to_map = "guid_exact_match" + output_filename = "test_combined_discovery_metadata_exact_match.tsv" + metadata_prefix = "DBGAP_FHIR_" + + output_file = combine_discovery_metadata( + current_discovery_metadata_file, + metadata_filename, + discovery_column_to_map_on, + metadata_column_to_map, + output_filename, + metadata_prefix=metadata_prefix, + exact_match=True, + ) + + assert _get_tsv_data(output_file) == _get_tsv_data( + "tests/merge_manifests/discovery_combine/combined_discovery_metadata_exact_match.tsv" + ) + + _remove_temporary_file(output_file) + + +def _remove_temporary_file(filename): + try: + os.remove(filename) + except Exception as exc: + pass + + +def _get_tsv_data(manifest, delimiter="\t"): + """ + Returns a list of rows sorted by guid for the given manifest. + """ + csv_data = list() + with open(manifest, "r", encoding="utf-8-sig") as f: + rows = [] + reader = csv.DictReader(f, delimiter=delimiter) + fieldnames = reader.fieldnames + for row in reader: + rows.append({key: value for key, value in row.items()}) + + return sorted(rows, key=lambda row: row.get("guid", "")) diff --git a/tests/test_discovery_objects.py b/tests/test_discovery_objects.py new file mode 100644 index 000000000..bf762962c --- /dev/null +++ b/tests/test_discovery_objects.py @@ -0,0 +1,251 @@ +import asyncio +import csv +import json +import tempfile +from unittest.mock import patch +import pytest + +from gen3.tools.metadata.discovery_objects import ( + output_discovery_objects, + BASE_CSV_PARSER_SETTINGS, + REQUIRED_OBJECT_FIELDS, + OPTIONAL_OBJECT_FIELDS, +) + + +MOCK_METADATA_1 = { + "str_key": "str_val \n \t \\", + "listval": ["v1", "v2"], + "dictval": {"k1": "v1", "k2": "v2"}, + "objects": [ + { + "guid": "drs://dg.FOOBAR:082a288e-3da2-4806-9438-bc974cdb1cd7", + "display_name": "Clinical TSV", + "description": "TSV containing info about subjects.", + "type": "null", + }, + { + "guid": "drs://dg.FOOBAR:f060149a-8a35-421e-802a-873612ee4874", + "display_name": "Summary PDF", + }, + ], +} + +MOCK_METADATA_2 = {"other_key": "other_val", "objects": []} + +MOCK_METADATA_SIDE_EFFECT = lambda *_, **__: { + "guid1": { + "_guid_type": "discovery_metadata", + "gen3_discovery": MOCK_METADATA_1, + }, + "guid2": { + "_guid_type": "discovery_metadata", + "gen3_discovery": MOCK_METADATA_2, + }, +} + +EXPECTED_DISCOVERY_OBJECTS = [ + { + "guid": "drs://dg.FOOBAR:082a288e-3da2-4806-9438-bc974cdb1cd7", + "dataset_guid": "guid1", + "description": "TSV containing info about subjects.", + "display_name": "Clinical TSV", + "type": "null", + }, + { + "guid": "drs://dg.FOOBAR:f060149a-8a35-421e-802a-873612ee4874", + "dataset_guid": "guid1", + "description": "", + "display_name": "Summary PDF", + "type": "", + }, +] + + +@patch("gen3.tools.metadata.discovery_objects._create_discovery_objects_filename") +@patch("gen3.metadata.Gen3Metadata.query") +def test_discovery_objects_read( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): + """ + Test that when reading discovery objects with specified guids, the resulting output + has the expected data with required columns. + """ + guid1_discovery_metadata = MOCK_METADATA_1 + guid2_discovery_metadata = MOCK_METADATA_2 + metadata_query_patch.side_effect = MOCK_METADATA_SIDE_EFFECT + + # TSV output tests + with tempfile.NamedTemporaryFile(suffix=".tsv", mode="a+") as outfile: + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + dataset_guids = ["guid1", "guid2"] + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_discovery_objects( + gen3_auth, + dataset_guids=dataset_guids, + endpoint="excommons.org", + guid_type=guid_type, + ) + ) + tsv_reader = csv.DictReader(outfile, **BASE_CSV_PARSER_SETTINGS) + tsv_rows = list(tsv_reader) + assert len(tsv_rows) == 2 + + # output should have required columns, and values in them + required_columns = REQUIRED_OBJECT_FIELDS + tsv_column_names = tsv_reader.fieldnames + assert required_columns.issubset(set(tsv_column_names)) + for row in tsv_rows: + for r in required_columns: + assert row[r] + + # output object guids should come from the correct dataset as per data in mds + obj1_row, obj2_row = tsv_rows + assert any( + obj["guid"] == obj1_row["guid"] + for obj in guid1_discovery_metadata["objects"] + ) + assert any( + obj["guid"] == obj2_row["guid"] + for obj in guid1_discovery_metadata["objects"] + ) + assert tsv_rows == EXPECTED_DISCOVERY_OBJECTS + + +@patch("gen3.tools.metadata.discovery_objects._create_discovery_objects_filename") +@patch("gen3.metadata.Gen3Metadata.query") +def test_discovery_objects_read_all( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): + """ + Test that when reading discovery objects with no guids specified, the resulting output + has all objects from all datsets from the mds query. + """ + guid1_discovery_metadata = MOCK_METADATA_1 + guid2_discovery_metadata = MOCK_METADATA_2 + metadata_query_patch.side_effect = MOCK_METADATA_SIDE_EFFECT + + with tempfile.NamedTemporaryFile(suffix=".tsv", mode="a+") as outfile: + # output with no dataset_args should return all objects from all datasets + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + dataset_guids = None + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_discovery_objects( + gen3_auth, + dataset_guids=dataset_guids, + endpoint="excommons.org", + guid_type=guid_type, + ) + ) + tsv_reader2 = csv.DictReader(outfile, **BASE_CSV_PARSER_SETTINGS) + tsv_rows2 = list(tsv_reader2) + assert tsv_rows2 == EXPECTED_DISCOVERY_OBJECTS + + +@patch("gen3.tools.metadata.discovery_objects._create_discovery_objects_filename") +@patch("gen3.metadata.Gen3Metadata.query") +def test_discovery_objects_read_template( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): + """ + Test that when reading discovery objects with the template option, the resulting output + has just the template columns and no object rows. + """ + guid1_discovery_metadata = MOCK_METADATA_1 + guid2_discovery_metadata = MOCK_METADATA_2 + metadata_query_patch.side_effect = MOCK_METADATA_SIDE_EFFECT + + with tempfile.NamedTemporaryFile(suffix=".tsv", mode="a+") as outfile: + # output when reading with --template flag,should just be required columns + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + dataset_guids = None + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_discovery_objects( + gen3_auth, + dataset_guids=dataset_guids, + endpoint="excommons.org", + guid_type=guid_type, + template=True, + ) + ) + tsv_reader3 = csv.DictReader(outfile, **BASE_CSV_PARSER_SETTINGS) + assert set(tsv_reader3.fieldnames) == REQUIRED_OBJECT_FIELDS.union( + OPTIONAL_OBJECT_FIELDS + ) + tsv_rows3 = list(tsv_reader3) + assert len(tsv_rows3) == 0 + + +@patch("gen3.tools.metadata.discovery_objects._create_discovery_objects_filename") +@patch("gen3.metadata.Gen3Metadata.query") +def test_discovery_objects_read_empty_dataset( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): + """ + Test that when reading discovery objects from a dataset with no objects, the resulting output + has just the required columns and no object rows. + """ + guid1_discovery_metadata = MOCK_METADATA_1 + guid2_discovery_metadata = MOCK_METADATA_2 + metadata_query_patch.side_effect = MOCK_METADATA_SIDE_EFFECT + + with tempfile.NamedTemporaryFile(suffix=".tsv", mode="a+") as outfile: + # output when reading with --template flag, or when reading a dataset with no objects, should just be required columns + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + dataset_guids = ["guid2"] + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_discovery_objects( + gen3_auth, + dataset_guids=dataset_guids, + endpoint="excommons.org", + guid_type=guid_type, + ) + ) + tsv_reader4 = csv.DictReader(outfile, **BASE_CSV_PARSER_SETTINGS) + assert set(tsv_reader4.fieldnames) == REQUIRED_OBJECT_FIELDS + tsv_rows4 = list(tsv_reader4) + assert len(tsv_rows4) == 0 + + +@patch("gen3.tools.metadata.discovery_objects._create_discovery_objects_filename") +@patch("gen3.metadata.Gen3Metadata.query") +def test_discovery_objects_read_JSON( + metadata_query_patch, metadata_file_patch, gen3_auth, guid_type="discovery_metadata" +): + """ + Test that when reading discovery objects to a JSON file, the resulting output + matches the expected output format. + """ + # JSON output tests + metadata_query_patch.side_effect = MOCK_METADATA_SIDE_EFFECT + with tempfile.NamedTemporaryFile(suffix=".json", mode="a+") as outfile: + expected_output = [ + { + "dataset_guid": "guid1", + "guid": "drs://dg.FOOBAR:082a288e-3da2-4806-9438-bc974cdb1cd7", + "display_name": "Clinical TSV", + "description": "TSV containing info about subjects.", + "type": "null", + }, + { + "dataset_guid": "guid1", + "guid": "drs://dg.FOOBAR:f060149a-8a35-421e-802a-873612ee4874", + "display_name": "Summary PDF", + }, + ] + metadata_file_patch.side_effect = lambda *_, **__: outfile.name + loop = asyncio.new_event_loop() + loop.run_until_complete( + output_discovery_objects( + gen3_auth, + endpoint="excommons.org", + guid_type=guid_type, + output_format="json", + ) + ) + outfile.seek(0) + assert json.load(outfile) == expected_output diff --git a/tests/test_doi.py b/tests/test_doi.py new file mode 100644 index 000000000..e5f0dd87b --- /dev/null +++ b/tests/test_doi.py @@ -0,0 +1,494 @@ +""" +Tests gen3.doi +""" +import json +import os +import pytest +import sys + +import requests +from requests.auth import HTTPBasicAuth +from unittest.mock import MagicMock, patch + +import gen3 +from gen3.doi import ( + DataCite, + DigitalObjectIdentifier, + DataCiteDOIValidationError, + DigitalObjectIdentifierCreator, + DigitalObjectIdentifierTitle, +) + + +@pytest.mark.parametrize( + "expect_failure,doi_type_general,doi_type,prefix,identifier,creators,titles,publisher,publication_year,descriptions", + [ + # everything normal + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # providing prefix but not ID + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # providing ID but not prefix + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # providing both DOI Type General and DOI Type + ( + False, + "Other", + "Study Record", + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # using non valid DOI Type + ( + True, + "Not a valid doi type", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # not providing prefix or ID + ( + True, + "Dataset", + None, + None, + None, + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # special chars and spaces in creators + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test", "!@#$% ^&*|\\O({@[< >?;:]})", "Name. MIDDLE Last"], + ["test title"], + "test", + 2000, + ["this is a test description"], + ), + # special chars and spaces in titles + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["!@#$% ^&*|\\O({@[< >?;:]})"], + "test", + 2000, + ["this is a test description"], + ), + # special chars and spaces in publisher + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test"], + "Some publisher with Numbers 123 and Symbols !@#$%^&*|\\O({@[<>?;:]})", + 2000, + ["this is a test description"], + ), + # large publication_year + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "!@#$%^&*|\\O({@[<>?;:]})", + 5000, + ["this is a test description"], + ), + # special chars and spaces in description + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["this is a test description !@#$%^&*|\\O({@[<>?;:]})"], + ), + # multiple creators + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test", "test2", "test3"], + ["test title"], + "test", + 2000, + ["this is a test description !@#$%^&*|\\O({@[<>?;:]})"], + ), + # multiple titles + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title", "test title2", "test title 3"], + "test", + 2000, + ["this is a test description !@#$%^&*|\\O({@[<>?;:]})"], + ), + # multiple descriptions + ( + False, + "Dataset", + None, + "10.12345", + "ID1234", + ["test"], + ["test title"], + "test", + 2000, + ["test description", "test description2", "test description 3"], + ), + ], +) +@patch("gen3.doi.requests.post") +def test_create_doi( + requests_mock, + expect_failure, + prefix, + identifier, + doi_type_general, + doi_type, + creators, + titles, + publisher, + publication_year, + descriptions, +): + """ + Test DOI creation under various inputs, ensure it still works even when + special characters are used. Ensure it doesn't work when invalid input is + provided (like not specify prefix OR id). + """ + datacite = DataCite( + auth_provider=HTTPBasicAuth("DATACITE_USERNAME", "DATACITE_PASSWORD") + ) + if expect_failure: + with pytest.raises(DataCiteDOIValidationError): + doi = DigitalObjectIdentifier( + prefix=prefix, + identifier=identifier, + creators=creators, + titles=titles, + publisher=publisher, + publication_year=publication_year, + doi_type_general=doi_type_general, + doi_type=doi_type, + url="https://example.com", + version="0.1", + descriptions=descriptions, + foobar="test", + ) + else: + doi = DigitalObjectIdentifier( + prefix=prefix, + identifier=identifier, + creators=creators, + titles=titles, + publisher=publisher, + publication_year=publication_year, + doi_type_general=doi_type_general, + doi_type=doi_type, + url="https://example.com", + version="0.1", + descriptions=descriptions, + foobar="test", + ) + + def _mock_request(url, **kwargs): + assert url.endswith("/dois") + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + mocked_response.json.return_value = { + "status": "OK", + } + mocked_response.raise_for_status.side_effect = lambda *args: None + + return mocked_response + + requests_mock.side_effect = _mock_request + + if not expect_failure: + response = datacite.create_doi(doi) + response.raise_for_status() + assert requests_mock.call_count == 1 + + data_in_request = ( + requests_mock.call_args.kwargs.get("json", {}) + .get("data", {}) + .get("attributes", {}) + ) + + for creator in creators: + assert creator in data_in_request.get("creators") + for title in titles: + assert title in data_in_request.get("titles") + assert data_in_request.get("publisher") == publisher + assert data_in_request.get("publicationYear") == publication_year + assert ( + data_in_request.get("types", {}).get("resourceTypeGeneral") + == doi_type_general + ) + assert data_in_request.get("types", {}).get("resourceType") == doi_type + for description in descriptions: + assert description in data_in_request.get("descriptions") + + +@pytest.mark.parametrize( + "doi_metadata_already_exists, existing_metadata", + [ + # non Discovery, top-level metadata + (True, {"alreadyexists": "stuff"}), + # Discovery, non DOI metadata + ( + True, + { + "_guid_type": "discovery_metadata", + "gen3_discovery": {"otherstuff": "foobar"}, + }, + ), + # Discovery, DOI metadata + ( + True, + { + "_guid_type": "discovery_metadata", + "gen3_discovery": {"doi_version": 0}, + }, + ), + (False, {}), + ], +) +@patch("gen3.doi.requests.get") +@patch("gen3.doi.requests.post") +@patch("gen3.doi.requests.put") +def test_doi_metadata_persist( + doi_requests_put_mock, + doi_requests_post_mock, + doi_requests_get_mock, + gen3_auth, + doi_metadata_already_exists, + existing_metadata, +): + """ + Test the DOI metadata persistance into Gen3's metadata service with and + without existing metadata existing. + """ + # Setup + datacite = DataCite( + api=DataCite.TEST_URL, + auth_provider=HTTPBasicAuth( + os.environ.get("DATACITE_USERNAME"), + os.environ.get("DATACITE_PASSWORD"), + ), + ) + + gen3_metadata_guid = "Example-Study-01" + + # Get DOI metadata (ideally from some external source) + identifier = "10.12345/268Z-O151" + creators = [ + DigitalObjectIdentifierCreator( + name="Bar, Foo", + name_type=DigitalObjectIdentifierCreator.NAME_TYPE_PERSON, + ).as_dict() + ] + titles = [DigitalObjectIdentifierTitle("Some Example Study in Gen3").as_dict()] + publisher = "Example Gen3 Sponsor" + publication_year = 2023 + doi_type_general = "Dataset" + doi_type = "" + version = 1 + + doi_metadata = { + "identifier": identifier, + "creators": creators, + "titles": titles, + "publisher": publisher, + "publication_year": publication_year, + "doi_type_general": doi_type_general, + "doi_type": doi_type, + "version": version, + } + + # Create/Mint the DOI in DataCite + doi = DigitalObjectIdentifier(root_url="foobar", **doi_metadata) + + def _mock_metadata_create_request(url, **kwargs): + assert f"/metadata/{gen3_metadata_guid}" in url + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + mocked_response.json.return_value = { + "status": "OK", + } + mocked_response.raise_for_status.side_effect = lambda *args: None + + return mocked_response + + def _mock_metadata_get_request(url, **kwargs): + assert f"/metadata/{gen3_metadata_guid}" in url + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + + nonlocal existing_metadata + mocked_response.json.return_value = existing_metadata + + mocked_response.raise_for_status.side_effect = lambda *args: None + + if f"/metadata/{gen3_metadata_guid}/aliases" in url: + mocked_response.json.return_value = {"aliases": []} + + return mocked_response + + def _mock_metadata_get_request_doesnt_exist(url, **kwargs): + assert f"/metadata/{gen3_metadata_guid}" in url + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 404 + mocked_response.json.return_value = {} + + def _raise(): + error = requests.exceptions.HTTPError(mocked_response) + error.status_code = 404 + raise error + + mocked_response.raise_for_status.side_effect = _raise + + if f"/metadata/{gen3_metadata_guid}/aliases" in url: + mocked_response.json.return_value = {"aliases": []} + + return mocked_response + + doi_requests_put_mock.side_effect = _mock_metadata_create_request + doi_requests_post_mock.side_effect = _mock_metadata_create_request + + if doi_metadata_already_exists: + doi_requests_get_mock.side_effect = _mock_metadata_get_request + else: + doi_requests_get_mock.side_effect = _mock_metadata_get_request_doesnt_exist + + # Persist necessary DOI Metadata in Gen3 Discovery to support the landing page + metadata = datacite.persist_doi_metadata_in_gen3( + guid=gen3_metadata_guid, + doi=doi, + auth=gen3_auth, + additional_metadata={ + "disclaimer": "disclaimer 1", + "access_information": "access_information 1", + "access_information_link": "access_information_link 1", + "contact": "contact 1", + }, + prefix="doi_", + ) + assert doi_requests_get_mock.call_count == 1 + + expected_output = { + "_guid_type": "discovery_metadata", + "gen3_discovery": { + "doi_identifier": identifier, + "doi_resolvable_link": f"https://doi.org/{identifier}", + "doi_creators": "Bar, Foo", + "doi_titles": "Some Example Study in Gen3", + "doi_publisher": "Example Gen3 Sponsor", + "doi_publication_year": 2023, + "doi_resource_type_general": "Dataset", + "doi_url": f"foobar/{identifier}/", + "doi_version": 1, + "doi_is_available": "Yes", + "doi_disclaimer": "disclaimer 1", + "doi_citation": f"Bar, Foo (2023). Some Example Study in Gen3 1. Example Gen3 Sponsor. Dataset. {identifier}", + "doi_version_information": "This is version 1 of this Dataset.", + "doi_access_information": "access_information 1", + "doi_contact": "contact 1", + "doi_access_information_link": "access_information_link 1", + }, + } + + if doi_metadata_already_exists: + # metadata created should prefer the new DOI information over existing + expected_updated_output = existing_metadata + expected_updated_output.update(expected_output) + assert doi_requests_put_mock.call_count == 2 + + metadata_call = doi_requests_put_mock.call_args_list[0] + alias_call = doi_requests_put_mock.call_args_list[1] + + assert metadata_call.kwargs.get("json") == expected_updated_output + assert f"{identifier}" in alias_call.kwargs.get("json", {}).get("aliases", []) + else: + # 1 for metadata, 1 for alias + assert doi_requests_post_mock.call_count == 2 + + metadata_call = doi_requests_post_mock.call_args_list[0] + alias_call = doi_requests_post_mock.call_args_list[1] + + assert metadata_call.kwargs.get("json") == expected_output + assert f"{identifier}" in alias_call.kwargs.get("json", {}).get("aliases", []) diff --git a/tests/test_doi_discovery.py b/tests/test_doi_discovery.py new file mode 100644 index 000000000..a8024eb54 --- /dev/null +++ b/tests/test_doi_discovery.py @@ -0,0 +1,205 @@ +import os +import requests +from requests.auth import HTTPBasicAuth +import pytest +from unittest.mock import MagicMock, patch + +from gen3.auth import Gen3Auth +from gen3.discovery_dois import mint_dois_for_discovery_datasets, GetMetadataInterface +from gen3.utils import get_random_alphanumeric +from gen3.doi import DigitalObjectIdentifier + +PREFIX = "10.12345" +PUBLISHER = "Example" +COMMONS_DISCOVERY_PAGE = "https://example.com/discovery" + +METADATA_FIELD_FOR_ALTERNATE_ID = "dbgap_accession" +DOI_DISCLAIMER = "DOI_DISCLAIMER" +DOI_ACCESS_INFORMATION = "DOI_ACCESS_INFORMATION" +DOI_ACCESS_INFORMATION_LINK = "DOI_ACCESS_INFORMATION_LINK" +DOI_CONTACT = "DOI_CONTACT" + + +@pytest.mark.parametrize("exclude_datasets", [["guid_W"], ["alternate_id_0"]]) +@pytest.mark.parametrize("does_datacite_have_dois_minted_already", [True, False]) +@patch("gen3.discovery_dois._raise_exception_on_collision") +@patch("gen3.discovery_dois.DataCite.persist_doi_metadata_in_gen3") +@patch("gen3.discovery_dois.get_alternate_id_to_guid_mapping") +@patch("gen3.doi.requests.get") +@patch("gen3.doi.requests.post") +@patch("gen3.doi.requests.put") +@patch("gen3.doi.DigitalObjectIdentifier") +def test_mint_discovery_dois_first_time( + mock_digital_object_identifier, + update_doi_requests_mock, + create_doi_requests_mock, + get_doi_requests_mock, + mock_get_alternate_id_to_guid_mapping, + mock_persist_doi_metadata_in_gen3, + mock_raise_exception_on_collision, + does_datacite_have_dois_minted_already, + gen3_auth, + exclude_datasets, +): + """ + Test that the right call to Datacite's API (create/update) happens and + persist to Gen3 call happens when using the mint Discovery DOIs for + existing Discovery Metadata. The discovery metadata have alternate ids and + a mocked external metadata interface. + + There are 4 existing discovery metadata GUIDs: + + guid_W: We will specifically request to exclude this one. tests will use + the GUID and the alternate ID to exclude + guid_X: no DOI yet, need one minted + guid_Y: no DOI yet, need one minted + guid_Z: Has existing DOI minted and identified in `doi_identifier` in metadata + """ + mock_get_alternate_id_to_guid_mapping.side_effect = ( + mock_function_get_alternate_id_to_guid_mapping + ) + + mock_raise_exception_on_collision.side_effect = lambda *_, **__: None + + def _mock_request_404(url, **kwargs): + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 404 + + return mocked_response + + def _mock_request_200(url, **kwargs): + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + + return mocked_response + + if does_datacite_have_dois_minted_already: + get_doi_requests_mock.side_effect = _mock_request_200 + else: + # this 404 means that Datacite responds with not having a DOI minted, so the + # code should try to create one for the first time + get_doi_requests_mock.side_effect = _mock_request_404 + + mint_dois_for_discovery_datasets( + gen3_auth=gen3_auth, + datacite_auth=HTTPBasicAuth( + "foo", + "bar", + ), + metadata_field_for_alternate_id=METADATA_FIELD_FOR_ALTERNATE_ID, + get_doi_identifier_function=get_doi_identifier, + metadata_interface=MockMetadataInterface, + doi_publisher=PUBLISHER, + commons_discovery_page=COMMONS_DISCOVERY_PAGE, + doi_disclaimer=DOI_DISCLAIMER, + doi_access_information=DOI_ACCESS_INFORMATION, + doi_access_information_link=DOI_ACCESS_INFORMATION_LINK, + doi_contact=DOI_CONTACT, + publish_dois=False, + datacite_use_prod=False, + exclude_datasets=exclude_datasets, + ) + + if does_datacite_have_dois_minted_already: + # in this case, guid_Z has a `doi_identifier` and the Datacite + # API is mocked to say that it already has that DOI minted, so + # we need to update that one and create 2 new DOIs + assert update_doi_requests_mock.call_count == 1 + assert create_doi_requests_mock.call_count == 2 + else: + # in this case, even though guid_Z has a `doi_identifier`, the Datacite + # API is mocked to say that it doesn't have a DOI minted for that, so + # we actually need to create 3 new DOIs + assert update_doi_requests_mock.call_count == 0 + assert create_doi_requests_mock.call_count == 3 + + # check that persist is called with the right stuff + assert mock_persist_doi_metadata_in_gen3.call_count == 3 + assert mock_digital_object_identifier.call_count == 3 + calls = { + call.kwargs.get("guid"): call.kwargs + for call in mock_persist_doi_metadata_in_gen3.call_args_list + } + assert "guid_X" in calls + assert "guid_Y" in calls + assert "guid_Z" in calls + + assert calls["guid_X"]["additional_metadata"] == { + "disclaimer": "DOI_DISCLAIMER", + "access_information": "DOI_ACCESS_INFORMATION", + "access_information_link": "DOI_ACCESS_INFORMATION_LINK", + "contact": "DOI_CONTACT", + } + assert calls["guid_X"]["prefix"] == "doi_" + + assert calls["guid_Y"]["additional_metadata"] == { + "disclaimer": "DOI_DISCLAIMER", + "access_information": "DOI_ACCESS_INFORMATION", + "access_information_link": "DOI_ACCESS_INFORMATION_LINK", + "contact": "DOI_CONTACT", + } + assert calls["guid_Y"]["prefix"] == "doi_" + + assert calls["guid_Z"]["additional_metadata"] == { + "disclaimer": "DOI_DISCLAIMER", + "access_information": "DOI_ACCESS_INFORMATION", + "access_information_link": "DOI_ACCESS_INFORMATION_LINK", + "contact": "DOI_CONTACT", + } + assert calls["guid_Z"]["prefix"] == "doi_" + + +def mock_function_get_alternate_id_to_guid_mapping( + auth, metadata_field_for_alternate_id +): + assert metadata_field_for_alternate_id == METADATA_FIELD_FOR_ALTERNATE_ID + current_discovery_alternate_id_to_guid = { + "alternate_id_0": "guid_W", + "alternate_id_A": "guid_X", + "alternate_id_B": "guid_Y", + "alternate_id_C": "guid_Z", + } + all_discovery_metadata = { + "guid_W": { + METADATA_FIELD_FOR_ALTERNATE_ID: "alternate_id_0", + "descriptions": "barW", + }, + "guid_X": { + METADATA_FIELD_FOR_ALTERNATE_ID: "alternate_id_A", + "descriptions": "barX", + }, + "guid_Y": { + METADATA_FIELD_FOR_ALTERNATE_ID: "alternate_id_B", + "descriptions": "barY", + }, + "guid_Z": { + "doi_identifier": "10.12345/TEST-asdf-jkl9", + METADATA_FIELD_FOR_ALTERNATE_ID: "alternate_id_C", + "descriptions": "barZ", + }, + } + return ( + current_discovery_alternate_id_to_guid, + all_discovery_metadata, + ) + + +class MockMetadataInterface(GetMetadataInterface): + def get_doi_metadata(self): + return { + "alternate_id_A": {"descriptions": "barX"}, + "alternate_id_B": {"descriptions": "barY"}, + "alternate_id_C": { + "descriptions": "barZ", + }, + } + + +def get_doi_identifier(): + return ( + PREFIX + + "/TEST-" + + get_random_alphanumeric(4) + + "-" + + get_random_alphanumeric(4) + ) diff --git a/tests/test_expansion.py b/tests/test_expansion.py new file mode 100644 index 000000000..6c9d8d12c --- /dev/null +++ b/tests/test_expansion.py @@ -0,0 +1,289 @@ +import requests, json, fnmatch, os, os.path, sys, subprocess, glob, ntpath, copy, re, operator +from os import path +from gen3.auth import Gen3Auth +from gen3.submission import Gen3Submission +from gen3.file import Gen3File +from gen3.metadata import Gen3Metadata +from gen3.tools.expansion import Gen3Expansion +import pytest +from unittest.mock import MagicMock, patch +import base64 +import os +import requests +import time +import json +import gen3.auth +import shutil + +tsv_header = "type\tid\tproject_id\tsubmitter_id\tage_range\tbreed\tcause_of_death\tdays_to_birth\tdays_to_death\tgender\tvital_status\tyear_of_birth\tyear_of_death\tsubjects.id\tsubjects.submitter_id\n" +tsv_result1 = "demographic\t01d08a15\tCanine-Osteosarcoma\tRW.040287\t11\tGolden Retriever\t\t\t\tfemale\t\t\t\t1228931e\tRW.040287\ndemographic\t0f787b21\tCanine-Osteosarcoma\tGH_PepRey\t7\tRottweiler\t\t\t\tfemale\t\t\t\t1228b150\tGH_PepRey\n" +tsv_result2 = "demographic\t022b52c6\tCanine-B_cell_lymphoma\tc1a2e22c\t50\t\t\t\t\tmale\t\t\t\t4f1c2a74\tSRS3133132\ndemographic\t040adea7-\tCanine-B_cell_lymphoma\tc1a32462\t10\t\t\t\t\tmale\t\t\t\t4f1d8608\tSRS3133114\n" +tsv_result3 = "diagnosis\t022b52c6\tCanine-B_cell_lymphoma\tc1a2e22c\t50\t\t\t\t\tmale\t\t\t\t4f1c2a74\tSRS3133132\ndiagnosis\t040adea7-\tCanine-B_cell_lymphoma\tc1a32462\t10\t\t\t\t\tmale\t\t\t\t4f1d8608\tSRS3133114\n" + + +def test_get_project_ids(mock_gen3_auth): + + endpoint = "https://test/ok" + mock_submission = Gen3Submission(mock_gen3_auth) + + def _mock_sub_query(query_txt): + mocked_result = {} + if query_txt == """{project (first:0){project_id}}""": + mocked_result = { + "data": { + "project": [ + {"project_id": "Canine-Bladder_cancer"}, + {"project_id": "Canine-Osteosarcoma"}, + {"project_id": "Canine-PMed_trial"}, + {"project_id": "Canine-PMed_trial"}, + ] + } + } + elif ( + query_txt + == """{project (first:0, with_path_to:{type:"program",name:"Canine"}){project_id}}""" + ): + mocked_result = { + "data": { + "project": [ + {"project_id": "Canine-Bladder_cancer"}, + {"project_id": "Canine-PMed_trial"}, + ] + } + } + elif ( + query_txt + == """{project (first:0, with_path_to:{type:"program",name:"Training"}){project_id}}""" + ): + mocked_result = {"data": {"project": [{"project_id": "Canine-Training"}]}} + elif ( + query_txt + == """{project (first:0, with_path_to:{type:"case",submitter_id:"case-01"}){project_id}}""" + ): + mocked_result = {"data": {"project": [{"project_id": "case-study-01"}]}} + elif query_txt == """{node (first:0,of_type:"node"){project_id}}""": + mocked_result = { + "data": { + "node": [ + {"project_id": "node-proj-01"}, + {"project_id": "node-proj-02"}, + ] + } + } + + return mocked_result + + # test name is none and (node is none or node is program) + mock_submission.query = _mock_sub_query + exp = Gen3Expansion(endpoint, mock_gen3_auth) + exp.sub = mock_submission + project_ids = exp.get_project_ids() + assert project_ids == [ + "Canine-Bladder_cancer", + "Canine-Osteosarcoma", + "Canine-PMed_trial", + ] + + project_ids = exp.get_project_ids(node="program", name="Canine") + assert project_ids == ["Canine-Bladder_cancer", "Canine-PMed_trial"] + + project_ids = exp.get_project_ids(node="program", name=["Training", "Canine"]) + assert project_ids == [ + "Canine-Bladder_cancer", + "Canine-PMed_trial", + "Canine-Training", + ] + + project_ids = exp.get_project_ids(node="node") + assert project_ids == ["node-proj-01", "node-proj-02"] + + project_ids = exp.get_project_ids(node="case", name="case-01") + assert project_ids == ["case-study-01"] + + +def test_get_node_tsvs(mock_gen3_auth): + + endpoint = "https://test/ok" + node_name = "demographic" + master_file_name = "master_demographic.tsv" + dirpath = "node_tsvs" + + # Clean up Prev Run result if exists + if os.path.isfile(master_file_name): + os.remove(master_file_name) + + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) + + def _mock_sub_query(query_txt): + mocked_result = {} + if query_txt == """{project (first:0){project_id}}""": + mocked_result = { + "data": { + "project": [ + {"project_id": "Canine-Osteosarcoma"}, + {"project_id": "Canine-B_cell_lymphoma"}, + ] + } + } + + return mocked_result + + def _mock_request(url, **kwargs): + mocked_response = MagicMock(requests.Response) + if url.endswith( + "/api/v0/submission/Canine/Osteosarcoma/export/?node_label=demographic&format=tsv" + ): + mocked_response.status_code = 200 + mocked_response.text = tsv_header + tsv_result1 + elif url.endswith( + "/api/v0/submission/Canine/B_cell_lymphoma/export/?node_label=demographic&format=tsv" + ): + mocked_response.status_code = 200 + mocked_response.text = tsv_header + tsv_result2 + return mocked_response + + mocked_submission = Gen3Submission(endpoint, mock_gen3_auth) + mocked_submission.query = _mock_sub_query + exp = Gen3Expansion(endpoint, mock_gen3_auth) + exp.sub = mocked_submission + + with patch("gen3.submission.requests.get") as mock_request_get: + mock_request_get.side_effect = _mock_request + node_tsvs = exp.get_node_tsvs(node_name) + # Test both function output and file content + assert node_tsvs == tsv_header + tsv_result2 + tsv_result1 + assert os.path.isfile("master_demographic.tsv") + with open(master_file_name, "r") as file: + data = file.read() + assert node_tsvs == data + + # Clean up in between tests + if os.path.isfile(master_file_name): + os.remove(master_file_name) + + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) + + # Test targeted node project request + with patch("gen3.submission.requests.get") as mock_request_get: + mock_request_get.side_effect = _mock_request + node_tsvs = exp.get_node_tsvs(node=node_name, projects="Canine-B_cell_lymphoma") + assert node_tsvs == tsv_header + tsv_result2 + assert os.path.isfile("master_demographic.tsv") + with open(master_file_name, "r") as file: + data = file.read() + assert node_tsvs == data + + # Final Clean up + if os.path.isfile(master_file_name): + os.remove(master_file_name) + + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) + + +def test_get_project_tsvs(mock_gen3_auth): + + endpoint = "https://test/ok" + node_name = "demographic" + dirpath = "project_tsvs" + filename1 = "Canine-B_cell_lymphoma_demographic.tsv" + filename2 = "Canine-B_cell_lymphoma_diagnosis.tsv" + + # Clean up Prev Run result if exists + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) + + def _mock_sub_query(query_txt): + mocked_result = {} + if query_txt == """{project (first:0){project_id}}""": + mocked_result = { + "data": {"project": [{"project_id": "Canine-B_cell_lymphoma"}]} + } + elif query_txt == """{_node_type (first:-1) {id}}""": + mocked_result = { + "data": { + "_node_type": [ + {"id": "demographic"}, + {"id": "diagnosis"}, + {"id": "program"}, + ] + } + } + elif ( + query_txt + == """{_demographic_count (project_id:"Canine-B_cell_lymphoma")}""" + ): + mocked_result = {"data": {"_demographic_count": 1}} + elif ( + query_txt == """{_diagnosis_count (project_id:"Canine-B_cell_lymphoma")}""" + ): + mocked_result = {"data": {"_diagnosis_count": 1}} + + return mocked_result + + def _mock_request(url, **kwargs): + mocked_response = MagicMock(requests.Response) + if url.endswith( + "/api/v0/submission/Canine/B_cell_lymphoma/export/?node_label=demographic&format=tsv" + ): + mocked_response.status_code = 200 + mocked_response.text = tsv_header + tsv_result2 + elif url.endswith( + "/api/v0/submission/Canine/B_cell_lymphoma/export/?node_label=diagnosis&format=tsv" + ): + mocked_response.status_code = 200 + mocked_response.text = tsv_header + tsv_result3 + return mocked_response + + mocked_submission = Gen3Submission(endpoint, mock_gen3_auth) + mocked_submission.query = _mock_sub_query + exp = Gen3Expansion(endpoint, mock_gen3_auth) + exp.sub = mocked_submission + + with patch("gen3.submission.requests.get") as mock_request_get: + mock_request_get.side_effect = _mock_request + project_tsvs = exp.get_project_tsvs() + # Test function output (downloaded file names) + project_tsv_filenames = ( + filename1 + "\n" + filename2 + "\n" + ) #'Canine-B_cell_lymphoma_demographic.tsv\nCanine-B_cell_lymphoma_diagnosis.tsv\n' + assert project_tsvs == project_tsv_filenames + # Test Downloaded files exists and expected content + filepath = dirpath + "/Canine-B_cell_lymphoma_tsvs/" + filenames = [filepath + filename1, filepath + filename2] + for filename in filenames: + assert os.path.isfile(filename) + with open(filename, "r") as file: + data = file.read() + if filename == filename1: + assert data == tsv_header + tsv_result2 + elif filename == filename2: + assert data == tsv_header + tsv_result3 + + # Clean up in between tests + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) + + # Test targeted node project request + with patch("gen3.submission.requests.get") as mock_request_get: + mock_request_get.side_effect = _mock_request + project_tsvs = exp.get_project_tsvs( + nodes="demographic", projects="Canine-B_cell_lymphoma" + ) + # Test function output (downloaded file names) + project_tsv_filenames = filename1 + "\n" + assert project_tsvs == project_tsv_filenames + # Test Downloaded files exists and expected content + filepath = dirpath + "/Canine-B_cell_lymphoma_tsvs/" + filename = filepath + filename1 + + assert os.path.isfile(filename) + with open(filename, "r") as file: + data = file.read() + assert data == tsv_header + tsv_result2 + + # Clean up + if os.path.exists(dirpath) and os.path.isdir(dirpath): + shutil.rmtree(dirpath) diff --git a/tests/test_file.py b/tests/test_file.py index 0a144a9e1..a02a80eb8 100644 --- a/tests/test_file.py +++ b/tests/test_file.py @@ -29,7 +29,7 @@ def test_get_presigned_url(gen3_file, supported_protocol): with patch("gen3.file.requests") as mock_request: mock_request.status_code = 200 - mock_request.get().text = json.dumps({"url": sample_presigned_url}) + mock_request.get().json = lambda: {"url": sample_presigned_url} res = gen3_file.get_presigned_url(guid="123", protocol=supported_protocol) assert "url" in res assert res["url"] == sample_presigned_url @@ -66,7 +66,7 @@ def test_get_presigned_url_no_api_key(gen3_file, supported_protocol): with patch("gen3.file.requests") as mock_request: mock_request.status_code = 401 - mock_request.get().text = "Failed" + mock_request.get().json = lambda: "Failed" res = gen3_file.get_presigned_url(guid="123", protocol=supported_protocol) assert res == "Failed" @@ -85,7 +85,7 @@ def test_get_presigned_url_wrong_api_key(gen3_file, supported_protocol): with patch("gen3.file.requests") as mock_request: mock_request.status_code = 401 - mock_request.get().text = "Failed" + mock_request.get().json = lambda: "Failed" res = gen3_file.get_presigned_url(guid="123", protocol=supported_protocol) assert res == "Failed" diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 448f5c1ae..21aa55aaf 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -1,12 +1,51 @@ +import asyncio +import logging import os +import sys from unittest.mock import MagicMock, patch + import pytest import requests from requests.exceptions import HTTPError from gen3.metadata import Gen3Metadata +from gen3.tools.metadata import async_ingest_metadata_manifest +from gen3.utils import get_or_create_event_loop_for_thread CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) +TEST_METADATA = { + "dbgap": { + "submitted_sample_id": "NWD222747", + "biosample_id": "SAMN03976569", + "dbgap_sample_id": 1733482, + "sra_sample_id": "SRS1083657", + "submitted_subject_id": "BUR02266657B", + "dbgap_subject_id": 1324130, + "consent_code": 2, + "consent_short_name": "DS-LD-IRB-COL", + "sex": "female", + "body_site": "Peripheral Blood", + "analyte_type": "DNA", + "sample_use": ["Seq_DNA_SNP_CNV", "WGS"], + "repository": "GALAII", + "dbgap_status": "Loaded", + "sra_data_details": { + "status": "public", + "experiments": "1", + "runs": "1", + "bases": "188052444326", + "size_Gb": "37", + "experiment_type": "WGS", + "platform": "ILLUMINA", + "center": "New York Genome Center", + }, + "study_accession": "phs000920.v4.p2", + "study_accession_with_consent": "phs000920.v4.p2.c2", + "study_with_consent": "phs000920.c2", + "study_subject_id": "phs000920.v4_BUR02266657B", + }, + "_guid_type": "metadata_object", +} @patch("gen3.metadata.requests.get") @@ -359,8 +398,12 @@ def _mock_request(url, **kwargs): assert response == expected_response +@pytest.mark.parametrize( + "aliases", + [None, [], ["1"], ["1a", "2b", "3c"], ["A!@SJD)(*@#Q&)AS(DF"]], +) @patch("gen3.metadata.requests.post") -def test_create(requests_mock): +def test_create(requests_mock, aliases): """ Test creating for guids """ @@ -372,6 +415,10 @@ def test_create(requests_mock): def _mock_request(url, **kwargs): assert f"/metadata/{guid}" in url + if "alias" in url: + for alias in aliases: + assert alias in kwargs.get("json").get("aliases") + mocked_response = MagicMock(requests.Response) mocked_response.status_code = 200 mocked_response.json.return_value = expected_response @@ -381,13 +428,17 @@ def _mock_request(url, **kwargs): requests_mock.side_effect = _mock_request - response = metadata.create(guid=guid, metadata=data) + response = metadata.create(guid=guid, metadata=data, aliases=aliases) assert response == expected_response +@pytest.mark.parametrize( + "aliases", + [None, [], ["1"], ["1a", "2b", "3c"], ["A!@SJD)(*@#Q&)AS(DF"]], +) @patch("gen3.metadata.requests.put") -def test_update(requests_mock): +def test_update(requests_mock, aliases): """ Test updating for guids """ @@ -399,6 +450,10 @@ def test_update(requests_mock): def _mock_request(url, **kwargs): assert f"/metadata/{guid}" in url + if "alias" in url: + for alias in aliases: + assert alias in kwargs.get("json").get("aliases") + mocked_response = MagicMock(requests.Response) mocked_response.status_code = 200 mocked_response.json.return_value = expected_response @@ -408,7 +463,7 @@ def _mock_request(url, **kwargs): requests_mock.side_effect = _mock_request - response = metadata.update(guid=guid, metadata=data) + response = metadata.update(guid=guid, metadata=data, aliases=aliases) assert response == expected_response @@ -437,3 +492,139 @@ def _mock_request(url, **kwargs): response = metadata.delete(guid=guid) assert response == expected_response + + +@patch("gen3.metadata.requests.get") +@patch("gen3.metadata.requests.post") +@patch("gen3.metadata.requests.put") +@patch("gen3.metadata.requests.delete") +def test_aliases_creation( + requests_mock_delete, + requests_mock_put, + requests_mock_post, + requests_mock_get, + gen3_auth, +): + """ + Test that aliases get created and updated as expected given different inputs + by mocking the low level function and asserting they're called with the right info. + This test also holds a "global" for what we expect the current_alias and metadata + to be, so that the mock GET can return that. + """ + mds = Gen3Metadata("https://example.com", auth_provider=gen3_auth) + guid = "dg.4503/0b2f6693-0936-4c94-8dc7-5e8caf3454c8" + expected_response = {} + + current_aliases = [] + current_metadata = TEST_METADATA + + def _mock_create_request(url, **kwargs): + assert f"/metadata/{guid}" in url + + nonlocal current_aliases + nonlocal current_metadata + + if f"/metadata/{guid}/aliases" in url: + if "merge=True" in url: + current_aliases = current_aliases + kwargs.get("json", {}).get( + "aliases", [] + ) + else: + current_aliases = kwargs.get("json", {}).get("aliases", []) + else: + if "merge=True" in url: + current_metadata.update(kwargs.get("json", {})) + else: + current_metadata = kwargs.get("json", {}) + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + mocked_response.json.return_value = current_metadata + mocked_response.raise_for_status.side_effect = lambda *args: None + + return mocked_response + + def _mock_delete_request(url, **kwargs): + assert f"/metadata/{guid}" in url + + nonlocal current_aliases + + if "aliases" in url: + alias = url.strip().split("/")[-1] + if alias == "aliases": + # this is a request to delete all aliases + current_aliases = [] + else: + # delete a single alias + current_aliases.remove(alias) + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + mocked_response.json.return_value = {} + mocked_response.raise_for_status.side_effect = lambda *args: None + + return mocked_response + + def _mock_get_request(url, **kwargs): + assert f"/metadata/{guid}" in url + + nonlocal current_aliases + nonlocal current_metadata + + mocked_response = MagicMock(requests.Response) + mocked_response.status_code = 200 + mocked_response.json.return_value = current_metadata + mocked_response.raise_for_status.side_effect = lambda *args: None + + if f"/metadata/{guid}/aliases" in url: + mocked_response.json.return_value = {"aliases": current_aliases} + + return mocked_response + + requests_mock_post.side_effect = _mock_create_request + requests_mock_get.side_effect = _mock_get_request + requests_mock_delete.side_effect = _mock_delete_request + requests_mock_put.side_effect = _mock_create_request + + metadata = TEST_METADATA + + # Test creation with aliases + mds.create(guid, metadata, aliases=["1", "2"]) + + response = mds.get_aliases(guid) + assert response.get("aliases") == sorted(["1", "2"]) + response = mds.get(guid) + assert response == TEST_METADATA + + # Test update merging with existing aliases + metadata["foo"] = "bar" + mds.update(guid, metadata, merge=True, aliases=["3", "4"]) + + response = mds.get_aliases(guid) + assert response.get("aliases") == sorted(["1", "2", "3", "4"]) + + response = mds.get(guid) + assert response.get("foo") == "bar" + assert response.get("_guid_type") == "metadata_object" + + # Test update NOT merging with existing aliases + mds.update(guid, {"foo": "asdf"}, merge=False, aliases=["3", "4"]) + + response = mds.get_aliases(guid) + assert response.get("aliases") == sorted(["3", "4"]) + + response = mds.get(guid) + assert response.get("foo") == "asdf" + assert response.get("_guid_type") != "metadata_object" + + # test deleting an alias + mds.delete_alias(guid=guid, alias="3") + + response = mds.get_aliases(guid) + assert response.get("aliases") == ["4"] + + # test deleting aliases + mds.delete_aliases(guid) + + response = mds.get_aliases(guid) + assert response.get("aliases") == [] diff --git a/tests/utils_mock_dbgap_study_registration_response.py b/tests/utils_mock_dbgap_study_registration_response.py new file mode 100644 index 000000000..e1c05dfa3 --- /dev/null +++ b/tests/utils_mock_dbgap_study_registration_response.py @@ -0,0 +1,459 @@ +""" +Contains captured responses from NIH dbGaP's Study Registration server +to be used in testing. +""" + +""" +Has child studies +""" +MOCK_PHS001172 = """ + + + + + phs000089.v4.p2 + phs001103.v1.p2 + 10263 + 11719 + + + NINDS Parkinson’s Disease + + + + + + + + + + + + + + + phenotype_data + genotype_data + individual_sequencing + whole_exome + + + + + + + + + PI + NIH + + + PO + NIH + + + PI_ASSIST + + + + PHENO_CURATOR + NIH + + + GPA + NIH + + + + + INSTRUCTIONS: This study has not provided a suggested acknowledgement statement. + However, Approved Users are expected to acknowledge the Submitting Investigator(s) who submitted data + from the original study to an NIH-designated data repository, the primary funding organization that + supported the Submitting Investigator(s), and the NIH-designated data repository (e.g., dbGaP). The + acknowledgment statement should include the dbGaP accession number to the specific version of the + dataset(s) analyzed. + + + + + + + + + + + Use of the data is limited only by the terms of the model Data Use Certification. + + + + + + + + + + + + + + + +""".replace( + "\n", "" +) + +""" +Does not have child studies +""" +MOCK_PHS001173 = """ + + + + + + + + Head and Neck Cancer Genome-wide Association Study + + + + + + + + + + + + + + + + + phenotype_data + genotype_data + dna + snp_array + array_derived_genotypes + analysis + + + + + R01 CA131324 + + + + + + + + PI + UNIVERSITY OF TX MD ANDERSON CAN CTR + + + PO + NIH + + + PI_ASSIST + + + + PHENO_CURATOR + NIH + + + GENO_CURATOR + NIH + + + GPA + NIH + + + + + Funding support for this study was provided by NCI (R01 CA131324). + + + + + + + + + + + Use of the data is limited only by the terms of the model Data Use Certification. + + + + + + + + + + + + + + + +""".replace( + "\n", "" +) + +""" +Has multiple studies +""" +MOCK_PHS001174 = """ + + + + + + + + Head and Neck Cancer Genome-wide Association Study + + + + + + + + + + + + + + + + + phenotype_data + genotype_data + dna + snp_array + array_derived_genotypes + analysis + + + + + R01 CA131324 + + + + + + + + PI + UNIVERSITY OF TX MD ANDERSON CAN CTR + + + PO + NIH + + + PI_ASSIST + + + + PHENO_CURATOR + NIH + + + GENO_CURATOR + NIH + + + GPA + NIH + + + + + Funding support for this study was provided by NCI (R01 CA131324). + + + + + + + + + + + Use of the data is limited only by the terms of the model Data Use Certification. + + + + + + + + + + + + + + + + + + + + Head and Neck Cancer Genome-wide Association Study + + + + + + + + + + + + + + + + + phenotype_data + genotype_data + dna + snp_array + array_derived_genotypes + analysis + + + + + R01 CA131324 + + + + + + + + PI + UNIVERSITY OF TX MD ANDERSON CAN CTR + + + PO + NIH + + + PI_ASSIST + + + + PHENO_CURATOR + NIH + + + GENO_CURATOR + NIH + + + GPA + NIH + + + + + Funding support for this study was provided by NCI (R01 CA131324). + + + + + + + + + + + Use of the data is limited only by the terms of the model Data Use Certification. + + + + + + + + + + + + + + + +""".replace( + "\n", "" +) + +MOCK_BAD_RESPONSE = """ +{ + " +} +""".replace( + "\n", "" +) diff --git a/tests/utils_mock_fhir_response.py b/tests/utils_mock_fhir_response.py new file mode 100644 index 000000000..a1f03dc9b --- /dev/null +++ b/tests/utils_mock_fhir_response.py @@ -0,0 +1,3221 @@ +""" +Contains captured responses from NIH dbGaP's FHIR server +to be used in testing. +""" + +MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000166 = { + "resourceType": "ResearchStudy", + "id": "phs000166", + "meta": { + "versionId": "1", + "lastUpdated": "2022-02-14T01:54:41.865-05:00", + "source": "#RmGqDkdNNL3uZunk", + "security": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/DbGaPConcept-SecurityStudyConsent", + "code": "public", + "display": "public", + } + ], + }, + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyOverviewUrl", + "valueUrl": "https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000166.v2.p1", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-ReleaseDate", + "valueDate": "2009-09-09", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents-StudyConsent", + "valueCoding": { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyConsents-StudyConsent", + "code": "phs000166.v2.p1 - 0", + "display": "NRUP", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents-StudyConsent", + "valueCoding": { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyConsents-StudyConsent", + "code": "phs000166.v2.p1 - 1", + "display": "ARR", + }, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumPhenotypeDatasets", + "valueCount": { + "value": 9, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumMolecularDatasets", + "valueCount": { + "value": 1, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumVariables", + "valueCount": { + "value": 348, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumDocuments", + "valueCount": { + "value": 39, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSubjects", + "valueCount": { + "value": 4046, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSamples", + "valueCount": { + "value": 4046, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSubStudies", + "valueCount": {"system": "http://unitsofmeasure.org", "code": "1"}, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "Genome-Wide_Human_SNP_Array_6.0", + } + ] + }, + } + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP Genotypes (Array)", + } + ] + }, + } + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Functional Variant in the Autophagy-Related 5 Gene Promotor is Associated with Childhood Asthma", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3335039", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Following the footprints of polymorphic inversions on SNP data: from detection to association tests", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4417146", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Association Study Identifies Novel Pharmacogenomic Loci For Therapeutic Response to Montelukast in Asthma", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4470685", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Measuring the Corticosteroid Responsiveness Endophenotype in Asthma", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4530065", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "African ancestry is associated with cluster-based childhood asthma subphenotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5984446", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The Pharmacogenetics and Pharmacogenomics of Asthma Therapy", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3298891", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Association Study of Short-Acting Ã\x9f2-Agonists. A Novel Genome-Wide Significant Locus on Chromosome 2 near ASB3", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4384768", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Differences in Candidate Gene Association between European Ancestry and African American Asthmatic Children", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3046166", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Identification of ATPAF1 as a novel candidate gene for asthma in children", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3185108", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Association Identifies the T Gene as a Novel Asthma Pharmacogenetic Locus", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3381232", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetic predictors associated with improvement of asthma symptoms in response to inhaled corticosteroids", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4112383", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Rank-based genome-wide analysis reveals the association of Ryanodine receptor-2 gene variants with childhood asthma among human populations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3708719", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A Common 16p11.2 Inversion Underlies the Joint Susceptibility to Asthma and Obesity", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3951940", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Epistasis between SPINK5 and TSLP Genes Contributes to Childhood Asthma", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4186896", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "FEATURE SCREENING FOR TIME-VARYING COEFFICIENT MODELS WITH ULTRAHIGH DIMENSIONAL LONGITUDINAL DATA", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5019497", + }, + ], + }, + ], + }, + ], + "identifier": [ + { + "type": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/DbGaPConcept-DbGaPStudyIdentifier", + "code": "dbgap_study_id", + "display": "dbgap_study_id", + } + ] + }, + "value": "phs000166.v2.p1", + } + ], + "title": "SNP Health Association Resource (SHARe) Asthma Resource Project (SHARP)", + "status": "completed", + "category": [ + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyDesign", + "code": "Cross-Sectional", + "display": "Cross-Sectional", + } + ], + "text": "Cross-Sectional", + } + ], + "description": "\nSNP Health Association Resource (SHARe) Asthma Resource project (SHARP) is conducting a genome-wide analysis in adults and children who have participated in National Heart, Lung, and Blood Institute's clinical research trials on asthma. This includes 1041 children with asthma who participated in the Childhood Asthma Management Program (CAMP), 994 children who participated in one or five clinical trials conducted by the Childhood Asthma Research and Education (CARE) network, and 701 adults who participated in one of six clinical trials conducted by the Asthma Clinical Research Network (ACRN).\n\nThere are three study types. The longitudinal clinical trials can be subsetted for population-based and/or case-control analyses. Each of the childhood asthma studies has a majority of children participating as part of a parent-child trio. The ACRN (adult) studies are probands alone. Control genotypes will be provided for case-control analyses.\n", + "enrollment": [{"reference": "Group/phs000166.v2.p1-all-subjects"}], + "sponsor": { + "reference": "Organization/NHLBI", + "type": "Organization", + "display": "National Heart, Lung, and Blood Institute", + }, +} + + +MOCK_NIH_DBGAP_FHIR_RESPONSE_FOR_PHS000007 = { + "resourceType": "ResearchStudy", + "id": "phs000007", + "meta": { + "versionId": "1", + "lastUpdated": "2022-02-14T02:02:49.892-05:00", + "source": "#kU6thnO0fhSOEQrq", + "security": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/DbGaPConcept-SecurityStudyConsent", + "code": "public", + "display": "public", + } + ], + }, + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyOverviewUrl", + "valueUrl": "https://www.ncbi.nlm.nih.gov/projects/gap/cgi-bin/study.cgi?study_id=phs000007.v32.p13", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-ReleaseDate", + "valueDate": "2020-12-22", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents-StudyConsent", + "valueCoding": { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyConsents-StudyConsent", + "code": "phs000007.v32.p13 - 0", + "display": "NRUP", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents-StudyConsent", + "valueCoding": { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyConsents-StudyConsent", + "code": "phs000007.v32.p13 - 1", + "display": "HMB-IRB-MDS", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyConsents-StudyConsent", + "valueCoding": { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyConsents-StudyConsent", + "code": "phs000007.v32.p13 - 2", + "display": "HMB-IRB-NPU-MDS", + }, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumPhenotypeDatasets", + "valueCount": { + "value": 462, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumMolecularDatasets", + "valueCount": { + "value": 28, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumVariables", + "valueCount": { + "value": 80372, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumDocuments", + "valueCount": { + "value": 1493, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumAnalyses", + "valueCount": { + "value": 3029, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSubjects", + "valueCount": { + "value": 15144, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSamples", + "valueCount": { + "value": 51752, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Content-NumSubStudies", + "valueCount": { + "value": 8, + "system": "http://unitsofmeasure.org", + "code": "1", + }, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "1000G_ref_panel", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "Affymetrix_100K", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "Affymetrix_50K", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "CVDSNP55v1_A", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "FHSOmni_Axiom_PLINK_Markerset", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "Genome-Wide_Human_SNP_Array_5.0", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HRC1_ref_panel", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HapMap_phaseII", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HuEx-1_0-st", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HumanExome-12v1_CHARGE-ExomeChip-v6", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HumanMethylation450", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "HumanOmni5-4v1_B", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "LegacySet", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "SNP-PCR", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "WES_markerset_grc36", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "WES_markerset_grc37", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "WGS_markerset_grc36", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "WGS_markerset_grc37", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "custom_probe_set", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "exome_vcf_ESP6800", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "exome_vcf_grc37", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-StudyMarkersets-StudyMarkerset", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyMarkersets-StudyMarkerset", + "code": "target_markerset_grc36", + } + ] + }, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "Methylation (CpG)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "miRNA Expression (Array)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP Genotypes (NGS)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP/CNV Genotypes (NGS)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "WGS", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP Genotypes (imputed)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "mRNA Expression (Array)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP Genotypes (PCR)", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "WXS", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "Legacy Genotypes", + } + ] + }, + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-MolecularDataTypes-MolecularDataType", + "valueCodeableConcept": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-MolecularDataTypes-MolecularDataType", + "code": "SNP Genotypes (Array)", + } + ] + }, + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Recent methods for polygenic analysis of genome-wide data implicate an important effect of common variants on cardiovascular disease risk", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3213201", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The SLC2A9 nonsynonymous Arg265His variant and gout: evidence for a population-specific effect on severity", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3218899", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Lack of association of Klotho gene variants with valvular and vascular calcification in Caucasians: a candidate gene study of the Framingham Offspring Cohort", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3224114", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Post-Genomic Update on a Classical Candidate Gene for Coronary Artery Disease: ESR1", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3260440", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Evaluating prognostic accuracy of biomarkers in nested caseâ\x80\x93control studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3276269", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Identification of Homogeneous Genetic Architecture of Multiple Genetically Correlated Traits by Block Clustering of Genome-Wide Associations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3312758", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3338262", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Knowledge-Driven Analysis Identifies a Geneâ\x80\x93Gene Interaction Affecting High-Density Lipoprotein Cholesterol Levels in Multi-Ethnic Populations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3359971", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Family-Based Association Studies for Next-Generation Sequencing", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3370281", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide linkage scan for plasma high density lipoprotein cholesterol, apolipoprotein A-1 and triglyceride variation among American Indian populations: the Strong Heart Family Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3388907", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Prediction of Expected Years of Life Using Whole-Genome Markers", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3405107", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Polygenic Effects of Common Single-Nucleotide Polymorphisms on Life Span: When Association Meets Causality", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3419841", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "How Genes Influence Life Span: The Biodemography of Human Survival", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3419845", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "d-Catenin Is Genetically and Biologically Associated with Cortical Cataract and Future Alzheimer-Related Structural and Functional Brain Changes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3439481", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide meta-analysis points to CTC1 and ZNF676 as genes regulating telomere homeostasis in humans", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3510758", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Copy Number Variation on Chromosome 10q26.3 for Obesity Identified by a Genome-Wide Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3537105", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Obesityâ\x80\x93insulin targeted genes in the 3p26-25 region in human studies and LG/J and SM/J mice", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3586585", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genomics of human health and aging", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3592948", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Inter-chromosomal level of genome organization and longevity-related phenotypes in humans", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3592956", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The role of lipid-related genes, aging-related processes, and environment in healthspan", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3602307", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A family-based joint test for mean and variance heterogeneity for quantitative traits", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4275359", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A Systematic Heritability Analysis of the Human Whole Blood Transcriptome", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4339826", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Assessment of Whole-Genome Regression for Type II Diabetes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4401705", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Association of Rare Loss-Of-Function Alleles in HAL, Serum Histidine Levels and Incident Coronary Heart Disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4406800", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The uniform-score gene set analysis for identifying common pathways associated with different diabetes traits", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4415316", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Triglyceride-Increasing Alleles Associated with Protection against Type-2 Diabetes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4447354", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Identification of a novel FGFRL1 MicroRNA target site polymorphism for bone mineral density in meta-analyses of genome-wide association studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4512621", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Birth Cohort, Age, and Sex Strongly Modulate Effects of Lipid Risk Alleles Identified in Genome-Wide Association Studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4546650", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Integrated allelic, transcriptional, and phenomic dissection of the cardiac effects of titin truncations in health and disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4560092", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genomic prediction of coronary heart disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5146693", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "KLB is associated with alcohol drinking, and its gene product Ã\x9f-Klotho is necessary for FGF21 regulation of alcohol preference", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5167198", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Uncoupling associations of risk alleles with endophenotypes and phenotypes: insights from the ApoB locus and heart-related traits", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5242299", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Using information of relatives in genomic prediction to apply effective stratified medicine", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5299615", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Metabolomic profiles as reliable biomarkers of dietary composition", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5320413", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Identification of IDUA and WNT16 Phosphorylation-Related Non-Synonymous Polymorphisms for Bone Mineral Density in Meta-Analyses of Genome-Wide Association Studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5362379", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Coordinated Action of Biological Processes during Embryogenesis Can Cause Genome-Wide Linkage Disequilibrium in the Human Genome and Influence Age-Related Phenotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5367637", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Structural variants caused by Alu insertions are associated with risks for many human diseases", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5441760", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "An Exploration of Gene-Gene Interactions and Their Effects on Hypertension", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5470022", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Age-associated microRNA expression in human peripheral blood is associated with all-cause mortality and age-related traits", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5770777", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Cytosolic proteome profiling of monocytes for male osteoporosis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5779619", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Large-scale Cognitive GWAS Meta-Analysis Reveals Tissue-Specific Neural Expression and Potential Nootropic Drug Targets", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5789458", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Network based subcellular proteomics in monocyte membrane revealed novel candidate genes involved in osteoporosis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5812280", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Penetrance of Polygenic Obesity Susceptibility Loci across the Body Mass Index Distribution", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5812888", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "rqt: an R package for gene-level meta-analysis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5860520", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Strong impact of natural-selectionâ\x80\x93free heterogeneity in genetics of age-related phenotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5892700", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Apolipoprotein E region molecular signatures of Alzheimer's disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6052488", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The Cortical Neuroimmune Regulator TANK Affects Emotional Processing and Enhances Alcohol Drinking: A Translational Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6430980", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Mendelian randomization evaluation of causal effects of fibrinogen on incident coronary heart disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6510421", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pleiotropic Meta-Analysis of Age-Related Phenotypes Addressing Evolutionary Uncertainty in Their Molecular Mechanisms", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6524409", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetic heterogeneity of Alzheimerâ\x80\x99s disease in subjects with and without hypertension", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6544706", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The Framingham Heart Study 100K SNP genome-wide association study resource: overview of 17 phenotype working group reports", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1995613", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A genome-wide association study for blood lipid phenotypes in the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1995614", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Final Draft Status of the Epidemiology of Atrial Fibrillation", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2245891", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Association of Common Polymorphisms in GLUT9 Gene with Gout but Not with Coronary Artery Disease in a Large Case-Control Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2275796", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "SLEEP MEDICINE NEWS AND UPDATES", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2556905", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Bivariate Genome-Wide Linkage Analysis of Femoral Bone Traits and Leg Lean Mass: Framingham Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2659513", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Using Linkage Analysis to Identify Quantitative Trait Loci for Sleep Apnea in Relationship to Body Mass Index", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2677984", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "GENETIC MODEL FOR LONGITUDINAL STUDIES OF AGING, HEALTH, AND LONGEVITY AND ITS POTENTIAL APPLICATION TO INCOMPLETE DATA", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2691861", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A genome-wide association scan of RR and QT interval duration in three European genetically isolated populations. The EUROSPAN project", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2760953", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Epidemiology of Type 2 Diabetes and Cardiovascular Disease: Translation From Population to Prevention: The Kelly West Award Lecture 2009", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2909080", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Current Perceptions of the Epidemiology of Atrial Fibrillation", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2917063", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Consent for Genetic Research in the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2923558", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Common variants in FLNB/CRTAP, not ARHGEF3 at 3p, are associated with osteoporosis in southern Chinese women", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2946578", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetics of the Framingham Heart Study Population", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3014216", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Ethical and practical challenges of sharing data from genome-wide association studies: The eMERGE Consortium experience", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3129243", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide association of an integrated osteoporosis-related phenotype: is there evidence for pleiotropic genes?", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3290743", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Contributions of The Framingham Study to Stroke and Dementia Epidemiology at 60 years", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3380159", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Development and Application of a Longitudinal ECG Repository: the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3483375", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Heritability of pulmonary function estimated from pedigree and whole-genome markers", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3766834", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Circulating Cell and Plasma microRNA Profiles Differ between Non-ST-Segment and ST-Segment-Elevation Myocardial Infarction", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3890357", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Effects of Long-Term Averaging of Quantitative Blood Pressure Traits on the Detection of Genetic Associations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4085637", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Phenotypic extremes in rare variant study designs", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4867440", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Cohort Profile: The Framingham Heart Study (FHS): overview of milestones in cardiovascular epidemiology", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5156338", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide association study of subclinical interstitial lung disease in MESA", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5437638", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Non-parametric genetic prediction of complex traits with latent Dirichlet process regression models", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5587666", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A whole-blood transcriptome meta-analysis identifies gene expression signatures of cigarette smoking", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5975607", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Protein Biomarkers of Cardiovascular Disease and Mortality in the Community", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6064847", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Framingham Heart Study 100K project: genome-wide associations for cardiovascular disease outcomes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1995607", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide association study of electrocardiographic and heart rate variability traits: the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1995612", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Linkage and Association Scans for Quantitative Trait Loci of Serum Lactate Dehydrogenaseâ\x80\x94The Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2958689", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Evaluating the Evidence for Transmission Distortion in Human Pedigrees", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3338262", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Neuropeptide Y Gene Polymorphisms Confer Risk of Early-Onset Atherosclerosis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2602734", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Whole-genome association study identifies STK39 as a hypertension susceptibility gene", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2629209", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Association and Follow-Up Replication Studies Identified ADAMTS18 and TGFBR3 as Bone Mass Candidate Genes in Different Ethnic Groups", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2667986", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Association Analyses Suggested a Novel Mechanism for Smoking Behavior Regulated by IL15", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2700850", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Powerful Bivariate Genome-Wide Association Analyses Suggest the SOX6 Gene Influencing Both Obesity and Osteoporosis Phenotypes in Males", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2730014", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetic Analysis of Variation in Human Meiotic Recombination", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2730532", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide significant predictors of metabolites in the one-carbon metabolism pathway", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2773275", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "New Lesions Detected by Single Nucleotide Polymorphism Arrayâ\x80\x93Based Chromosomal Analysis Have Important Clinical Impact in Acute Myeloid Leukemia", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2773477", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "ATRIUM: Testing Untyped SNPs in Case-Control Association Studies with Related Individuals", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2775837", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Association Study Identifies ALDH7A1 as a Novel Susceptibility Gene for Osteoporosis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2794362", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Association of three genetic loci with uric acid concentration and risk of gout: a genome-wide association study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2803340", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pathway-based Genome-Wide Association Analysis Identified the Importance of EphrinA-EphR pathway for Femoral Neck Bone Geometry", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2818219", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "GWAF: an R package for genome-wide association analyses with family data", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2852219", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide association analysis of total cholesterol and high-density lipoprotein cholesterol levels using the Framingham Heart Study data", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2867786", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Natural selection in a contemporary human population", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2868295", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide association identifies OBFC1 as a locus involved in human leukocyte telomere biology", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2889047", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Runs of Homozygosity Identify a Recessive Locus 12q21.31 for Human Adult Height", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2913044", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A PCA-based method for ancestral informative markers selection in structured populations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2920624", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "HMGA2 Is Confirmed To Be Associated with Human Adult Height", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2972475", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Multi-locus Test Conditional on Confirmed Effects Leads to Increased Power in Genome-wide Association Studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2982824", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Joint influence of small-effect genetic variants on human longevity", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2984609", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene by Sex Interaction for Measures of Obesity in the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3021872", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A validation of the first genome-wide association study of calcaneus ultrasound parameters in the European Male Ageing Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3042372", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Meta-Analysis confirms CR1, CLU, and PICALM as Alzheimerâ\x80\x99s disease risk loci and reveals interactions with APOE genotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3048805", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Beyond Missing Heritability: Prediction of Complex Traits", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3084207", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Analyze Multivariate Phenotypes in Genetic Association Studies by Combining Univariate Association Tests", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3090041", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "SNP arrayâ\x80\x93based karyotyping: differences and similarities between aplastic anemia and hypocellular myelodysplastic syndromes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3128479", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Replication of Previous Genome-wide Association Studies of Bone Mineral Density in Premenopausal American Women", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3153352", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "IL21R and PTH May Underlie Variation of Femoral Neck Bone Mineral Density as Revealed by a Genome-wide Association Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3153368", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Association Study for Femoral Neck Bone Geometry", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3153387", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Pleiotropy of Osteoporosis-Related Phenotypes: The Framingham Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3153998", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pathway-Based Genome-Wide Association Analysis Identified the Importance of Regulation-of-Autophagy Pathway for Ultradistal Radius BMD", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3153999", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Burden of Rare Sarcomere Gene Variants in the Framingham and Jackson Heart Study Cohorts", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3511985", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Atrial natriuretic peptide is negatively regulated by microRNA-425", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3726159", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "A Meta-analysis of Gene Expression Signatures of Blood Pressure and Hypertension", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4365001", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Identification of microRNA Expression Quantitative Trait Loci", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4369777", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Subgroup specific incremental value of new markers for risk prediction", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3633735", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene Expression Signatures of Coronary Heart Disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3684247", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Evaluating incremental values from new predictors with net reclassification improvement in survival analysis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3686882", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Evaluating the Predictive Value of Biomarkers with Stratified Case-Cohort Design", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3718317", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Association between SNP heterozygosity and quantitative traits in the Framingham Heart Study", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3760672", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene-alcohol interactions identify several novel blood pressure loci including a promising locus near SLC16A9", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3860258", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Meta-analysis of genome-wide association data identifies novel susceptibility loci for obesity", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3888264", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Resampling Procedures for Making Inference under Nested Case-control Studies", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3891801", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Adopting nested caseâ\x80\x93control quota sampling designs for the evaluation of risk markers", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3903399", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Multistage genome-wide association meta-analyses identified two new loci for bone mineral density", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3943521", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Analysis of Body Proportion Classifies Height-Associated Variants by Mechanism of Action and Implicates Genes Important for Skeletal Development", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4570286", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Estimation and Inference in Generalized Additive Coefficient Models for Nonlinear Interactions with High-Dimensional Covariates", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4578655", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide Survey of Runs of Homozygosity Identifies Recessive Loci for Bone Mineral Density in Caucasian and Chinese Populations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4615523", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Gene by Environment Interaction Analysis Identifies Common SNPs at 17q21.2 that Are Associated with Increased Body Mass Index Only among Asthmatics", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4684413", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The Toll-Like Receptor 4 (TLR4) Variant rs2149356 and Risk of Gout in European and Polynesian Sample Sets", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4726773", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Exploring the major sources and extent of heterogeneity in a genome-wide association meta-analysis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4761279", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "FTO association and interaction with time spent sitting", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4783205", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene by stress genome-wide interaction analysis and path analysis identify EBF1 as a cardiovascular and metabolic risk gene", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4795045", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Understanding multicellular function and disease with human tissue-specific networks", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4828725", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Interaction of Insulin Resistance and Related Genetic Variants with Triglyceride-Associated Genetic Variants", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4838530", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Body mass index change in gastrointestinal cancer and chronic obstructive pulmonary disease is associated with Dedicator of Cytokinesis 1", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5476850", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "GWAS meta-analysis reveals novel loci and genetic correlates for general cognitive function: a report from the COGENT consortium", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5659072", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Identification of polymorphisms in cancer patients that differentially affect survival with age", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5680559", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Estimation of genomic prediction accuracy from reference populations with varying degrees of relationship", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5739427", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Integrative network analysis reveals molecular mechanisms of blood pressure regulation", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4422556", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Metabolomic Profiles of Body Mass Index in the Framingham Heart Study Reveal Distinct Cardiometabolic Phenotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4749349", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Diverse human extracellular RNAs are widely detected in human plasma", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4853467", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "An exome array study of the plasma metabolome", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4962516", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Messenger RNA and MicroRNA transcriptomic signatures of cardiometabolic risk factors", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5299677", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Micro RNAs from DNA Viruses are Found Widely in Plasma in a Large Observational Human Population", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5913337", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetic architecture of gene expression traits across diverse populations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6105030", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pathway-based analysis of genome-wide association study of circadian phenotypes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6163116", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Meta-Analysis across Cohorts for Heart and Aging Research in Genomic Epidemiology (CHARGE) Consortium Provides Evidence for an Association of Serum Vitamin D with Pulmonary Function", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6263170", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Assessing the genetic correlations between early growth parameters and bone mineral density: A polygenic risk score analysis", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6298225", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-wide analysis of genetic predisposition to Alzheimerâ\x80\x99s disease and related sex disparities", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6330399", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Independent associations of TOMM40 and APOE variants with body mass index", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6351823", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Replication of 6 Obesity Genes in a Meta-Analysis of Genome-Wide Association Studies from Diverse Ancestries", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4039436", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genetic analysis of candidate SNPs for metabolic syndrome in obstructive sleep apnea (OSA)", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4039742", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Assessing the phenotypic effects in the general population of rare variants in genes for a dominant mendelian form of diabetes", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4051627", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "An Examination of the Relationship between Hotspots and Recombination Associated with Chromosome 21 Nondisjunction", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4057233", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene-gene interaction between RBMS3 and ZNF516 influences bone mineral density", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4127986", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "The power comparison of the haplotype-based collapsing tests and the variant-based collapsing tests for detecting rare variants in pedigrees", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4131059", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Multiple Metabolic Genetic Risk Scores and Type 2 Diabetes Risk in Three Racial/Ethnic Groups", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4154088", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Abundant local interactions in the 4p16.1 region suggest functional mechanisms underlying SLC2A9 associations with human serum uric acid", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4159153", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Genome-Wide Meta-Analysis of Myopia and Hyperopia Provides Evidence for Replication of 11 Loci", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4169415", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Gene-Based Rare Allele Analysis Identified a Risk Gene of Alzheimerâ\x80\x99s Disease", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4203677", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Integrative analysis of multiple diverse omics datasets by sparse group multitask regression", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4209817", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Integrative Analysis of GWASs, Human Protein Interaction, and Gene Expression Identified Gene Modules Associated With BMDs", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4223444", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Meta-analysis of genome-wide association studies for circulating phylloquinone concentrations", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4232014", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Determinants of Power in Gene-Based Burden Testing for Monogenic Disorders", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5011058", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Non-linear interactions between candidate genes of myocardial infarction revealed in mRNA expression profiles", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5027110", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pleiotropic Meta-Analyses of Longitudinal Studies Discover Novel Genetic Variants Associated with Age-Related Diseases", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5061751", + }, + ], + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer", + "extension": [ + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Title", + "valueString": "Pleiotropic Associations of Allelic Variants in a 2q22 Region with Risks of Major Human Diseases and Mortality", + }, + { + "url": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/StructureDefinition/ResearchStudy-Citers-Citer-Url", + "valueUrl": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5104356", + }, + ], + }, + ], + }, + ], + "identifier": [ + { + "type": { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/DbGaPConcept-DbGaPStudyIdentifier", + "code": "dbgap_study_id", + "display": "dbgap_study_id", + } + ] + }, + "value": "phs000007.v32.p13", + } + ], + "title": "Framingham Cohort", + "status": "completed", + "category": [ + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/CodeSystem/ResearchStudy-StudyDesign", + "code": "Prospective Longitudinal Cohort", + "display": "Prospective Longitudinal Cohort", + } + ], + "text": "Prospective Longitudinal Cohort", + } + ], + "focus": [ + { + "coding": [ + { + "system": "urn:oid:2.16.840.1.113883.6.177", + "code": "D002318", + "display": "Cardiovascular Diseases", + } + ], + "text": "Cardiovascular Diseases", + } + ], + "condition": [ + { + "coding": [ + { + "system": "urn:oid:2.16.840.1.113883.6.177", + "code": "D002318", + "display": "Cardiovascular Diseases", + } + ], + "text": "Cardiovascular Diseases", + }, + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/NamingSystem/MeshEntryTerm", + "code": "D002318 entry term: Disease, Cardiovascular", + "display": "Disease, Cardiovascular", + } + ], + "text": "Disease, Cardiovascular", + }, + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/NamingSystem/MeshEntryTerm", + "code": "D002318 entry term: Diseases, Cardiovascular", + "display": "Diseases, Cardiovascular", + } + ], + "text": "Diseases, Cardiovascular", + }, + { + "coding": [ + { + "system": "https://uts.nlm.nih.gov/metathesaurus.html", + "code": "C0007222", + "display": "Cardiovascular Disease", + } + ], + "text": "Cardiovascular Disease", + }, + ], + "keyword": [ + { + "coding": [ + { + "system": "urn:oid:2.16.840.1.113883.6.177", + "code": "D002318", + "display": "Cardiovascular Diseases", + } + ], + "text": "Cardiovascular Diseases", + }, + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/NamingSystem/MeshEntryTerm", + "code": "D002318 entry term: Disease, Cardiovascular", + "display": "Disease, Cardiovascular", + } + ], + "text": "Disease, Cardiovascular", + }, + { + "coding": [ + { + "system": "https://dbgap-api.ncbi.nlm.nih.gov/fhir/x1/NamingSystem/MeshEntryTerm", + "code": "D002318 entry term: Diseases, Cardiovascular", + "display": "Diseases, Cardiovascular", + } + ], + "text": "Diseases, Cardiovascular", + }, + { + "coding": [ + { + "system": "https://uts.nlm.nih.gov/metathesaurus.html", + "code": "C0007222", + "display": "Cardiovascular Disease", + } + ], + "text": "Cardiovascular Disease", + }, + ], + "description": '\n**Startup of Framingham Heart Study.** Cardiovascular disease (CVD) is the leading cause of death and serious illness in the United States. In 1948, the Framingham Heart Study (FHS) -- under the direction of the National Heart Institute (now known as the National Heart, Lung, and Blood Institute, NHLBI) -- embarked on a novel and ambitious project in health research. At the time, little was known about the general causes of heart disease and stroke, but the death rates for CVD had been increasing steadily since the beginning of the century and had become an American epidemic.\n\nThe objective of the FHS was to identify the common factors or characteristics that contribute to CVD by following its development over a long period of time in a large group of participants who had not yet developed overt symptoms of CVD or suffered a heart attack or stroke.\n\n**Design of Framingham Heart Study.** In 1948, the researchers recruited 5,209 men and women between the ages of 30 and 62 from the town of Framingham, Massachusetts, and began the first round of extensive physical examinations and lifestyle interviews that they would later analyze for common patterns related to CVD development. Since 1948, the subjects have returned to the study every two years for an examination consisting of a detailed medical history, physical examination, and laboratory tests, and in 1971, the study enrolled a second-generation cohort -- 5,124 of the original participants' adult children and their spouses -- to participate in similar examinations. The second examination of the Offspring cohort occurred eight years after the first examination, and subsequent examinations have occurred approximately every four years thereafter. In April 2002 the Study entered a new phase: the enrollment of a third generation of participants, the grandchildren of the original cohort. The first examination of the Third Generation Study was completed in July 2005 and involved 4,095 participants. Thus, the FHS has evolved into a prospective, community-based, three generation family study. The FHS is a joint project of the National Heart, Lung and Blood Institute and Boston University.\n\n**Research Areas in the Framingham Heart Study.** Over the years, careful monitoring of the FHS population has led to the identification of the major CVD risk factors -- high blood pressure, high blood cholesterol, smoking, obesity, diabetes, and physical inactivity -- as well as a great deal of valuable information on the effects of related factors such as blood triglyceride and HDL cholesterol levels, age, gender, and psychosocial issues. Risk factors have been identified for the major components of CVD, including coronary heart disease, stroke, intermittent claudication, and heart failure. It is also clear from research in the FHS and other studies that substantial subclinical vascular disease occurs in the blood vessels, heart and brain that precedes clinical CVD. With recent advances in technology, the FHS has enhanced its research capabilities and capitalized on its inherent resources by the conduct of high resolution imaging to detect and quantify subclinical vascular disease in the major blood vessels, heart and brain. These studies have included ultrasound studies of the heart (echocardiography) and carotid arteries, computed tomography studies of the heart and aorta, and magnetic resonance imaging studies of the brain, heart, and aorta. Although the Framingham cohort is primarily white, the importance of the major CVD risk factors identified in this group have been shown in other studies to apply almost universally among racial and ethnic groups, even though the patterns of distribution may vary from group to group. In the past half century, the Study has produced approximately 1,200 articles in leading medical journals. The concept of CVD risk factors has become an integral part of the modern medical curriculum and has led to the development of effective treatment and preventive strategies in clinical practice.\n\nIn addition to research studies focused on risk factors, subclinical CVD and clinically apparent CVD, Framingham investigators have also collaborated with leading researchers from around the country and throughout the world on projects involving some of the major chronic illnesses in men and women, including dementia, osteoporosis and arthritis, nutritional deficiencies, eye diseases, hearing disorders, and chronic obstructive lung diseases.\n\n**Genetic Research in the Framingham Heart Study.** While pursuing the Study's established research goals, the NHLBI and the Framingham investigators has expanded its research mission into the study of genetic factors underlying CVD and other disorders. Over the past two decades, DNA has been collected from blood samples and from immortalized cell lines obtained from Original Cohort participants, members of the Offspring Cohort and the Third Generation Cohort. Several large-scale genotyping projects have been conducted in the past decade. Genome-wide linkage analysis has been conducted using genotypes of approximately 400 microsatellite markers that have been completed in over 9,300 subjects in all three generations. Analyses using microsatellite markers completed in the original cohort and offspring cohorts have resulted in over 100 publications, including many publications from the Genetics Analysis Workshop 13. Several other recent collaborative projects have completed thousands of SNP genotypes for candidate gene regions in subsets of FHS subjects with available DNA. These projects include the Cardiogenomics Program of the NHLBI's Programs for Genomics Applications, the genotyping of ~3000 SNPs in inflammation genes, and the completion of a genome-wide scan of 100,000 SNPs using the Affymetrix 100K Genechip.\n\n**Framingham Cohort Phenotype Data.** The phenotype database contains a vast array of phenotype information available in all three generations. These will include the quantitative measures of the major risk factors such as systolic blood pressure, total and HDL cholesterol, fasting glucose, and cigarette use, as well as anthropomorphic measures such as body mass index, biomarkers such as fibrinogen and CRP, and electrocardiography measures such as the QT interval. Many of these measures have been collected repeatedly in the original and offspring cohorts. Also included in the SHARe database will be an array of recently collected biomarkers, subclinical disease imaging measures, clinical CVD outcomes as well as an array of ancillary studies. The phenotype data is located here in the top-level study phs000007 Framingham Cohort. To view the phenotype variables collected from the Framingham Cohort, please click on the "Variables" tab above. \n\n**The Framingham Cohort is utilized in the following dbGaP substudies.** To view genotypes, analysis, expression data, other molecular data, and derived variables collected in these substudies, please click on the following substudies below or in the "Substudies" section of this top-level study page phs000007 Framingham Cohort. - [phs000342](./study.cgi?study_id=phs000342) Framingham SHARe - [phs000282](./study.cgi?study_id=phs000282) Framingham CARe - [phs000363](./study.cgi?study_id=phs000363) Framingham SABRe - [phs000307](./study.cgi?study_id=phs000307) Framingham Medical Resequencing - [phs000401](./study.cgi?study_id=phs000401) Framingham ESP Heart-GO - [phs000651](./study.cgi?study_id=phs000651) Framingham CHARGE-S - [phs000724](./study.cgi?study_id=phs000724) Framingham DNA Methylation - [phs001610](./study.cgi?study_id=phs001610) Framingham T2D-GENES \n\nThe unflagging commitment of the research participants in the NHLBI FHS has made more than a half century of research success possible. For decades, the FHS has made its data and DNA widely available to qualified investigators throughout the world through the Limited Access Datasets and the FHS DNA Committee, and the SHARe database will continue that tradition by allowing access to qualified investigators who agree to the requirements of data access. With the SHARe database, we continue with an ambitious research agenda and look forward to new discoveries in the decades to come.\n', + "enrollment": [{"reference": "Group/phs000007.v32.p13-all-subjects"}], + "sponsor": { + "reference": "Organization/NHLBI", + "type": "Organization", + "display": "National Heart, Lung, and Blood Institute", + }, +}