diff --git a/.Rprofile b/.Rprofile index 407da0f4..67a0dad3 100644 --- a/.Rprofile +++ b/.Rprofile @@ -6,6 +6,9 @@ ) ) } - +# no needed if R >= 4.0.0 options(stringsAsFactors = FALSE) -source("renv/activate.R") + +# for local development +# change port number associated with your client, here +if (interactive()) options(shiny.port = 8100) diff --git a/.github/ISSUE_TEMPLATE/bug-report--app--.md b/.github/ISSUE_TEMPLATE/bug_report.md similarity index 71% rename from .github/ISSUE_TEMPLATE/bug-report--app--.md rename to .github/ISSUE_TEMPLATE/bug_report.md index f17e6797..f40079e0 100644 --- a/.github/ISSUE_TEMPLATE/bug-report--app--.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- -name: 'Bug report (app) ' -about: 'Create a report to help us improve the app. ' +name: Bug report +about: Create a report to help us improve title: '' labels: bug assignees: '' @@ -20,10 +20,15 @@ Steps to reproduce the behavior: **Expected behavior** A clear and concise description of what you expected to happen. +**Priority** (select one) +- [ ] Minor ⬇️ +- [ ] Major 📢 +- [ ] Critical 🆘 + **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** +**Desktop (if applicable, please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 11fc491e..483b0ec4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,8 @@ name: Feature request about: Suggest an idea for this project title: '' -labels: enhancement +======= +labels: '' assignees: '' --- @@ -13,8 +14,17 @@ A clear and concise description of what the problem is. Ex. I'm always frustrate **Describe the solution you'd like** A clear and concise description of what you want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +**How important is this feature?** Select from the options below: +• 🏝 Low - it's an enhancement but not crucial for work +• 🌗 Medium - can do work without it; but it's important (e.g. to save time or for convenience) +• 🌋 Important - it's a blocker and can't do work without it +**When will use cases depending on this become relevant?** Select from the options below: +• Short-term - 2-4 weeks +• Mid-term - 2-4 months +• Long-term - 6 months - 1 year + +**Additional context** +Add any other context or screenshots about the feature request here. **Additional context** Add any other context or screenshots about the feature request here. diff --git a/.github/schematic_config.yml b/.github/schematic_config.yml new file mode 100644 index 00000000..d9ca1a7f --- /dev/null +++ b/.github/schematic_config.yml @@ -0,0 +1,42 @@ +# During the github workflow to auto deploy the app +# This config file will be used to overwrite the config.yml in the schematic folder +# +# Please modify the configuration values based on your project + +# Do not change the 'definitions' section unless you know what you're doing +definitions: + synapse_config: '.synapseConfig' + creds_path: 'credentials.json' + token_pickle: 'token.pickle' + service_acct_creds: 'schematic_service_account_creds.json' + +synapse: + master_fileview: 'syn16858331' # fileview of project with datasets on Synapse + manifest_folder: 'manifests' # manifests will be downloaded to this folder + manifest_filename: 'synapse_storage_manifest.csv' # name of the manifest file in the project dataset + token_creds: 'syn21088684' # synapse ID of credentials.json file + service_acct_creds: 'syn25171627' # synapse ID of service_account_creds.json file + +manifest: + title: 'NF' + data_type: + - 'NF' + +model: + input: + download_url: 'https://raw.githubusercontent.com/nf-osi/nf-metadata-dictionary/v3.0.2/NF.jsonld' # url to download JSON-LD data model + location: 'data-models/NF.jsonld' # path to JSON-LD data model + file_type: 'local' # only type "local" is supported currently + +style: + google_manifest: + req_bg_color: + red: 0.9215 + green: 0.9725 + blue: 0.9803 + opt_bg_color: + red: 1.0 + green: 1.0 + blue: 0.9019 + master_template_id: '1LYS5qE4nV9jzcYw5sXwCza25slDfRA1CIg3cs-hCdpU' + strict_validation: false diff --git a/.github/set_gh_secrets.R b/.github/set_gh_secrets.R new file mode 100644 index 00000000..df72ff74 --- /dev/null +++ b/.github/set_gh_secrets.R @@ -0,0 +1,31 @@ +# require github cli package - 'gh': https://cli.github.com/manual/ + +args <- commandArgs(trailingOnly = TRUE) + +repo <- basename(Sys.getenv("PWD")) + +if (repo %in% c("schematic", "data-models")) stop("You are not in the data curator folder !!!") + +secret_lists <- yaml::yaml.load_file(toString(args[1]))$definitions +message("Assuming all definition files are stored in the schematic folder ...") + +for (f in c("synapse_config", "creds_path", "service_acct_creds")) { + system( + sprintf( + "gh secret set %s < %s", + toupper(paste0("schematic_", f)), file.path("schematic", secret_lists[f]) + ) + ) +} + +# token.pickle is a binary file +# If you want to manually add to the secret: +# 1. copy below code snippet and run it in the terminal +# 2. copy content from 'token.pickle.b64' to your github secret +system( + " + less schematic/token.pickle | base64 --wrap=0 > schematic/token.pickle.b64; + gh secret set SCHEMATIC_TOKEN_PICKLE < schematic/token.pickle.b64; + " +) +unlink("schematic/token.pickle.b64") \ No newline at end of file diff --git a/.github/workflows/shinyapps_deploy.yml b/.github/workflows/shinyapps_deploy.yml new file mode 100644 index 00000000..b609cbb8 --- /dev/null +++ b/.github/workflows/shinyapps_deploy.yml @@ -0,0 +1,108 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/master/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help + +name: shiny-deploy + +# TODO: remove `shiny-server-develop` when we use shinyapps.io as production site +# also consider to change shiny-server-main to main since we will not host in shinyServer +on: + push: + branches: + - develop # add develop for testing for now + tags: + - release* + paths-ignore: + - .github/ISSUE_TEMPLATE/** + +jobs: + shiny-deploy: + runs-on: ubuntu-latest + # This image seems to be based on rocker/r-ver which in turn is based on debian + container: rocker/rstudio + env: + # This should not be necessary for installing from public repo's however remotes::install_github() fails without it. + GITHUB_PAT: ${{ secrets.REPO_PAT }} + + steps: + - name: Install System Dependencies + run: | + sudo apt-get update + sudo apt-get install -y pip python3.8-venv libcurl4-openssl-dev + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-pandoc@v1 + + - name: Create and Activate Python Virtual Environment + shell: bash + run: | + python3 -m venv .venv + chmod 755 .venv/bin/activate + source .venv/bin/activate + - name: Install R Packages Dependencies + run: | + R -f install-pkgs.R + - name: Install Python Packages Dependencies + shell: bash + run: | + source .venv/bin/activate + pip3 install -r requirements.txt + - name: Install Schematic + shell: bash + run: | + source .venv/bin/activate + # use 'poetry' to install schematic from the develop branch + pip3 install poetry + git clone --single-branch --branch develop https://github.com/Sage-Bionetworks/schematic.git + cd schematic + poetry build + pip3 install dist/schematicpy-1.0.0-py3-none-any.whl + - name: Set Configurations for Schematic + shell: bash + run: | + source .venv/bin/activate + # download data model to the correct location + R -e ' + config <- yaml::yaml.load_file(".github/schematic_config.yml"); + url <- config$model$input$download_url; + path <- config$model$input$location; + system(sprintf("mkdir -p %s", dirname(path))); + system(sprintf("wget %s -O %s", url, path)); + ' + # overwrite the config.yml in schematic + mv -f .github/schematic_config.yml schematic/config.yml + # write out configuration files using github secrets + echo "${{ secrets.SCHEMATIC_SYNAPSE_CONFIG }}" > schematic/.synapseConfig + echo "${{ secrets.SCHEMATIC_SERVICE_ACCT_CREDS }}" > schematic/schematic_service_account_creds.json + echo "${{ secrets.SCHEMATIC_CREDS_PATH }}" > schematic/credentials.json + echo "${{ secrets.SCHEMATIC_TOKEN_PICKLE }}" | base64 -d > schematic/token.pickle + - name: zip virtual env + shell: bash + # ShinyApps has a limit of 7000 files, far exceeded by the many Python dependencies + # that this app' has. As a workaround we zip the virtual environment and later + # unzip it in 'global.R' + run: | + zip -rm .venv.zip .venv + - name: Authorize and deploy app + shell: Rscript {0} + run: | + branch <- Sys.getenv("GITHUB_REF_NAME") + repo <- Sys.getenv("GITHUB_REPOSITORY") + appName <- strsplit(repo, "/")[[1]][2] + if (!startsWith(branch, "release")) { + appName <- paste(appName, "staging", sep = "-") + } + rsConnectUser <- "${{ secrets.RSCONNECT_USER }}" + rsConnectToken <- "${{ secrets.RSCONNECT_TOKEN }}" + rsConnectSecret <- "${{ secrets.RSCONNECT_SECRET }}" + # create config file + config <- "CLIENT_ID: ${{ secrets.OAUTH_CLIENT_ID }}" + config <- c(config, "CLIENT_SECRET: ${{ secrets.OAUTH_CLIENT_SECRET }}") + appUrl <- sprintf("https://%s.shinyapps.io/%s", rsConnectUser, appName) + config <- c(config, sprintf("APP_URL: %s", appUrl)) + configFileConn <- file("oauth_config.yml") + tryCatch( + writeLines(config, configFileConn), + finally=close(configFileConn) + ) + rsconnect::setAccountInfo(rsConnectUser, rsConnectToken, rsConnectSecret) + rsconnect::deployApp(appName = appName) diff --git a/.gitignore b/.gitignore index 74c7ad97..dab873e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .RData .Rhistory .Rproj.user/ +.DS_Store HTAN_test_shiny.Rproj app.bak.R get_manifest_anno.R @@ -9,14 +10,15 @@ www/bootstrap.css www/bootstrap.min.css www/getdata.js www/message-handler.js -files/synapse_storage_manifest.csv +tmp/synapse_storage_manifest.csv .Rproj.user -schematic/schema_explorer/__pycache__/* -schematic/__pycache__/* -schematic/.DS_Store -schematic/credentials.json -schematic/token.pickle -credentials.json -token.pickle +schematic/ +**/credentials.json +**/schematic_service_account_creds.json +**/token.pickle **/__pycache__ -config.yaml +oauth_config.yml +.project +.settings/** +.venv +data-models/ diff --git a/README.md b/README.md index b9a0e40e..8412fa62 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ - -\**Please note, "releases" only pertain to changes in the JSON-LD schema file.** - # NF Data Curator App ## Introduction @@ -11,53 +8,86 @@ The _Data Curator App_ is an R Shiny app that serves as the _frontend_ to the sc There are two editions of the front end: -- https://shiny.synapse.org/users/rallaway/NF_data_curator_staging/ (pulling from the `develop` branch) -- https://shiny.synapse.org/users/rallaway/NF_data_curator/ (pulling from the `production` branch) - -## Setup +TO UPDATE TO SHINYAPPS.IO DETAILS ### Data Curator App Setup -Follow the steps below to make sure the _Data Curator App_ is fully setup to work with the [schematic](https://github.com/Sage-Bionetworks/schematic/tree/main): -\ - git clone --single-branch --branch production https://github.com/nf-osi/NF_data_curator.git +Follow the steps below to run locally. + +1. Clone this repo (front-end) with one single branch (i.e., _main_): + + git clone --single-branch --branch main https://github.com/nf-osi/NF_data_curator.git -Create a conda environment in the cloned directory from the `environment.yml` file which has all the required package dependencies: +2. Create and modify the configuration file ([How to obtain OAuth Credential](https://github.com/Sage-Bionetworks/data_curator#Authentication)): - conda env create -f environment.yml + cp example_oauth_config.yml oauth_config.yml + chmod 400 oauth_config.yml -Here, our conda environment name `data_curator_env` is set from the `environment.yml` file . +3. Create and activate a virtual environment within which you can install the package: -Activate the `data_curator_env` environment: + python -m venv .venv + source .venv/bin/activate - conda activate data_curator_env +4. Install required Python pacakges dependencies: + pip install -r requirements.txt + +5. Install required R pacakges dependencies: + + R -f install-pkgs.R ### Schematic Setup -The next step is to install the latest release of the [schematic](https://github.com/Sage-Bionetworks/schematic/tree/main) (backend) as a folder `schematic` inside the `data_curator` folder and tie it together with this frontend. -To do so, follow the instructions on the `schematic` repository [README](https://github.com/Sage-Bionetworks/schematic/tree/develop#12-installation-requirements-and-pre-requisites). +1. Clone the [schematic] (backend) as a folder `schematic` inside the `data_curator` folder: + + git clone --single-branch --branch develop https://github.com/Sage-Bionetworks/schematic.git + +2. Install the latest release of the `schematic` via `pip`. IF NOT USING CONDA, install the devel version below: + + python -m pip install schematicpy + + For development and test with the latest update from `schematic`, install the `schematic` via [poetry]: + + cd schematic + poetry build + pip install dist/schematicpy-1.0.0-py3-none-any.whl + +3. Set up the `schematic` configuration. To do so, follow the instructions on the [schematic's documentation](https://sage-schematic.readthedocs.io/en/develop/index.html#package-installation-and-setup) + +### Data Model Configuration + +Use the app configuration file `www/config.json` to adapt this app to your DCC. + +- `manifest schemas`: defines the list of schemas displayed under the "Choose a Metadata Template Type:" dropdown in the application. + - `display_name` : The display name for the dropdown. (e.g. _scRNA-seq Level 1_) + - `schema_name`: The name of the manifest in the JSON-LD schema (e.g. _ScRNA-seqLevel1_) + - `type`: The type of manifest. As currently configured in `app.R`, will only display manifests of type _assay_. +- `main_fileview` : The Synapse ID of a fileview that is scoped to all files, folders, & projects in your community. (e.g. _syn20446927_) +- `community` : the abbreviated name of the community or project. (e.g. _HTAN_) + +--- +## Authentication -### App Configuration File +This utilizes a Synapse Authentication (OAuth) client (code motivated by [ShinyOAuthExample](https://github.com/brucehoff/ShinyOAuthExample) and [app.R](https://gist.github.com/jcheng5/44bd750764713b5a1df7d9daf5538aea). Each application is required to have its own OAuth client as these clients cannot be shared between one another. View instructions [here](https://docs.synapse.org/articles/using_synapse_as_an_oauth_server.html) to learn how to request a client. Once you obtain the client, make sure to add it to the configuration yaml file: -Use the app configuration file `www/config.json` to adapt this app to your DCC. +- `CLIENT_ID` and `CLIENT_SECRET` +- `APP_URL`: the redirection url to your app -* `manifest schemas`: defines the list of schemas displayed under the "Choose a Metadata Template Type:" dropdown in the application. - * `display_name` : The display name for the dropdown. (e.g. _scRNA-seq Level 1_) - * `schema_name`: The name of the manifest in the JSON-LD schema (e.g. _ScRNA-seqLevel1_) - * `type`: The type of manifest. As currently configured in `app.R`, will only display manifests of type _assay_. +--- -* `main_fileview` : The Synapse ID of a fileview that is scoped to all files, folders, & projects in your community. (e.g. _syn20446927_) -* `community` : the abbreviated name of the community or project. (e.g. _HTAN_) +## Contributors +Main contributors and developers: -### Authentication (OAuth) +- [Rongrong Chai](https://github.com/rrchai) +- [Xengie Doan](https://github.com/xdoan) +- [Milen Nikolov](https://github.com/milen-sage) +- [Sujay Patil](https://github.com/sujaypatil96) +- [Robert Allaway](https://github.com/allaway) +- [Bruno Grande](https://github.com/BrunoGrandePhD) -This utilizes a Synapse OAuth client (code motivated by [ShinyOAuthExample](https://github.com/brucehoff/ShinyOAuthExample) and [app.R](https://gist.github.com/jcheng5/44bd750764713b5a1df7d9daf5538aea). Each application is required to have its own OAuth client as these clients cannot be shared between one another. View instructions [here](https://docs.synapse.org/articles/using_synapse_as_an_oauth_server.html) to learn how to request a client. Once you obtain the `client_id` and `client_secret` make sure to add it to the configuration file. + -``` -cp example_config.yaml config.yaml -# Edit config.yaml -chmod 400 config.yaml -``` \ No newline at end of file +[schematic]: https://github.com/Sage-Bionetworks/schematic/tree/develop +[poetry]: https://github.com/python-poetry/poetry diff --git a/config.yml b/config.yml deleted file mode 100644 index c07f30c9..00000000 --- a/config.yml +++ /dev/null @@ -1,37 +0,0 @@ -# Do not change the 'definitions' section unless you know what you're doing -definitions: - synapse_config: ".synapseConfig" - creds_path: "credentials.json" - token_pickle: "token.pickle" - service_acct_creds: "schematic_service_account_creds.json" - -synapse: - master_fileview: 'syn16858331' - manifest_folder: 'manifests' - manifest_filename: 'data/manifests/synapse_storage_manifest.csv' - token_creds: 'syn21088684' - service_acct_creds: 'syn25171627' - -manifest: - title: 'NF' - data_type: 'NF' - -model: - input: - location: 'NF.jsonld' - file_type: 'local' - validation_schema: 'data/validation_schemas/example_validation_schema.json' - log_location: 'data/json_schema_logs/json_schema_log.json' - -style: - google_manifest: - req_bg_color: - red: 0.9215 - green: 0.9725 - blue: 0.9803 - opt_bg_color: - red: 1.0 - green: 1.0 - blue: 0.9019 - master_template_id: '1LYS5qE4nV9jzcYw5sXwCza25slDfRA1CIg3cs-hCdpU' - strict_validation: false diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 325783c6..00000000 --- a/environment.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: data_curator_env_oauth -channels: - - defaults -dependencies: - - _libgcc_mutex=0.1=main - - ca-certificates=2020.6.24=0 - - cairo=1.14.12=h7636065_2 - - certifi=2020.6.20=py37_0 - - expat=2.2.9=he6710b0_2 - - fontconfig=2.12.6=h49f89f6_0 - - freetype=2.8=hab7d2ae_1 - - fribidi=1.0.9=h7b6447c_0 - - glib=2.65.0=h3eb4bd4_0 - - graphite2=1.3.14=h23475e2_0 - - graphviz=2.40.1=h25d223c_0 - - harfbuzz=1.7.6=h5f0a787_1 - - icu=58.2=he6710b0_3 - - jpeg=9b=h024ee3a_2 - - ld_impl_linux-64=2.33.1=h53a641e_7 - - libedit=3.1.20191231=h7b6447c_0 - - libffi=3.3=he6710b0_2 - - libgcc-ng=9.1.0=hdf63c60_0 - - libpng=1.6.37=hbc83047_0 - - libstdcxx-ng=9.1.0=hdf63c60_0 - - libtiff=4.1.0=h2733197_1 - - libtool=2.4.6=h7b6447c_5 - - libxcb=1.14=h7b6447c_0 - - libxml2=2.9.10=he19cac6_1 - - lz4-c=1.9.2=he6710b0_0 - - ncurses=6.2=he6710b0_1 - - openssl=1.1.1g=h7b6447c_0 - - pango=1.42.0=h377f3fa_0 - - pcre=8.44=he6710b0_0 - - pip=20.1.1=py37_1 - - pixman=0.40.0=h7b6447c_0 - - python=3.7.7=hcff3b4d_5 - - python-graphviz=0.8.4=py37_1 - - readline=8.0=h7b6447c_0 - - setuptools=47.3.1=py37_0 - - sqlite=3.32.3=h62c20be_0 - - tk=8.6.10=hbc83047_0 - - wheel=0.34.2=py37_0 - - xz=5.2.5=h7b6447c_0 - - zlib=1.2.11=h7b6447c_3 - - zstd=1.4.5=h0b5b093_0 - - pip: - - attrs==19.3.0 - - cachetools==4.1.1 - - cffi==1.14.0 - - chardet==3.0.4 - - cryptography==2.9.2 - - decorator==4.4.2 - - deprecated==1.2.4 - - entrypoints==0.3 - - fastjsonschema==2.14.4 - - google-api-python-client==1.7.9 - - google-auth==1.19.1 - - google-auth-httplib2==0.0.3 - - google-auth-oauthlib==0.4.0 - - httplib2==0.18.1 - - idna==2.10 - - importlib-metadata==1.7.0 - - inflection==0.3.1 - - isodate==0.6.0 - - jsonschema==3.2.0 - - keyring==12.0.2 - - keyrings-alt==3.1 - - networkx==2.4 - - numpy==1.19.0 - - oauth2client==4.1.3 - - oauthlib==3.1.0 - - orderedset==2.0.1 - - pandas==1.0.5 - - pyasn1==0.4.8 - - pyasn1-modules==0.2.8 - - pycparser==2.20 - - pygsheets==2.0.3.1 - - pyparsing==2.4.7 - - pyrsistent==0.16.0 - - python-dateutil==2.8.1 - - pytz==2020.1 - - rdflib==4.2.2 - - requests==2.24.0 - - requests-oauthlib==1.3.0 - - rsa==4.6 - - secretstorage==2.3.1 - - six==1.15.0 - - synapseclient==2.1.0 - - tabletext==0.1 - - uritemplate==3.0.1 - - urllib3==1.25.9 - - wrapt==1.12.1 - - zipp==3.1.0 - - pyyaml==5.3.1 -prefix: /home/xdoan/bin/home/xdoan/bin/miniconda3/envs/data_curator_env - diff --git a/example_config.yaml b/example_config.yaml deleted file mode 100644 index 3908931e..00000000 --- a/example_config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# This file contains the oauth client id and secret required for -# the application. This file needs to have chmod 400 permissions -# client_id and APP_URL has to be a string -client_id: -client_secret: -APP_URL: diff --git a/example_oauth_config.yml b/example_oauth_config.yml new file mode 100644 index 00000000..aa7431c4 --- /dev/null +++ b/example_oauth_config.yml @@ -0,0 +1,9 @@ +# This file needs to have chmod 400 permissions + +# oauth client id and secret required for the application. +CLIENT_ID: '' +CLIENT_SECRET: '' + +# url of your deployed app +# for local testing, change port based on your OAuth Client's redirect_uri, e.g. https://localhost:8100/ +APP_URL: '' diff --git a/files/synapse_storage_manifest.csv b/files/synapse_storage_manifest.csv index 5bba5bde..e2337186 100644 --- a/files/synapse_storage_manifest.csv +++ b/files/synapse_storage_manifest.csv @@ -1 +1,215 @@ -Component,Filename,File Format,HTAN Parent Biospecimen ID,HTAN Data File ID,Nucleic Acid Source,Cryopreserved Cells in Sample,Single Cell Isolation Method,Dissociation Method,Library Construction Method,Read1,Read2,End Bias,Reverse Transcription Primer,Spike In,Sequencing Platform,Total Number of Input Cells,Input Cells and Nuclei,Library Preparation Date,Single Cell Dissociation Date,Sequencing Library Construction Date,Nucleic Acid Capture Date,Protocol Link,Technical Replicate Group,Both Spike in Mixes,Cell Barcode Length,Cell Barcode Offset,Empty Well Barcode,Feature Reference Id,Median UMIs per Cell Number,Spike In Concentration,Spike In Mix 1,Spike In Mix 2,UMI Barcode Length,UMI Barcode Offset,Valid Barcodes Cell Number,Well Index,cDNA Length,cDNA Offset,entityId +"Biospecimen description","Component","HTAN Biospecimen ID","HTAN Parent ID","Timepoint Label","Collection Days from Index","Adjacent Biospecimen IDs","Biospecimen Type","Acquisition Method Type","Fixative Type","Site of Resection or Biopsy","Storage Method","Processing Days from Index","Protocol Link","Site Data Source","Collection Media","Mounting Medium","Processing Location","Histology Assessment By","Histology Assessment Medium","Preinvasive Morphology","Tumor Infiltrating Lymphocytes","Degree of Dysplasia","Dysplasia Fraction","Number Proliferating Cells","Percent Eosinophil Infiltration","Percent Granulocyte Infiltration","Percent Inflam Infiltration","Percent Lymphocyte Infiltration","Percent Monocyte Infiltration","Percent Necrosis","Percent Neutrophil Infiltration","Percent Normal Cells","Percent Stromal Cells","Percent Viable cells","Percent Fibrosis","Percent Tumor Cells","Percent Tumor Nuclei","Fiducial Marker","Slicing Method","Lysis Buffer","Method of Nucleic Acid Isolation","Acquisition Method Other Specify","Analyte Type","Fixation Duration","Histologic Morphology Code","Ischemic Temperature","Ischemic Time","Portion Weight","Preservation Method","Section Thickness Value","Sectioning Days from Index","Shipping Condition Type","Slide Charge Type","Specimen Laterality","Total Volume","Tumor Tissue Type","Sectioning Substrate type","Serial section number","Interval of time between removal from the body and tissue is placed in media (minutes)","Interval of time between removal from the body and tissue is frozen (minutes)","Interval of time between removal from the body and tissue is fixed (minutes)" +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_203_332","HTA1_203","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","22747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_203_3321","HTA1_203_332","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","22747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,54,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_203_332101","HTA1_203_332102","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","22747","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_203_332102","HTA1_203_3321","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","22747","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_203_3323","HTA1_203_332","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","22747","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,155, +"tumor WES (from OCT piece)","Biospecimen","HTA1_203_332301","HTA1_203_3323","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","22877","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_203_332302","HTA1_203_3323","Not recorded","22747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","23075","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_203_0001","HTA1_203","Not recorded","22745",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","22745","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_203_00015","HTA1_203_0001","Not recorded","22745",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","22745","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_203_0001501","HTA1_203_00015","Not recorded","22745",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","22877","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_339_1112","HTA1_339","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","30180","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_339_11121","HTA1_339_1112","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","30180","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,20,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_339_1112101","HTA1_339_1112103","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30180","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_339_1112102","HTA1_339_1112103","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30180","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-enrichment-of-epcam-cells-from-single-cell-s-bucfnstn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 3 (from fresh piece)","Biospecimen","HTA1_339_1112103","HTA1_339_11121","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30180","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_339_11123","HTA1_339_1112","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","30180","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,168, +"tumor WES (from OCT piece)","Biospecimen","HTA1_339_1112301","HTA1_339_11123","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30275","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_339_1112302","HTA1_339_11123","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30473","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_339_11126","HTA1_339_1112","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30180","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,170, +"OCT section for Visium QC H&E","Biospecimen","HTA1_339_1112603","HTA1_339_11126","Not recorded","30180",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30793","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,20,50,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30793,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - A","Biospecimen","HTA1_339_1112604","HTA1_339_11126","Not recorded","30180","HTA1_339_1112305","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30808","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30807,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - B","Biospecimen","HTA1_339_1112605","HTA1_339_11126","Not recorded","30180","HTA1_339_1112304, HTA1_339_1112306","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30808","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30807,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"OCT section for Visium/H&E - C","Biospecimen","HTA1_339_1112606","HTA1_339_11126","Not recorded","30180","HTA1_339_1112305, HTA1_339_1112307","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30808","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30807,,,"Right",,"Primary","Visium spatial gene expression slide",3,,, +"OCT section for Visium/H&E - D","Biospecimen","HTA1_339_1112607","HTA1_339_11126","Not recorded","30180","HTA1_339_1112306","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30808","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30807,,,"Right",,"Primary","Visium spatial gene expression slide",4,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_339_0001","HTA1_339","Not recorded","30173",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","30173","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_339_00015","HTA1_339_0001","Not recorded","30173",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","30173","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_339_0001501","HTA1_339_00015","Not recorded","30173",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","30275","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_661_3572","HTA1_661","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","24529","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_661_35721","HTA1_661_3572","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","24529","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,38,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_661_3572101","HTA1_661_3572102","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24529","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_661_3572102","HTA1_661_35721","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24529","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_661_35723","HTA1_661_3572","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","24529","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,166, +"tumor WES (from OCT piece)","Biospecimen","HTA1_661_3572301","HTA1_661_35723","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24735","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_661_3572302","HTA1_661_35723","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24775","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_661_35726","HTA1_661_3572","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","24529","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,166, +"OCT section for Visium QC H&E","Biospecimen","HTA1_661_3572603","HTA1_661_35726","Not recorded","24529",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25095","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,10,60,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,25095,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - C","Biospecimen","HTA1_661_3572604","HTA1_661_35726","Not recorded","24529","HTA1_661_3572305","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25110","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,25109,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - D","Biospecimen","HTA1_661_3572605","HTA1_661_35726","Not recorded","24529","HTA1_661_3572304","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25110","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,25109,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_661_0001","HTA1_661","Not recorded","24585",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","24585","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_661_00015","HTA1_661_0001","Not recorded","24585",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","24585","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_661_0001501","HTA1_661_00015","Not recorded","24585",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","24735","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_663_3631","HTA1_663","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","21608","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Left",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_663_36311","HTA1_663_3631","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","21608","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Left",,"Primary",,,46,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_663_3631101","HTA1_663_36311","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","21608","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Left",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_663_36313","HTA1_663_3631","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","21608","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Left",,"Primary",,,,134, +"tumor WES (from OCT piece)","Biospecimen","HTA1_663_3631301","HTA1_663_36313","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21832","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Left",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_663_3631302","HTA1_663_36313","Not recorded","21608",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","22030","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Left",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_663_0001","HTA1_663","Not recorded","21584",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","21584","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_663_00015","HTA1_663_0001","Not recorded","21584",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","21584","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_663_0001501","HTA1_663_00015","Not recorded","21584",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","21832","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_734_3812","HTA1_734","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","26450","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_734_38121","HTA1_734_3812","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","26450","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,57,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_734_3812101","HTA1_734_3812102","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","26450","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_734_3812102","HTA1_734_38121","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","26450","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_734_38123","HTA1_734_3812","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","26450","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,236, +"tumor WES (from OCT piece)","Biospecimen","HTA1_734_3812301","HTA1_734_38123","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","26629","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_734_3812302","HTA1_734_38123","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","26669","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_734_38126","HTA1_734_3812","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","26450","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,236, +"OCT section for Visium QC H&E","Biospecimen","HTA1_734_3812603","HTA1_734_38126","Not recorded","26450",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","26989","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,5,60,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,26989,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - A","Biospecimen","HTA1_734_3812604","HTA1_734_38126","Not recorded","26450","HTA1_734_3812305","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","27004","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,27003,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - B","Biospecimen","HTA1_734_3812605","HTA1_734_38126","Not recorded","26450","HTA1_734_3812304","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","27004","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,27003,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_734_0001","HTA1_734","Not recorded","26445",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","26445","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_734_00015","HTA1_734_0001","Not recorded","26445",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","26445","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_734_0001501","HTA1_734_00015","Not recorded","26445",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","26629","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_791_4172","HTA1_791","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","29929","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_791_41721","HTA1_791_4172","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","29929","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,48,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_791_4172101","HTA1_791_4172102","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","29929","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_791_4172102","HTA1_791_41721","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","29929","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_791_41722","HTA1_791_4172","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","29929","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,199, +"tumor WES (from OCT piece)","Biospecimen","HTA1_791_4172201","HTA1_791_41722","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30099","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_791_4172202","HTA1_791_41722","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30139","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_791_41726","HTA1_791_4172","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","29929","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,201, +"OCT section for Visium QC H&E","Biospecimen","HTA1_791_4172603","HTA1_791_41726","Not recorded","29929",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30459","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,40,20,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30459,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - A","Biospecimen","HTA1_791_4172604","HTA1_791_41726","Not recorded","29929","HTA1_791_4172305","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30474","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30473,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - B","Biospecimen","HTA1_791_4172605","HTA1_791_41726","Not recorded","29929","HTA1_791_4172304","Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","30474","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,30473,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_791_0001","HTA1_791","Not recorded","29921",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","29921","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_791_00015","HTA1_791_0001","Not recorded","29921",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","29921","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_791_0001501","HTA1_791_00015","Not recorded","29921",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","30099","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_822_6908","HTA1_822","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","Fresh","28998","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_822_69081","HTA1_822_6908","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","Fresh","28998","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,70,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_822_6908101","HTA1_822_6908102","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","28998","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_822_6908102","HTA1_822_69081","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","28998","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_822_69083","HTA1_822_6908","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","Frozen at -80C","28998","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,142, +"tumor WES (from OCT piece)","Biospecimen","HTA1_822_6908301","HTA1_822_69083","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","29435","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_822_69086","HTA1_822_6908","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","Frozen at -80C","28998","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,142, +"OCT section for Visium QC H&E","Biospecimen","HTA1_822_6908603","HTA1_822_69086","Not recorded","28998",,"Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","29505","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,10,,,,90,30,30,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,29505,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - C","Biospecimen","HTA1_822_6908604","HTA1_822_69086","Not recorded","28998","HTA1_822_6908305","Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","29520","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,29519,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - D","Biospecimen","HTA1_822_6908605","HTA1_822_69086","Not recorded","28998","HTA1_822_6908304","Tissue Biospecimen Type","Surgical Resection","None","Middle lobe lung","unknown","29520","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,29519,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_822_0001","HTA1_822","Not recorded","28998",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","28998","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_822_00015","HTA1_822_0001","Not recorded","28998",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","28998","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_822_0001501","HTA1_822_00015","Not recorded","28998",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","29435","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_921_4561","HTA1_921","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","25023","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_921_45611","HTA1_921_4561","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","25023","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,48,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_921_4561101","HTA1_921_45611","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25023","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_921_45613","HTA1_921_4561","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","25023","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,154, +"tumor WES (from OCT piece)","Biospecimen","HTA1_921_4561301","HTA1_921_45613","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25190","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_921_4561302","HTA1_921_45613","Not recorded","25023",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","25388","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_921_0001","HTA1_921","Not recorded","25023",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","25023","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_921_00015","HTA1_921_0001","Not recorded","25023",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","25023","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_921_0001501","HTA1_921_00015","Not recorded","25023",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","25190","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_937_7969","HTA1_937","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","20486","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_937_79691","HTA1_937_7969","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","20486","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,32,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_937_7969101","HTA1_937_7969102","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20486","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_937_7969102","HTA1_937_79691","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20486","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_937_79693","HTA1_937_7969","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","20486","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,118, +"tumor WES (from OCT piece)","Biospecimen","HTA1_937_7969301","HTA1_937_79693","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20595","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_937_79696","HTA1_937_7969","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","20486","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,120, +"OCT section for Visium QC H&E","Biospecimen","HTA1_937_7969603","HTA1_937_79696","Not recorded","20486",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20955","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,5,90,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,20955,,,"Right",,"Primary","Superfrost microscope glass slide",,,, +"OCT section for Visium/H&E - A","Biospecimen","HTA1_937_7969604","HTA1_937_79696","Not recorded","20486","HTA1_937_7969305","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20970","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,20969,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - B","Biospecimen","HTA1_937_7969605","HTA1_937_79696","Not recorded","20486","HTA1_937_7969304","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","20970","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,"8140/3",,,,"OCT",10,20969,,,"Right",,"Primary","Visium spatial gene expression slide",2,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_937_0001","HTA1_937","Not recorded","20524",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","20524","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_937_00015","HTA1_937_0001","Not recorded","20524",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","20524","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_937_0001501","HTA1_937_00015","Not recorded","20524",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","20595","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_962_4711","HTA1_962","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","28954","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_962_47111","HTA1_962_4711","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","28954","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh",,,,,"Right",,"Primary",,,42,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_962_4711101","HTA1_962_4711102","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","28954","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_962_4711102","HTA1_962_47111","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","28954","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_962_47112","HTA1_962_4711","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","28954","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,155, +"tumor WES (from OCT piece)","Biospecimen","HTA1_962_4711201","HTA1_962_47112","Not recorded","28954",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","29357","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8140/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_962_0001","HTA1_962","Not recorded","29267",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","29267","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,,,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_962_00015","HTA1_962_0001","Not recorded","29267",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Frozen at -80C","29267","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_962_0001501","HTA1_962_00015","Not recorded","29267",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","unknown","29357","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Negative 80 Deg C",,,"Dry Ice",,,,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_261_4801","HTA1_261","Not recorded","31231 ",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","31231 ","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8480/3",,,,"Fresh",,,,,"unknown",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_261_48011","HTA1_261_4801","Not recorded","31231 ",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","31231 ","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8480/3",,,,"Fresh",,,,,"unknown","Primary","Primary",,,20,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_261_4801101","HTA1_261_48011","Not recorded","31231 ",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","31231 ","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8480/3",,,,"Fresh dissociated",,,,,"unknown","Primary","Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_261_48013","HTA1_261_4801","Not recorded","31231 ",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","31231 ","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8480/3",,,,"OCT",,,,,"unknown","Primary","Primary",,,,130, +"tumor WES (from OCT piece)","Biospecimen","HTA1_261_4801301","HTA1_261_48013","Not recorded","31231 ",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","32002","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8480/3",,,,"OCT",,,,,"unknown","Primary","Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_261_0001","HTA1_261","Not recorded","31231 ",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","31231 ","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_261_00015","HTA1_261_0001","Not recorded","31231 ",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","31231 ","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_261_0001501","HTA1_261_00015","Not recorded","31231 ",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","32006","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_274_4891","HTA1_274","Not recorded","22879",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","22879","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"unknown",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_274_48911","HTA1_274_4891","Not recorded","22879",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","22879","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"unknown",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_274_4891101","HTA1_274_48911","Not recorded","22879",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","22879","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh dissociated",,,,,"unknown",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_274_48913","HTA1_274_4891","Not recorded","22879",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","22879","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"unknown",,"Primary",,,,120, +"tumor WES (from OCT piece)","Biospecimen","HTA1_274_4891301","HTA1_274_48913","Not recorded","22879",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","23157","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"unknown",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_274_0001","HTA1_274","Not recorded","22879",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","22879","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_274_00015","HTA1_274_0001","Not recorded","22879",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","22879","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_274_0001501","HTA1_274_00015","Not recorded","22879",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","23223","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_293_5041","HTA1_293","Not recorded","26551",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","26551","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_293_50411","HTA1_293_5041","Not recorded","26551",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","26551","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"Right",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_293_5041101","HTA1_293_50411","Not recorded","26551",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","26551","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_293_50413","HTA1_293_5041","Not recorded","26551",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","26551","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"Right",,"Primary",,,,113, +"tumor WES (from OCT piece)","Biospecimen","HTA1_293_5041301","HTA1_293_50413","Not recorded","26551",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","26809","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_293_0001","HTA1_293","Not recorded","26551",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","26551","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_293_00015","HTA1_293_0001","Not recorded","26551",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","26551","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_293_0001501","HTA1_293_00015","Not recorded","26551",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","26834","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_322_5071","HTA1_322","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","21079","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh",,,,,"Left",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_322_50711","HTA1_322_5071","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","21079","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh",,,,,"Left",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_322_5071101","HTA1_322_50711","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21079","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh dissociated",,,,,"Left",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_322_50713","HTA1_322_5071","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","21079","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"Left",,"Primary",,,,90, +"tumor WES (from OCT piece)","Biospecimen","HTA1_322_5071301","HTA1_322_50713","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21330","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"Left",,"Primary",,,,, +"tumor bulk RNA-Seq (from OCT piece)","Biospecimen","HTA1_322_5071302","HTA1_322_50713","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21528","Pending",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"Left",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_322_50716","HTA1_322_5071","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -150C","21079","Pending",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"Left",,"Primary",,,,37, +"OCT section for Visium QC H&E","Biospecimen","HTA1_322_5071603","HTA1_322_50716","Not recorded","21079",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21862","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,10,,,,90,5,20,,,"Cryosectioning",,,,,,"8260/3",,,,"OCT",10,21862,,,"Left",,"Primary","Superfrost microscope slide",,,, +"OCT section for Visium/H&E - C","Biospecimen","HTA1_322_5071604","HTA1_322_50716","Not recorded","21079","HTA1_322_5071305","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21873","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8260/3",,,,"OCT",10,21873,,,"Left",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - D","Biospecimen","HTA1_322_5071605","HTA1_322_50716","Not recorded","21079","HTA1_322_5071304","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","21873","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8260/3",,,,"OCT",10,21873,,,"Left",,"Primary","Visium spatial gene expression slide",5,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_322_0001","HTA1_322","Not recorded","21079",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","21079","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_322_00015","HTA1_322_0001","Not recorded","21079",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","21079","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_322_0001501","HTA1_322_00015","Not recorded","21079",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","21355","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_324_5101","HTA1_324","Not recorded","24747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","24747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_324_51011","HTA1_324_5101","Not recorded","24747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","24747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"Right",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_324_5101101","HTA1_324_51011","Not recorded","24747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24747","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_324_51013","HTA1_324_5101","Not recorded","24747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","24747","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"Right",,"Primary",,,,140, +"tumor WES (from OCT piece)","Biospecimen","HTA1_324_5101301","HTA1_324_51013","Not recorded","24747",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","24983","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"Right",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_324_0001","HTA1_324","Not recorded","24747",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","24747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_324_00015","HTA1_324_0001","Not recorded","24747",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","24747","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_324_0001501","HTA1_324_00015","Not recorded","24747",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","25049","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_331_5161","HTA1_331","Not recorded","27316",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","27316","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh",,,,,"unknown",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_331_51611","HTA1_331_5161","Not recorded","27316",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","27316","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh",,,,,"unknown",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_331_5161101","HTA1_331_51611","Not recorded","27316",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","27316","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"Fresh dissociated",,,,,"unknown",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_331_51613","HTA1_331_5161","Not recorded","27316",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","27316","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"unknown",,"Primary",,,,103, +"tumor WES (from OCT piece)","Biospecimen","HTA1_331_5161301","HTA1_331_51613","Not recorded","27316",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","27540","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8260/3",,,,"OCT",,,,,"unknown",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_331_0001","HTA1_331","Not recorded","27316",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","27316","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_331_00015","HTA1_331_0001","Not recorded","27316",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","27316","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_331_0001501","HTA1_331_00015","Not recorded","27316",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","27565","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_336_5221","HTA1_336","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","30261","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Fresh",,,,,"Right",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_336_52211","HTA1_336_5221","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","30261","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Fresh",,,,,"Right",,"Primary",,,0,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_336_5221101","HTA1_336_52211","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","30261","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"10x channels protocol/condition 2 (from fresh piece)","Biospecimen","HTA1_336_5221102","HTA1_336_5221101","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","30261","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw, https://www.protocols.io/view/htapp-depletion-of-cd45-cells-from-single-cell-sus-bjxjkpkn",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Fresh dissociated",,,,,"Right",,"Primary",,,,, +"snap frozen piece","Biospecimen","HTA1_336_52212","HTA1_336_5221","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -150C","30261","Pending",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Snap Frozen",,,,,"Right",,"Primary",,,,99, +"tumor WES (from frozen piece)","Biospecimen","HTA1_336_5221201","HTA1_336_52212","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","30911","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"Snap Frozen",,,,,"Right",,"Primary",,,,, +"OCT piece for spatial work","Biospecimen","HTA1_336_52213","HTA1_336_5221","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -150C","30261","Pending",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8574/3",,,,"OCT",,,,,"Right",,"Primary",,,,58, +"OCT section for Visium QC H&E","Biospecimen","HTA1_336_5221303","HTA1_336_52213","Not recorded","30261",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","30994","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,"Pathologist",,,,,,,,,,,,0,,,,100,5,30,,,"Cryosectioning",,,,,,"8574/3",,,,"OCT",10,30994,,,"Right",,"Primary","Superfrost microscope slide",,,, +"OCT section for Visium/H&E - A","Biospecimen","HTA1_336_5221304","HTA1_336_52213","Not recorded","30261","HTA1_336_5221305","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","31005","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8574/3",,,,"OCT",10,31005,,,"Right",,"Primary","Visium spatial gene expression slide",1,,, +"OCT section for Visium/H&E - B","Biospecimen","HTA1_336_5221305","HTA1_336_52213","Not recorded","30261","HTA1_336_5221304, HTA1_336_5221306","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","31005","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8574/3",,,,"OCT",10,31005,,,"Right",,"Primary","Visium spatial gene expression slide",3,,, +"OCT section for Visium/H&E - C","Biospecimen","HTA1_336_5221306","HTA1_336_52213","Not recorded","30261","HTA1_336_5221305, HTA1_336_5221307","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","31005","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8574/3",,,,"OCT",10,31005,,,"Right",,"Primary","Visium spatial gene expression slide",5,,, +"OCT section for Visium/H&E - D","Biospecimen","HTA1_336_5221307","HTA1_336_52213","Not recorded","30261","HTA1_336_5221306","Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","31005","https://www.protocols.io/view/htapp-oct-embedded-frozen-tissue-sectioning-and-mo-bqm3mu8n",,,,,,,,,,,,,,,,,,,,,,,,,,"Cryosectioning",,,,,,"8574/3",,,,"OCT",10,31005,,,"Right",,"Primary","Visium spatial gene expression slide",7,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_336_0001","HTA1_336","Not recorded","30261",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","30261","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_336_00015","HTA1_336_0001","Not recorded","30261",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","30261","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_336_0001501","HTA1_336_00015","Not recorded","30261",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","30911","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_337_5251","HTA1_337","Not recorded","23330",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","23330","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8070/3",,,,"Fresh",,,,,"unknown",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_337_52511","HTA1_337_5251","Not recorded","23330",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","23330","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8070/3",,,,"Fresh",,,,,"unknown",,"Primary",,,44,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_337_5251101","HTA1_337_52511","Not recorded","23330",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","23330","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8070/3",,,,"Fresh dissociated",,,,,"unknown",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_337_52513","HTA1_337_5251","Not recorded","23330",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","23330","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8070/3",,,,"OCT",,,,,"unknown",,"Primary",,,,137, +"tumor WES (from OCT piece)","Biospecimen","HTA1_337_5251301","HTA1_337_52513","Not recorded","23330",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","23522","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8070/3",,,,"OCT",,,,,"unknown",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_337_0001","HTA1_337","Not recorded","23330",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","23330","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_337_00015","HTA1_337_0001","Not recorded","23330",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","23330","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_337_0001501","HTA1_337_00015","Not recorded","23330",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","23547","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_345_5281","HTA1_345","Not recorded","28821",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","28821","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8230/3",,,,"Fresh",,,,,"Left",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_345_52811","HTA1_345_5281","Not recorded","28821",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Fresh","28821","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8230/3",,,,"Fresh",,,,,"Left",,"Primary",,,36,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_345_5281101","HTA1_345_52811","Not recorded","28821",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","28821","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8230/3",,,,"Fresh dissociated",,,,,"Left",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_345_52813","HTA1_345_5281","Not recorded","28821",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","Frozen at -80C","28821","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8230/3",,,,"OCT",,,,,"Left",,"Primary",,,,121, +"tumor WES (from OCT piece)","Biospecimen","HTA1_345_5281301","HTA1_345_52813","Not recorded","28821",,"Tissue Biospecimen Type","Surgical Resection","None","Upper lobe lung","unknown","29001","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8230/3",,,,"OCT",,,,,"Left",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_345_0001","HTA1_345","Not recorded","28821",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","28821","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_345_00015","HTA1_345_0001","Not recorded","28821",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","28821","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_345_0001501","HTA1_345_00015","Not recorded","28821",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","29026","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"original tumor (tissue removed by procedure)","Biospecimen","HTA1_415_5401","HTA1_415","Not recorded","21536",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","21536","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"unknown",,"Primary",,,,, +"fresh piece","Biospecimen","HTA1_415_54011","HTA1_415_5401","Not recorded","21536",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Fresh","21536","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh",,,,,"unknown",,"Primary",,,21,, +"10x channels protocol/condition 1 (from fresh piece)","Biospecimen","HTA1_415_5401101","HTA1_415_54011","Not recorded","21536",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","21536","https://www.protocols.io/view/htapp-dissociation-of-human-primary-lung-cancer-re-bhbgj2jw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"Fresh dissociated",,,,,"unknown",,"Primary",,,,, +"OCT piece for bulk-seq","Biospecimen","HTA1_415_54013","HTA1_415_5401","Not recorded","21536",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","Frozen at -80C","21536","https://www.protocols.io/view/htapp-fresh-tissue-embedding-in-oct-bswgnfbw",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"unknown",,"Primary",,,,101, +"tumor WES (from OCT piece)","Biospecimen","HTA1_415_5401301","HTA1_415_54013","Not recorded","21536",,"Tissue Biospecimen Type","Surgical Resection","None","Lower lobe lung","unknown","21696","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"8550/3",,,,"OCT",,,,,"unknown",,"Primary",,,,, +"germline source (tissue/blood removed by procedure)","Biospecimen","HTA1_415_0001","HTA1_415","Not recorded","21536",,"Blood Biospecimen Type","Other Acquisition Method","None","Blood","Fresh","21536","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Fresh",,,"Not Shipped",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline source (preserved source)","Biospecimen","HTA1_415_00015","HTA1_415_0001","Not recorded","21536",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","Frozen at -150C","21536","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, +"germline WES (from preserved source)","Biospecimen","HTA1_415_0001501","HTA1_415_00015","Not recorded","21536",,"Blood Biospecimen Type","Other Acquisition Method","Cryo-store","Blood","unknown","21721","Not available",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Blood draw",,,"Not Applicable",,,,"Cryopreserved",,,"Dry Ice",,"Not Applicable",,"Not Otherwise Specified",,,,, diff --git a/functions/dcWaiter.R b/functions/dcWaiter.R index 00f90a61..938da9e0 100644 --- a/functions/dcWaiter.R +++ b/functions/dcWaiter.R @@ -1,12 +1,14 @@ # This is script to wrap up the waiter screen for data curator app # TODO: maybe we could split into UI and server if we need -dcWaiter <- function(stage = c("show", "update", "hide"), - isLogin = FALSE, isPass = TRUE, usrName = NULL, +dcWaiter <- function(stage = c("show", "update", "hide"), landing = FALSE, userName = NULL, + isLogin = TRUE, isCertified = TRUE, isPermission = TRUE, sleep = 2, msg = NULL, spin = NULL) { # validate arguments + if (!is.logical(landing)) stop("landing must be a boolean") if (!is.logical(isLogin)) stop("isLogin must be a boolean") - if (!is.logical(isPass)) stop("isPass must be a boolean") + if (!is.logical(isCertified)) stop("isCertified must be a boolean") + if (!is.logical(isPermission)) stop("isPermission must be a boolean") if (!is.numeric(sleep)) stop("sleep must be a numeric") if (!stage %in% c("show", "update", "hide")) { stop("Please provide a value for stage: 'show', 'update' or 'hide'.") @@ -20,9 +22,9 @@ dcWaiter <- function(stage = c("show", "update", "hide"), return(waiter_hide()) } - # log in screen - if (isLogin) { - # The message on initial loading page are not customizable + # first loading screen of app + if (landing) { + if (stage == "show") { waiter_show_on_load( html = tagList( @@ -31,28 +33,50 @@ dcWaiter <- function(stage = c("show", "update", "hide"), ), color = "#424874" ) - } else if (isPass) { + # } else if (!isLogin) { + # # when user is not login + # waiter_update(html = tagList( + # img(src = "img/synapse_logo.png", height = "120px"), + # h3("Looks like you're not logged in!"), + # span("Please ", + # a("login", href = "https://www.synapse.org/#!LoginPlace:0", target = "_blank"), + # " to Synapse, then refresh this page." + # ) + # )) + } else if (!isCertified) { + # when user is not certified synapse user waiter_update(html = tagList( img(src = "img/synapse_logo.png", height = "120px"), - h3(sprintf("Welcome, %s!", usrName)) + h3("Looks like you're not a synapse certified user!"), + span("Please follow the ", + a("instruction", + href = "https://help.synapse.org/docs/User-Account-Tiers.2007072795.html#UserAccountTiers-CertifiedUsers", + target = "_blank" + ), + " to become a certified user, then refresh this page." + ) + )) + } else if (!isPermission) { + # when user is not certified synapse user + waiter_update(html = tagList( + img(src = "img/synapse_logo.png", height = "120px"), + h3("Fileview Access Denied!"), + span("You may not have sufficient permissions for curation. + Please contact your team and project administrators.") )) - Sys.sleep(sleep) - waiter_hide() } else { - # ensure the synapse logo image is stored in www/ + # success loading page; userName needed to provide waiter_update(html = tagList( img(src = "img/synapse_logo.png", height = "120px"), - h3("Looks like you're not logged in!"), span( - "Please ", a("login", - href = "https://www.synapse.org/#!LoginPlace:0", target = "_blank" - ), - " to Synapse, then refresh this page." - ) + h3(sprintf("Welcome, %s!", userName)) )) + Sys.sleep(sleep) + waiter_hide() } + } else { + # other loading screens - if (stage == "show") { waiter_show( html = tagList(spin, br(), h3(msg)), diff --git a/functions/metadata_model.py b/functions/metadata_model.py index 378fad67..1a4a9176 100644 --- a/functions/metadata_model.py +++ b/functions/metadata_model.py @@ -2,7 +2,7 @@ from schematic import CONFIG -config = CONFIG.load_config("config.yml") +config = CONFIG.load_config("schematic/config.yml") inputMModelLocation = CONFIG["model"]["input"]["location"] inputMModelLocationType = CONFIG["model"]["input"]["file_type"] diff --git a/functions/synapse_func_alias.py b/functions/synapse_func_alias.py index cc26beb6..a16ea0c7 100644 --- a/functions/synapse_func_alias.py +++ b/functions/synapse_func_alias.py @@ -6,3 +6,4 @@ syn_tableQuery = syn.tableQuery syn_get = syn.get syn_restGET = syn.restGET +syn_is_certified = syn.is_certified diff --git a/functions/utils.R b/functions/utils.R index 76e230fc..c22640d0 100644 --- a/functions/utils.R +++ b/functions/utils.R @@ -6,3 +6,20 @@ list2Vector <- function(list) { } return(vector) } + +# convert long string from "x1, x2, x3, x4, x5" into "x1, x2 ... x5" +TruncateEllipsis <- function(string, max, split_pattern = NULL) { + if (!is.null(split_pattern)) { + string <- str_split(string, split_pattern) + } + + sapply(string, function(i) { + n <- length(i) + if (n > max) { + firstMaX <- str_c(i[1:(max - 1)], collapse = ", ") + str_c(c(firstMaX, "...", i[n]), collapse = " ") + } else { + str_c(i, collapse = ", ") + } + }) +} diff --git a/functions/validationResult.R b/functions/validationResult.R index 2d9983f4..ec1295ce 100644 --- a/functions/validationResult.R +++ b/functions/validationResult.R @@ -2,9 +2,10 @@ validationResult <- function(valRes, template, inFile) { validation_res <- NULL error_msg <- NULL help_msg <- NULL - outMsg <- NULL - errorDT <- NULL - errorType <- NULL + out_msg <- NULL + error_table <- NULL + error_type <- NULL + highlight_values <- list() if (!is.null(inFile) && !is.null(template) && length(inFile) != 0) { if (length(valRes) != 0) { @@ -26,7 +27,7 @@ validationResult <- function(valRes, template, inFile) { if (length(inx_mt) > 0) { # mismatched error(s): selected template mismatched with validating template - errorType <- "Mismatched Template" + error_type <- "Mismatched Template" # get all mismatched components error_values <- sapply(valRes[inx_mt], function(x) x[[4]][[1]]) %>% unique() @@ -47,35 +48,50 @@ validationResult <- function(valRes, template, inFile) { ) } else if (length(inx_ws) > 0) { # wrong schema error(s): validating metadata miss any required columns - errorType <- "Wrong Schema" + error_type <- "Wrong Schema" error_msg <- "The submitted metadata does not contain all required column(s)." help_msg <- "Please check that you used the correct template in the 'Get Metadata Template' tab and ensure your metadata contains all required columns." } else { - errorType <- "Invalid Value" + error_type <- "Invalid Value" error_msg <- paste0( "The submitted metadata have ", length(valRes), " errors." ) } - errorDT <- data.frame( - Column = sapply(valRes, function(i) i[[2]]), - Value = sapply(valRes, function(i) i[[4]][[1]]), - Error = sapply(valRes, function(i) i[[3]]) - ) + # create table to display errors for users + error_table <- lapply(valRes, function(i) { + data.frame(Row = as.numeric(i[[1]]), Column = i[[2]], Value = i[[4]][[1]], Error = i[[3]]) + }) %>% bind_rows() + # create list for hightlight function; key: error_column, value: error_value + lapply(unique(error_table$Column), function(col) { + highlight_values[[col]] <<- error_table$Value[error_table$Column == col] + }) + + # collapse similiar errors into one row + error_table <- error_table %>% + mutate(Error = gsub(".*(not.*)\\.?$", "\\1", Error)) %>% + group_by(Column, Error) %>% + summarise( + Row = str_c(unique(Row), collapse = ", ") %>% TruncateEllipsis(10, ", "), + Value = str_c(unique(Value), collapse = ", ") %>% TruncateEllipsis(10, ", "), + .groups = "drop" + ) %>% + ungroup() %>% + dplyr::select(Row, Column, Value, Error) + # sort rows based on input column names - errorDT <- errorDT[order(match(errorDT$Column, colnames(inFile))), ] - # TODO: to reduce parameter, sort just based on alphabetic - # errorDT <- errorDT[order(errorDT$Column),] + error_table <- error_table[order(match(error_table$Column, colnames(inFile))), ] + } else { validation_res <- "valid" - errorType <- "No Error" + error_type <- "No Error" } # combine all error messages into one, add an extra empty line to bottom - outMsg <- paste0(c( + out_msg <- paste0(c( paste0("Your metadata is ", validation_res, " !!!"), error_msg, help_msg ), collapse = "

") @@ -83,8 +99,9 @@ validationResult <- function(valRes, template, inFile) { return(list( validationRes = validation_res, - outMsg = outMsg, - errorDT = errorDT, - errorType = errorType + outMsg = out_msg, + errorDT = error_table, + errorHighlight = highlight_values, + errorType = error_type )) } diff --git a/global.R b/global.R index 88bfb1eb..8d76f7d7 100644 --- a/global.R +++ b/global.R @@ -1,19 +1,44 @@ +suppressPackageStartupMessages({ + library(yaml) + library(reticulate) +}) + +oauth_client <- yaml.load_file("oauth_config.yml") + +client_id <- toString(oauth_client$CLIENT_ID) +client_secret <- toString(oauth_client$CLIENT_SECRET) +app_url <- toString(oauth_client$APP_URL) + +if (is.null(client_id) || nchar(client_id) == 0) stop("oauth_config.yml is missing CLIENT_ID") +if (is.null(client_secret) || nchar(client_secret) == 0) stop("oauth_config.yml is missing CLIENT_SECRET") +if (is.null(app_url) || nchar(app_url) == 0) stop("oauth_config.yml is missing APP_URL") + +# ShinyAppys has a limit of 7000 files which this app' grossly exceeds +# due to its Python dependencies. To get around the limit we zip up +# the virtual environment before deployment and unzip it here. +# +# unzip virtual environment, named as ".venv.zip" +if (!file.exists(".venv")) utils::unzip(".venv.zip") + +# We get a '126' error (non-executable) if we don't do this: +system("chmod -R +x .venv") + +# Activate virtual env +# Don't necessarily have to set `RETICULATE_PYTHON` env variable +Sys.unsetenv("RETICULATE_PYTHON") +reticulate::use_virtualenv(file.path(getwd(), ".venv")) + suppressPackageStartupMessages({ library(shiny) library(httr) - library(rjson) - library(yaml) library(shinyjs) library(dplyr) + library(tidyr) library(shinythemes) library(shinydashboard) library(stringr) library(DT) library(jsonlite) - library(reticulate) - library(ggplot2) - library(purrr) - library(plotly) library(shinypop) library(waiter) library(readr) @@ -21,8 +46,6 @@ suppressPackageStartupMessages({ library(shinydashboardPlus) }) -# APP_URL <- "https://shinypro.synapse.org/users/spatil/HTAN-oauth/" - has_auth_code <- function(params) { # params is a list object containing the parsed URL parameters. Return TRUE if # based on these parameters, it looks like auth code is present that we can @@ -31,19 +54,10 @@ has_auth_code <- function(params) { return(!is.null(params$code)) } -oauth_client <- yaml.load_file("config.yaml") - -client_id <- toString(oauth_client$client_id) -client_secret <- oauth_client$client_secret -APP_URL <- oauth_client$APP_URL -if (is.null(client_id)) stop("config.yaml is missing client_id") -if (is.null(client_secret)) stop("config.yaml is missing client_secret") -if (is.null(APP_URL)) stop("config.yaml is missing client_secret") - app <- oauth_app("shinysynapse", key = client_id, secret = client_secret, - redirect_uri = APP_URL + redirect_uri = app_url ) # These are the user info details ('claims') requested from Synapse: @@ -75,14 +89,10 @@ api <- oauth_endpoint( # The 'openid' scope is required by the protocol for retrieving user information. scope <- "openid view download modify" -# Activate conda env -# Don't necessarily have to set `RETICULATE_PYTHON` env variable -reticulate::use_condaenv("data_curator_env_oauth") - # Import functions/modules source_files <- list.files(c("functions", "modules"), pattern = "*\\.R$", recursive = TRUE, full.names = TRUE) sapply(source_files, FUN = source) # Global variables datatypes <- c("project", "folder", "template") -options(sass.cache = FALSE) +options(sass.cache = FALSE) \ No newline at end of file diff --git a/init_python_venv.sh b/init_python_venv.sh deleted file mode 100644 index 67250c5f..00000000 --- a/init_python_venv.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# a sample initialization of a virtualenv for use with -# this project. a local virtualenv is created, the python -# dependencies are installed into it, and an environment -# variable is set to hint reticulate to use this virtualenv. - -# this assumes that a python3 command is available on the path -# with a python version >= 3.6 - -# Sample usage: -# $source init_python_venv.sh - -python3 -m venv venv -source venv/bin/activate - -pip install -r requirements.txt - -export RETICULATE_PYTHON=venv/bin/python - diff --git a/install-pkgs.R b/install-pkgs.R new file mode 100644 index 00000000..a0b042dc --- /dev/null +++ b/install-pkgs.R @@ -0,0 +1,40 @@ + +cran <- c( + "ellipsis==0.3.2", + "shiny==1.7.1", + "httr==1.4.2", + "yaml==2.2.1", + "shinyjs==2.1.0", + "dplyr==1.0.7", + "shinythemes==1.2.0", + "shinydashboard==0.7.2", + "stringr==1.4.0", + "DT==0.20", + "jsonlite==1.7.3", + "reticulate==1.23", + "shinydashboardPlus==2.0.3", + "waiter==0.2.5", + "readr==2.1.1", + "sass==0.4.0", + "remotes==2.4.2", + "rsconnect==0.8.25", + "png==0.1.7", + "tidyr==1.1.4" +) +gh <- c( + "dreamRs/shinypop" +) + +# The binary package distributions from R Studio dramatically speed up installation time +# For Ubuntu 18.04 (Bionic) it's https://packagemanager.rstudio.com/all/__linux__/bionic/latest +# For Ubuntu 20.04 (Focal) it's https://packagemanager.rstudio.com/all/__linux__/focal/latest +options(repos = c(REPO_NAME = "https://packagemanager.rstudio.com/all/__linux__/bionic/latest", getOption("repos"))) + +install.packages("remotes") +invisible( + lapply(strsplit(cran, "=="), function(cran_pkg) { + remotes::install_version(cran_pkg[1], version = cran_pkg[2]) + }) +) + +remotes::install_github(gh) diff --git a/modules/DTable.R b/modules/DTable.R index 9aca7a4c..1f05403b 100644 --- a/modules/DTable.R +++ b/modules/DTable.R @@ -1,44 +1,55 @@ -# This moduel is to peformrender DT table function for preview/highlight - +#' This moduel is to wrap some of DT table functions, especially for hightlight functions +#' +#' @param id id name of this module +#' @param data a data object (either a matrix or a data frame) +#' @param rownames TRUE (show row names) or FALSE (hide row names) +#' @param caption a character vector or a tag object generated from \code{htmltools::tags$caption()} +#' @param filter whether/where to use column filters, either "none", "top" or "bottom" +#' @param options a list of initialization options (see https://datatables.net/reference/option/) +#' @param highlight whether to highlight cells in the table, either "full" (highlight entired table) or "partial" (highlight certain cells based on \code{highlightValues}) +#' @param highlightValues a list of values to be highlighted; each element of list following by key (column names) and value (a vector of values) +#' @return a reactive table DTableUI <- function(id) { ns <- NS(id) DT::DTOutput(ns("table")) } DTableServer <- function(id, data, - rownames = FALSE, caption = NULL, + rownames = TRUE, caption = NULL, filter = "top", options = list(lengthChange = FALSE, scrollX = TRUE), - highlight = NULL, hightlight.col = NULL, hightlight.value = NULL) { - if (!is.null(highlight)) { - if (!highlight %in% c("full", "partial")) { - Stop("Please choose a value for highlight: 'full', 'partial'.") - } - - column <- hightlight.col - value <- hightlight.value - } - - df <- datatable(data, - caption = caption, - rownames = rownames, - options = options - ) - - if (!is.null(highlight)) { - if (highlight == "full") { - df <- df %>% - formatStyle(1, target = "row", backgroundColor = "yellow") - } else if (highlight == "partial") { - df <- df %>% - formatStyle(column, backgroundColor = styleEqual( - value, rep("yellow", length(value)) - )) - } - } + highlight = NULL, highlightValues = NULL) { moduleServer( id, function(input, output, session) { + + df <- datatable(data, + caption = caption, + rownames = rownames, + filter = filter, + options = options + ) + + if (!is.null(highlight)) { + + match.arg(highlight, c("full", "partial")) + + if (highlight == "full") { + + df <- df %>% formatStyle(1, target = "row", backgroundColor = "yellow") + + } else if (highlight == "partial") { + + # iterate each col to avoid messing around same value in multiple columns + for (col in names(highlightValues)) { + + values <- highlightValues[[col]] + df <- df %>% + formatStyle(col, backgroundColor = styleEqual(values, rep("yellow", length(values)))) + } + } + } + output$table <- renderDT(df) } ) diff --git a/modules/csvInfile.R b/modules/csvInfile.R index 481c2341..4aab24bc 100644 --- a/modules/csvInfile.R +++ b/modules/csvInfile.R @@ -28,14 +28,19 @@ csvInfileServer <- function(id, na = c("", "NA"), colsAsCharacters = FALSE, keep } if (keepBlank) { - # change NA to blank to match schema output) - infile <- infile %>% replace(., is.na(.), "") + # change NA to blank to match schematic output + infile <- infile %>% mutate(across(everything(), ~replace_na(., ""))) } # remove empty rows/columns where readr called it 'X'[digit] for unnamed col infile <- infile[, !grepl("^X", colnames(infile))] infile <- infile[rowSums(is.na(infile)) != ncol(infile), ] + # add 1 to row index to match spreadsheet's row index + rownames(infile) <- as.numeric(rownames(infile)) + 1 + + return(infile) }) + return(list( raw = reactive({ input$file diff --git a/renv.lock b/renv.lock deleted file mode 100644 index 9804e4f4..00000000 --- a/renv.lock +++ /dev/null @@ -1,759 +0,0 @@ -{ - "R": { - "Version": "3.6.3", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cran.rstudio.com" - }, - { - "Name": "Sage", - "URL": "http://ran.synapse.org" - } - ] - }, - "Packages": { - "BH": { - "Package": "BH", - "Version": "1.72.0-3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8f9ce74c6417d61f0782cbae5fd2b7b0" - }, - "DT": { - "Package": "DT", - "Version": "0.14", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a3580ce0309c94d061c23b0afb4accbd" - }, - "MASS": { - "Package": "MASS", - "Version": "7.3-51.6", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "1dad32ac9dbd8057167b2979fb932ff7" - }, - "Matrix": { - "Package": "Matrix", - "Version": "1.2-18", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "08588806cba69f04797dab50627428ed" - }, - "R.cache": { - "Package": "R.cache", - "Version": "0.15.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e92a8ea8388c47c82ed8aa435ed3be50" - }, - "R.methodsS3": { - "Package": "R.methodsS3", - "Version": "1.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4bf6453323755202d5909697b6f7c109" - }, - "R.oo": { - "Package": "R.oo", - "Version": "1.24.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "5709328352717e2f0a9c012be8a97554" - }, - "R.utils": { - "Package": "R.utils", - "Version": "2.10.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a9e316277ff12a43997266f2f6567780" - }, - "R6": { - "Package": "R6", - "Version": "2.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "292b54f8f4b94669b08f94e5acce6be2" - }, - "RColorBrewer": { - "Package": "RColorBrewer", - "Version": "1.1-2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e031418365a7f7a766181ab5a41a5716" - }, - "Rcpp": { - "Package": "Rcpp", - "Version": "1.0.5", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "125dc7a0ed375eb68c0ce533b48d291f" - }, - "askpass": { - "Package": "askpass", - "Version": "1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e8a22846fff485f0be3770c2da758713" - }, - "assertthat": { - "Package": "assertthat", - "Version": "0.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "50c838a310445e954bc13f26f26a6ecf" - }, - "backports": { - "Package": "backports", - "Version": "1.1.8", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "3ef0eac19317fd03c0c854aed581d473" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "543776ae6848fde2f48ff3816d0628bc" - }, - "callr": { - "Package": "callr", - "Version": "3.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "643163a00cb536454c624883a10ae0bc" - }, - "cli": { - "Package": "cli", - "Version": "2.0.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ff0becff7bfdfe3f75d29aff8f3172dd" - }, - "clipr": { - "Package": "clipr", - "Version": "0.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "08cf4045c149a0f0eaf405324c7495bd" - }, - "colorspace": { - "Package": "colorspace", - "Version": "1.4-1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6b436e95723d1f0e861224dd9b094dfb" - }, - "commonmark": { - "Package": "commonmark", - "Version": "1.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "0f22be39ec1d141fd03683c06f3a6e67" - }, - "cpp11": { - "Package": "cpp11", - "Version": "0.2.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "730eebcc741a5c36761f7d4d0f5e37b8" - }, - "crayon": { - "Package": "crayon", - "Version": "1.3.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "0d57bc8e27b7ba9e45dba825ebc0de6b" - }, - "crosstalk": { - "Package": "crosstalk", - "Version": "1.1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ae55f5d7c02f0ab43c58dd050694f2b4" - }, - "curl": { - "Package": "curl", - "Version": "4.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2b7d10581cc730804e9ed178c8374bd6" - }, - "data.table": { - "Package": "data.table", - "Version": "1.12.8", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "cd711af60c47207a776213a368626369" - }, - "desc": { - "Package": "desc", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6c8fe8fa26a23b79949375d372c7b395" - }, - "digest": { - "Package": "digest", - "Version": "0.6.25", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f697db7d92b7028c4b3436e9603fb636" - }, - "dplyr": { - "Package": "dplyr", - "Version": "1.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4011f62581a34080e44105d4aa05a97f" - }, - "ellipsis": { - "Package": "ellipsis", - "Version": "0.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fd2844b3a43ae2d27e70ece2df1b4e2a" - }, - "evaluate": { - "Package": "evaluate", - "Version": "0.14", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ec8ca05cffcc70569eaaad8469d2a3a7" - }, - "fansi": { - "Package": "fansi", - "Version": "0.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7fce217eaaf8016e72065e85c73027b5" - }, - "farver": { - "Package": "farver", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "dad6793a5a1f73c8e91f1a1e3e834b05" - }, - "fastmap": { - "Package": "fastmap", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "83ab58a0518afe3d17e41da01af13b60" - }, - "fresh": { - "Package": "fresh", - "Version": "0.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fa54367040deb4537da49b7ac0ee5770" - }, - "fs": { - "Package": "fs", - "Version": "1.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8c04112383ca1988e96f429255f95675" - }, - "generics": { - "Package": "generics", - "Version": "0.0.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b8cff1d1391fd1ad8b65877f4c7f2e53" - }, - "ggplot2": { - "Package": "ggplot2", - "Version": "3.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4ded8b439797f7b1693bd3d238d0106b" - }, - "glue": { - "Package": "glue", - "Version": "1.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f43e0d5e85ccb0a4045670c0607ee504" - }, - "gtable": { - "Package": "gtable", - "Version": "0.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ac5c6baf7822ce8732b343f14c072c4d" - }, - "hexbin": { - "Package": "hexbin", - "Version": "1.28.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "3d59212f2814d65dff517e6899813c58" - }, - "hms": { - "Package": "hms", - "Version": "0.5.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "726671f634529d470545f9fd1a9d1869" - }, - "htmltools": { - "Package": "htmltools", - "Version": "0.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7d651b7131794fe007b1ad6f21aaa401" - }, - "htmlwidgets": { - "Package": "htmlwidgets", - "Version": "1.5.1.9001", - "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteRepo": "htmlwidgets", - "RemoteUsername": "ramnathv", - "RemoteRef": "master", - "RemoteSha": "6fcc4b03ed3fc42be76d4e43d863db3d85c8babb", - "Hash": "43198daf611c2422a3969bf1f02213b4" - }, - "httpuv": { - "Package": "httpuv", - "Version": "1.5.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4e6dabb220b006ccdc3b3b5ff993b205" - }, - "httr": { - "Package": "httr", - "Version": "1.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7146fea4685b4252ebf478978c75f597" - }, - "isoband": { - "Package": "isoband", - "Version": "0.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6e58bd3d6b3dd82a944cd6f05ade228f" - }, - "jsonlite": { - "Package": "jsonlite", - "Version": "1.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2657f20b9a74c996c602e74ebe540b06" - }, - "labeling": { - "Package": "labeling", - "Version": "0.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "73832978c1de350df58108c745ed0e3e" - }, - "later": { - "Package": "later", - "Version": "1.1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d0a62b247165aabf397fded504660d8a" - }, - "lattice": { - "Package": "lattice", - "Version": "0.20-41", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fbd9285028b0263d76d18c95ae51a53d" - }, - "lazyeval": { - "Package": "lazyeval", - "Version": "0.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d908914ae53b04d4c0c0fd72ecc35370" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "0.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "361811f31f71f8a617a9a68bf63f1f42" - }, - "magrittr": { - "Package": "magrittr", - "Version": "2.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "41287f1ac7d28a92f0a286ed507928d3" - }, - "mgcv": { - "Package": "mgcv", - "Version": "1.8-31", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4bb7e0c4f3557583e1e8d3c9ffb8ba5c" - }, - "mime": { - "Package": "mime", - "Version": "0.9", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e87a35ec73b157552814869f45a63aa3" - }, - "munsell": { - "Package": "munsell", - "Version": "0.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6dfe8bf774944bd5595785e3229d8771" - }, - "nlme": { - "Package": "nlme", - "Version": "3.1-148", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "662f52871983ff3e3ef042c62de126df" - }, - "openssl": { - "Package": "openssl", - "Version": "1.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b3209c62052922b6c629544d94c8fa8a" - }, - "pillar": { - "Package": "pillar", - "Version": "1.4.6", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "bdf26e55ccb7df3e49a490150277f002" - }, - "pkgbuild": { - "Package": "pkgbuild", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "404684bc4e3685007f9720adf13b06c1" - }, - "pkgconfig": { - "Package": "pkgconfig", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "01f28d4278f15c76cddbea05899c5d6f" - }, - "pkgload": { - "Package": "pkgload", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b6b150cd4709e0c0c9b5d51ac4376282" - }, - "plotly": { - "Package": "plotly", - "Version": "4.9.2.9000", - "Source": "GitHub", - "RemoteType": "github", - "Remotes": "rstudio/thematic, ramnathv/htmlwidgets", - "RemoteHost": "api.github.com", - "RemoteRepo": "plotly", - "RemoteUsername": "ropensci", - "RemoteRef": "master", - "RemoteSha": "1d1eddda377685cf900ed4a7b16e7796a24b8fe4", - "Hash": "d2858de9ced9d164806a7aa2eebb8b2c" - }, - "praise": { - "Package": "praise", - "Version": "1.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a555924add98c99d2f411e37e7d25e9f" - }, - "prettyunits": { - "Package": "prettyunits", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "95ef9167b75dde9d2ccc3c7528393e7e" - }, - "processx": { - "Package": "processx", - "Version": "3.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f4f13345fcb00c51ace12f65dd18749f" - }, - "promises": { - "Package": "promises", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a8730dcbdd19f9047774909f0ec214a4" - }, - "ps": { - "Package": "ps", - "Version": "1.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "425d938eb9c02906a8ac98c0c2a306b5" - }, - "purrr": { - "Package": "purrr", - "Version": "0.3.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "97def703420c8ab10d8f0e6c72101e02" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8c8298583adbbe76f3c2220eef71bebc" - }, - "readr": { - "Package": "readr", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2639976851f71f330264a9c9c3d43a61" - }, - "rematch2": { - "Package": "rematch2", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "76c9e04c712a05848ae7a23d2f170a40" - }, - "renv": { - "Package": "renv", - "Version": "0.11.0-3", - "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteRepo": "renv", - "RemoteUsername": "rstudio", - "RemoteRef": "master", - "RemoteSha": "caf0b39c883168cdd5ebd55a547f6d8689ab8712", - "Hash": "094b6d0b0fe28b14a6780dad836f6356" - }, - "reticulate": { - "Package": "reticulate", - "Version": "1.16", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "5db95d35ae4605b46cea66b6e3bcab3e" - }, - "rjson": { - "Package": "rjson", - "Version": "0.2.20", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7d597f982ee6263716b6a2f28efd29fa" - }, - "rlang": { - "Package": "rlang", - "Version": "0.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "c06d2a6887f4b414f8e927afd9ee976a" - }, - "rprojroot": { - "Package": "rprojroot", - "Version": "1.3-2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f6a407ae5dd21f6f80a6708bbb6eb3ae" - }, - "rstudioapi": { - "Package": "rstudioapi", - "Version": "0.11", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "33a5b27a03da82ac4b1d43268f80088a" - }, - "sass": { - "Package": "sass", - "Version": "0.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "441417bbd40d5bbd07561cc40fb182ed" - }, - "scales": { - "Package": "scales", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6f76f71042411426ec8df6c54f34e6dd" - }, - "shiny": { - "Package": "shiny", - "Version": "1.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ee4ed72d7a5047d9e73cf922ad66e9c9" - }, - "shinydashboard": { - "Package": "shinydashboard", - "Version": "0.7.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "133639dc106955eee4ffb8ec73edac37" - }, - "shinydashboardPlus": { - "Package": "shinydashboardPlus", - "Version": "2.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "1abe63cd90fe33d3ca211525a0b39af9" - }, - "shinyjs": { - "Package": "shinyjs", - "Version": "1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b40a5207b6624f6e2b8cdb50689cdb69" - }, - "shinypop": { - "Package": "shinypop", - "Version": "0.0.1.920", - "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteRepo": "shinypop", - "RemoteUsername": "dreamRs", - "RemoteRef": "master", - "RemoteSha": "e3be83f99e85401c59ec7a1dfafa5c92c4f7367b", - "Hash": "095c2c667d27cd2f5829967a48e14229" - }, - "shinythemes": { - "Package": "shinythemes", - "Version": "1.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8f047210d7d68ea4860a3c0d8cced272" - }, - "sourcetools": { - "Package": "sourcetools", - "Version": "0.1.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "947e4e02a79effa5d512473e10f41797" - }, - "stringi": { - "Package": "stringi", - "Version": "1.4.6", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e99d8d656980d2dd416a962ae55aec90" - }, - "stringr": { - "Package": "stringr", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "0759e6b6c0957edb1311028a49a35e76" - }, - "styler": { - "Package": "styler", - "Version": "1.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2ec6308547ffe73208cef3ef3766fc33" - }, - "sys": { - "Package": "sys", - "Version": "3.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "507f3116a38d37ad330a038b3be07b66" - }, - "testthat": { - "Package": "testthat", - "Version": "2.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "0829b987b8961fb07f3b1b64a2fbc495" - }, - "tibble": { - "Package": "tibble", - "Version": "3.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "08bd36bd34b20d4f7971d49e81deaab0" - }, - "tidyr": { - "Package": "tidyr", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7395a05640bf91502dd475a84008d87e" - }, - "tidyselect": { - "Package": "tidyselect", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6ea435c354e8448819627cf686f66e0a" - }, - "utf8": { - "Package": "utf8", - "Version": "1.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "4a5081acfb7b81a572e4384a7aaf2af1" - }, - "vctrs": { - "Package": "vctrs", - "Version": "0.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "1739235995f08583db4095a28c357207" - }, - "viridisLite": { - "Package": "viridisLite", - "Version": "0.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ce4f6271baa94776db692f1cb2055bee" - }, - "waiter": { - "Package": "waiter", - "Version": "0.1.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7bfebcea9f02aa9b2821fb4f529031e6" - }, - "withr": { - "Package": "withr", - "Version": "2.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ecd17882a0b4419545691e095b74ee89" - }, - "xfun": { - "Package": "xfun", - "Version": "0.15", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ddeca7650052ff9131ac7c41a9a77b3b" - }, - "xtable": { - "Package": "xtable", - "Version": "1.8-4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2" - }, - "yaml": { - "Package": "yaml", - "Version": "2.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2826c5d9efb0a88f657c7a679c7106db" - } - } -} diff --git a/renv/.gitignore b/renv/.gitignore deleted file mode 100644 index 82740ba9..00000000 --- a/renv/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -library/ -python/ -staging/ diff --git a/renv/activate.R b/renv/activate.R deleted file mode 100644 index 924c2d38..00000000 --- a/renv/activate.R +++ /dev/null @@ -1,157 +0,0 @@ - -local({ - - # the requested version of renv - version <- "0.8.2" - - # avoid recursion - if (!is.na(Sys.getenv("RENV_R_INITIALIZING", unset = NA))) - return(invisible(TRUE)) - - # signal that we're loading renv during R startup - Sys.setenv("RENV_R_INITIALIZING" = "true") - on.exit(Sys.unsetenv("RENV_R_INITIALIZING"), add = TRUE) - - # signal that we've consented to use renv - options(renv.consent = TRUE) - - # load the 'utils' package eagerly -- this ensures that renv shims, which - # mask 'utils' packages, will come first on the search path - library(utils, lib.loc = .Library) - - # check to see if renv has already been loaded - if ("renv" %in% loadedNamespaces()) { - - # if renv has already been loaded, and it's the requested version of renv, - # nothing to do - spec <- .getNamespaceInfo(.getNamespace("renv"), "spec") - if (identical(spec[["version"]], version)) - return(invisible(TRUE)) - - # otherwise, unload and attempt to load the correct version of renv - unloadNamespace("renv") - - } - - # construct path to renv in library - libpath <- local({ - - root <- Sys.getenv("RENV_PATHS_LIBRARY", unset = "renv/library") - prefix <- paste("R", getRversion()[1, 1:2], sep = "-") - - # include SVN revision for development versions of R - # (to avoid sharing platform-specific artefacts with released versions of R) - devel <- - identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - - if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") - - file.path(root, prefix, R.version$platform) - - }) - - # try to load renv from the project library - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) - return(renv::load()) - - # failed to find renv locally; we'll try to install from GitHub. - # first, set up download options as appropriate (try to use GITHUB_PAT) - install_renv <- function() { - - message("Failed to find installation of renv -- attempting to bootstrap...") - - # ensure .Rprofile doesn't get executed - rpu <- Sys.getenv("R_PROFILE_USER", unset = NA) - Sys.setenv(R_PROFILE_USER = "") - on.exit({ - if (is.na(rpu)) - Sys.unsetenv("R_PROFILE_USER") - else - Sys.setenv(R_PROFILE_USER = rpu) - }, add = TRUE) - - # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { - fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "curl", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { - fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "wget", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } - - # fix up repos - repos <- getOption("repos") - on.exit(options(repos = repos), add = TRUE) - repos[repos == "@CRAN@"] <- "https://cloud.r-project.org" - options(repos = repos) - - # check for renv on CRAN matching this version - db <- as.data.frame(available.packages(), stringsAsFactors = FALSE) - if ("renv" %in% rownames(db)) { - entry <- db["renv", ] - if (identical(entry$Version, version)) { - message("* Installing renv ", version, " ... ", appendLF = FALSE) - dir.create(libpath, showWarnings = FALSE, recursive = TRUE) - utils::install.packages("renv", lib = libpath, quiet = TRUE) - message("Done!") - return(TRUE) - } - } - - # try to download renv - message("* Downloading renv ", version, " ... ", appendLF = FALSE) - prefix <- "https://api.github.com" - url <- file.path(prefix, "repos/rstudio/renv/tarball", version) - destfile <- tempfile("renv-", fileext = ".tar.gz") - on.exit(unlink(destfile), add = TRUE) - utils::download.file(url, destfile = destfile, mode = "wb", quiet = TRUE) - message("Done!") - - # attempt to install it into project library - message("* Installing renv ", version, " ... ", appendLF = FALSE) - dir.create(libpath, showWarnings = FALSE, recursive = TRUE) - - # invoke using system2 so we can capture and report output - bin <- R.home("bin") - exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - r <- file.path(bin, exe) - args <- c("--vanilla", "CMD", "INSTALL", "-l", shQuote(libpath), shQuote(destfile)) - output <- system2(r, args, stdout = TRUE, stderr = TRUE) - message("Done!") - - # check for successful install - status <- attr(output, "status") - if (is.numeric(status) && !identical(status, 0L)) { - text <- c("Error installing renv", "=====================", output) - writeLines(text, con = stderr()) - } - - - } - - try(install_renv()) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - message("Successfully installed and loaded renv ", version, ".") - return(renv::load()) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) - - warning(paste(msg, collapse = "\n"), call. = FALSE) - -}) diff --git a/renv/settings.dcf b/renv/settings.dcf deleted file mode 100644 index d04fb5e1..00000000 --- a/renv/settings.dcf +++ /dev/null @@ -1,5 +0,0 @@ -external.libraries: -ignored.packages: -snapshot.type: packrat -use.cache: TRUE -vcs.ignore.library: TRUE diff --git a/requirements.txt b/requirements.txt index fa846e13..ceddb075 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,21 +3,21 @@ cachetools==4.1.1 certifi==2020.6.20 cffi==1.14.0 chardet==3.0.4 -click==7.1.2 -click-log==0.3.2 -cryptography==2.9.2 +click>=7.1.2 +click-log>=0.3.2 +cryptography==3.3.2 decorator==4.4.2 Deprecated==1.2.4 entrypoints==0.3 fastjsonschema==2.14.4 google-api-core==1.26.3 -google-api-python-client==1.12.8 -google-auth==1.19.1 -google-auth-httplib2==0.0.4 -google-auth-oauthlib==0.4.4 +google-api-python-client>=1.12.8 +google-auth>=1.19.1 +google-auth-httplib2>=0.0.4 +google-auth-oauthlib>=0.4.4 googleapis-common-protos==1.53.0 -graphviz==0.16 -httplib2==0.18.1 +graphviz>=0.16 +httplib2==0.19.0 idna==2.10 importlib-metadata==1.7.0 inflection==0.5.1 @@ -26,13 +26,13 @@ jsonschema==3.2.0 keyring==12.0.2 keyrings.alt==3.1 networkx==2.5.1 -numpy==1.19.0 +numpy==1.21.0 oauth2client==3.0.0 oauthlib==3.1.0 orderedset==2.0.1 packaging==20.9 pandas==1.2.3 -pip==20.1.1 +pip==21.1 protobuf==3.15.7 pyasn1==0.4.8 pyasn1-modules==0.2.8 @@ -44,18 +44,18 @@ python-dateutil==2.8.1 pytz==2020.1 PyYAML==5.4.1 rdflib==5.0.0 -requests==2.24.0 -requests-oauthlib==1.3.0 -rsa==4.6 -schematicpy==0.1.13 +requests>=2.24.0 +requests-oauthlib>=1.3.0 +rsa==4.7 +schematicpy==1.0.0 SecretStorage==2.3.1 setuptools==52.0.0 six==1.15.0 -synapseclient==2.3.0 +synapseclient==2.5.1 tabletext==0.1 toml==0.10.2 uritemplate==3.0.1 -urllib3==1.25.9 +urllib3==1.26.5 wheel==0.34.2 wrapt==1.12.1 -zipp==3.1.0 +zipp==3.1.0 \ No newline at end of file diff --git a/server.R b/server.R index 62e032f3..b4dc58e8 100644 --- a/server.R +++ b/server.R @@ -10,7 +10,7 @@ shinyServer(function(input, output, session) { return() } redirect_url <- paste0( - api$access, "?", "redirect_uri=", APP_URL, "&grant_type=", + api$access, "?", "redirect_uri=", app_url, "&grant_type=", "authorization_code", "&code=", params$code ) # get the access_token and userinfo token @@ -22,6 +22,8 @@ shinyServer(function(input, output, session) { token_response <- content(req, type = NULL) access_token <- token_response$access_token + session$userData$access_token <- access_token + ######## session global variables ######## source_python("functions/synapse_func_alias.py") source_python("functions/metadata_model.py") @@ -36,13 +38,15 @@ shinyServer(function(input, output, session) { synStore_obj <- NULL # gets list of projects they have access to project_synID <- NULL # selected project synapse ID - folder_synID <- NULL # selected foler synapse ID - template_schema_name <- NULL # selected template schema name + folder_synID <- reactiveVal("") # selected foler synapse ID + template_schema_name <- reactiveVal(NULL) # selected template schema name + template_type <- NULL # type of selected template + isUpdateFolder <- reactiveVal(FALSE) datatype_list <- list(projects = NULL, folders = NULL, manifests = template_namedList, files = NULL) tabs_list <- c("tab_instructions", "tab_data", "tab_template", "tab_upload") - clean_tags <- c("div_download", "div_validate", NS("tbl_validate", "table"), "btn_val_gsheet", "btn_submit") + clean_tags <- c("div_template", "div_validate", NS("tbl_validate", "table"), "btn_val_gsheet", "btn_submit") # add box effects boxEffect(zoom = TRUE, float = TRUE) @@ -51,71 +55,59 @@ shinyServer(function(input, output, session) { # synapse cookies session$sendCustomMessage(type = "readCookie", message = list()) - # login page + # initial loading page + # + # TODO: If we don't use cookies, then what event should trigger this? + # observeEvent(input$cookie, { - # login and update session; otherwise, notify to login to Synapse first - tryCatch( - { - syn_login(sessionToken = input$cookie, rememberMe = FALSE) - - # welcome message - # output$title <- renderUI({ - # titlePanel(h4(sprintf("Welcome, %s", syn_getUserProfile()$userName))) - # }) - - # updating global vars with values for projects - synStore_obj <<- synapse_driver(token = input$cookie) - - # get_projects_list(synStore_obj) - projects_list <- synapse_driver$getStorageProjects(synStore_obj) - datatype_list$projects <<- list2Vector(projects_list) - - # updates project dropdown - lapply(c("header_dropdown_", "dropdown_"), function(x) { - lapply(c(1, 3), function(i) { - updateSelectInput(session, paste0(x, datatypes[i]), - choices = sort(names(datatype_list[[i]])) - ) - }) + # login and update session + # + # The original code pulled the auth token from a cookie, but it + # should actually come from session$userData. The former is + # the Synapse login, only works when the Shiny app' is hosted + # in the synapse.org domain, and is unscoped. The latter will + # work in any domain and is scoped to the access required by the + # Shiny app' + # + access_token <- session$userData$access_token + + syn_login(authToken = access_token, rememberMe = FALSE) + + # updating syn storage + tryCatch(synStore_obj <<- synapse_driver(access_token = access_token), error = function(e) NULL) + + if (is.null(synStore_obj)) { + message("'synapse_driver' fails, run 'synapse_driver' to see detailed error") + dcWaiter("update", landing = TRUE, isPermission = FALSE) + } else { + projects_list <- synapse_driver$getStorageProjects(synStore_obj) + datatype_list$projects <<- list2Vector(projects_list) + + # updates project dropdown + lapply(c("header_dropdown_", "dropdown_"), function(x) { + lapply(c(1, 3), function(i) { + updateSelectInput(session, paste0(x, datatypes[i]), + choices = sort(names(datatype_list[[i]])) + ) }) + }) + user_name <- syn_getUserProfile()$userName + + if (!syn_is_certified(user_name)) { + dcWaiter("update", landing = TRUE, isCertified = FALSE) + } else { # update waiter loading screen once login successful - dcWaiter("update", isLogin = TRUE, isPass = TRUE, usrName = syn_getUserProfile()$userName) - }, - error = function(err) { - message(err) # write log error - dcWaiter("update", isLogin = TRUE, isPass = FALSE) + dcWaiter("update", landing = TRUE, userName = user_name) } - ) + } }) - ######## Arrow Button ######## lapply(1:3, function(i) { switchTabServer(id = paste0("switchTab", i), tabId = "tabs", tab = reactive(input$tabs)(), tabList = tabs_list, parent = session) }) - ######## Update Folder List ######## - lapply(c("header_dropdown_", "dropdown_"), function(x) { - observeEvent(ignoreInit = TRUE, input[[paste0(x, "project")]], { - # get synID of selected project - projectID <- datatype_list$projects[[input[[paste0(x, "project")]]]] - - # gets folders per project - folder_df <- syn_tableQuery(sprintf("select name, id from %s where type = 'folder' and projectId = '%s'", config$main_fileview, projectID))$asDataFrame() - - folder_list <- setNames(as.list(folder_df$id), folder_df$name) - - if (x == "dropdown_") { - project_synID <<- projectID - datatype_list$folders <<- folder_list - } - - # updates foldernames - updateSelectInput(session, paste0(x, "folder"), choices = sort(names(folder_list))) - }) - }) - ######## Header Dropdown Button ######## # Adjust header selection dropdown based on tabs observe({ @@ -127,16 +119,7 @@ shinyServer(function(input, output, session) { } }) - lapply(datatypes, function(x) { - selector <- paste0("header_dropdown_", x) - observeEvent(input[[selector]], { - if (nchar(input[[selector]]) > 20) { - short <- paste0(substr(input[[selector]], 1, 20), " ...") - runjs(paste0("$('#header_content_", x, " .item').text('", short, "');")) - } - }) - }) - + # sync header dropdown with main dropdown lapply(datatypes, function(x) { observeEvent(input[[paste0("dropdown_", x)]], { updateSelectInput(session, paste0("header_dropdown_", x), @@ -156,90 +139,132 @@ shinyServer(function(input, output, session) { }) observeEvent(input$update_confirm, { - if (input$update_confirm == TRUE) { - lapply(datatypes, function(x) { - updateSelectInput(session, paste0("dropdown_", x), - selected = input[[paste0("header_dropdown_", x)]] - ) - }) - } + req(input$update_confirm == TRUE) + isUpdateFolder(TRUE) + lapply(datatypes, function(x) { + updateSelectInput(session, paste0("dropdown_", x), + selected = input[[paste0("header_dropdown_", x)]] + ) + }) + }) + + ######## Update Folder List ######## + lapply(c("header_dropdown_", "dropdown_"), function(x) { + observeEvent(ignoreInit = TRUE, input[[paste0(x, "project")]], { + # get synID of selected project + projectID <- datatype_list$projects[[input[[paste0(x, "project")]]]] + + # gets folders per project + folder_df <- syn_tableQuery(sprintf("select name, id from %s where type = 'folder' and projectId = '%s'", config$main_fileview, projectID))$asDataFrame() + + folder_list <- setNames(as.list(folder_df$id), folder_df$name) + + # updates foldernames + updateSelectInput(session, paste0(x, "folder"), choices = sort(names(folder_list))) + + if (x == "dropdown_") { + project_synID <<- projectID + datatype_list$folders <<- folder_list + } + + if (isUpdateFolder()) { + # sync with header dropdown + updateSelectInput(session, "dropdown_folder", selected = input[["header_dropdown_folder"]]) + isUpdateFolder(FALSE) + } + }) }) ######## Update Template ######## # update selected schema template name observeEvent(input$dropdown_template, { - template_schema_name <<- template_namedList[match(input$dropdown_template, names(template_namedList))] + template_schema_name(template_namedList[match(input$dropdown_template, names(template_namedList))]) }) - # hide tags when users select new template - observeEvent( - { - input$dropdown_folder - input$dropdown_template - }, - { - sapply(clean_tags, FUN = hide) - } - ) - ######## Template Google Sheet Link ######## - observeEvent(input$btn_download, { - - # loading screen for template link generation - dcWaiter("show", msg = "Generating link...") + observeEvent(c(input$dropdown_folder, input$tabs), { + req(input$tabs %in% c("tab_template", "tab_upload")) + tmp_folder_synID <- datatype_list$folders[[input$dropdown_folder]] + req(tmp_folder_synID != folder_synID()) # if folder changes # update selected folder ID - folder_synID <<- datatype_list$folders[[input$dropdown_folder]] + folder_synID(tmp_folder_synID) - if (is.null(input$dropdown_template)) { - output$text_download <- renderUI({ - tags$span(class = "error_msg", HTML("Please select a template from the 'Select your Dataset' tab !")) - }) - } else { - # checks if a manifest already exists - existing_manifestID <- synapse_driver$getDatasetManifest( + if (input$tabs == "tab_template") { + dcWaiter("show", msg = paste0("Getting files in ", input$dropdown_folder, "...")) + # get file list in selected folder + file_list <- synapse_driver$getFilesInStorageDataset( synStore_obj, - folder_synID + folder_synID() ) - if (existing_manifestID == "") { - # get file list in selected folder - # don't put in the observation of folder dropdown - # it will crash if users switch folders too often - file_list <- synapse_driver$getFilesInStorageDataset( - synStore_obj, - folder_synID - ) - datatype_list$files <<- list2Vector(file_list) + datatype_list$files <<- list2Vector(file_list) + dcWaiter("hide") + } + }) - manifest_url <- - metadata_model$getModelManifest(paste0(config$community, " ", input$dropdown_template), - template_schema_name, - filenames = as.list(names(datatype_list$files)), - datasetId = folder_synID, - useAnnotations = T - ) + # display warning message if folder is empty and data type is assay + observeEvent(c(folder_synID(), template_schema_name()), { + + # hide tags when users select new template + sapply(clean_tags, FUN = hide) + + req(input$tabs == "tab_template") + hide("div_template_warn") + template_type <<- config$manifest_schemas$type[match(template_schema_name(), template_namedList)] + req(length(datatype_list$files) == 0 & template_type == "assay") + warn_text <- paste0( + strong(sQuote(input$dropdown_folder)), " folder is empty, + please upload your data before generating manifest.", + "

", strong(sQuote(input$dropdown_template)), + " requires data files to be uploaded prior generating and submitting templates.", + "

", "Filling in a template before uploading your data, + may result in errors and delays in your data submission later." + ) - # make sure not scalar if length of list is 1 in R - # add in the step to convert names later - } else { - # if the manifest already exists - manifest_entity <- syn_get(existing_manifestID) - manifest_url <- metadata_model$populateModelManifest(paste0( - config$community, - " ", input$dropdown_template - ), manifest_entity$path, template_schema_name) - } + nx_report_warning("Warning", HTML(warn_text)) + output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) - output$text_download <- renderUI({ - tags$a(href = manifest_url, manifest_url, target = "_blank") ### add link to data dictionary when we have it ### - }) - } + show("div_template_warn") + }) + + observeEvent(input$btn_template, { + + # loading screen for template link generation + dcWaiter("show", msg = "Generating link...") + + manifest_url <- + metadata_model$getModelManifest(paste0(config$community, " ", input$dropdown_template), + template_schema_name(), + filenames = switch((template_type == "assay") + 1, + NULL, + as.list(names(datatype_list$files)) + ), + datasetId = folder_synID(), + useAnnotations = T + ) + + # generate link + output$text_template <- renderUI( + tags$a(id = "template_link", href = manifest_url, list(icon("hand-point-right"), manifest_url), target = "_blank") + ) dcWaiter("hide", sleep = 1) + + nx_confirm( + inputId = "btn_template_confirm", + title = "Go to the template now?", + message = paste0("click 'Go' to edit your ", sQuote(input$dropdown_template), " template on the google sheet"), + button_ok = "Go", + ) + # display link - show("div_download") # TODO: add progress bar on (loading) screen + show("div_template") # TODO: add progress bar on (loading) screen }) + observeEvent(input$btn_template_confirm, { + req(input$btn_template_confirm == TRUE) + runjs("$('#template_link')[0].click();") + }) ######## Reads .csv File ######## inFile <- csvInfileServer("inputFile", colsAsCharacters = TRUE, keepBlank = TRUE) @@ -261,7 +286,7 @@ shinyServer(function(input, output, session) { silent = TRUE, annotation_status <- metadata_model$validateModelManifest( inFile$raw()$datapath, - template_schema_name + template_schema_name() ) ) @@ -276,9 +301,11 @@ shinyServer(function(input, output, session) { # render empty if error is not "invaid value" type - ifelse() will not work if (valRes$errorType == "Invalid Value") { DTableServer("tbl_validate", valRes$errorDT, + rownames = FALSE, filter = "none", + caption = "View all the error(s) highlighted in the preview table above", options = list( pageLength = 50, scrollX = TRUE, - scrollY = min(50 * length(annotation_status), 400), lengthChange = FALSE, + scrollY = min(50 * nrow(valRes$errorDT), 400), lengthChange = FALSE, info = FALSE, searching = FALSE ) ) @@ -289,9 +316,10 @@ shinyServer(function(input, output, session) { if (valRes$errorType == "Wrong Schema") { DTableServer("tbl_preview", data = inFile$data(), highlight = "full") } else { - DTableServer("tbl_preview", + DTableServer( + "tbl_preview", data = inFile$data(), - highlight = "partial", hightlight.col = valRes$errorDT$Column, hightlight.value = valRes$errorDT$Value + highlight = "partial", highlightValues = valRes$errorHighlight ) } @@ -320,7 +348,7 @@ shinyServer(function(input, output, session) { filled_manifest <- metadata_model$populateModelManifest(paste0( config$community, " ", input$dropdown_template - ), inFile$raw()$datapath, template_schema_name) + ), inFile$raw()$datapath, template_schema_name()) # rerender and change button to link output$val_gsheet <- renderUI({ @@ -336,85 +364,85 @@ shinyServer(function(input, output, session) { # loading screen for submitting data dcWaiter("show", msg = "Submitting...") + dir.create("./tmp", showWarnings = FALSE) + # reads file csv again submit_data <- csvInfileServer("inputFile")$data() - # IF an assay component selected (define assay components) note for future + + # If an assay component selected (define assay components) note for future # the type to filter (eg assay) on could probably also be a config choice assay_schemas <- config$manifest_schemas$display_name[config$manifest_schemas$type == "assay"] - # iffolder_ID has not been updated yet - if (is.null(folder_synID)) folder_synID <<- datatype_list$folders[[input$dropdown_folder]] - # and adds entityID, saves it as synapse_storage_manifest.csv, then associates - # with synapse files + # if folder_ID has not been updated yet + if (folder_synID() == "") folder_synID(datatype_list$folders[[input$dropdown_folder]]) + if (input$dropdown_template %in% assay_schemas) { # make into a csv or table for assay components already has entityId if ("entityId" %in% colnames(submit_data)) { write.csv(submit_data, - file = "./files/synapse_storage_manifest.csv", + file = "./tmp/synapse_storage_manifest.csv", quote = TRUE, row.names = FALSE, na = "" ) } else { - file_list <- synapse_driver$getFilesInStorageDataset(synStore_obj, folder_synID) + file_list <- synapse_driver$getFilesInStorageDataset(synStore_obj, folder_synID()) datatype_list$files <<- list2Vector(file_list) # better filename checking is needed - files_df <- stack(datatype_list$files) # crash if no file existing + # TODO: crash if no file existing + files_df <- stack(datatype_list$files) + # adds entityID, saves it as synapse_storage_manifest.csv, then associates with synapse files colnames(files_df) <- c("entityId", "Filename") files_entity <- inner_join(submit_data, files_df, by = "Filename") write.csv(files_entity, - file = "./files/synapse_storage_manifest.csv", + file = "./tmp/synapse_storage_manifest.csv", quote = TRUE, row.names = FALSE, na = "" ) } # associates metadata with data and returns manifest id - logjs("haha6") manifest_id <- synapse_driver$associateMetadataWithFiles( synStore_obj, - "./files/synapse_storage_manifest.csv", folder_synID, + "./tmp/synapse_storage_manifest.csv", folder_synID(), useSchemaLabel = FALSE ) - logjs("haha7") - manifest_path <- paste0("synapse.org/#!Synapse:", manifest_id) + manifest_path <- tags$a(href = paste0("synapse.org/#!Synapse:", manifest_id), manifest_id, target = "_blank") + # if no error if (startsWith(manifest_id, "syn") == TRUE) { - rm("./files/synapse_storage_manifest.csv") dcWaiter("hide") - nx_report_success("Success!", paste0("Manifest submitted to: ", manifest_path)) + nx_report_success("Success!", HTML(paste0("Manifest submitted to: ", manifest_path))) - # clean up inputfile + # clean up old inputs/results sapply(clean_tags, FUN = hide) + reset("inputFile-file") DTableServer("tbl_preview", data.frame(NULL)) - # TODO: input file not reset yet - # reset(c(clean_tags, "inputFile", "tbl_preview")) if reset works } else { dcWaiter("update", msg = HTML(paste0( "Uh oh, looks like something went wrong!", manifest_id, " is not a valid Synapse ID. Try again?" )), sleep = 3) - rm("/tmp/synapse_storage_manifest.csv") } } else { # if not assay type tempalte write.csv(submit_data, - file = "./files/synapse_storage_manifest.csv", quote = TRUE, + file = "./tmp/synapse_storage_manifest.csv", quote = TRUE, row.names = FALSE, na = "" ) # associates metadata with data and returns manifest id manifest_id <- synapse_driver$associateMetadataWithFiles( synStore_obj, - "./files/synapse_storage_manifest.csv", folder_synID, + "./tmp/synapse_storage_manifest.csv", folder_synID(), useSchemaLabel = FALSE + ) - print(manifest_id) - manifest_path <- paste0("synapse.org/#!Synapse:", manifest_id) + manifest_path <- tags$a(href = paste0("synapse.org/#!Synapse:", manifest_id), manifest_id, target = "_blank") # if uploaded provided valid synID message if (startsWith(manifest_id, "syn") == TRUE) { - nx_report_success("Success!", paste0("Manifest submitted to: ", manifest_path)) - rm("./files/synapse_storage_manifest.csv") + dcWaiter("hide") + nx_report_success("Success!", HTML(paste0("Manifest submitted to: ", manifest_path))) # clear inputs sapply(clean_tags, FUN = hide) @@ -436,8 +464,9 @@ shinyServer(function(input, output, session) { "Uh oh, looks like something went wrong!", manifest_id, " is not a valid Synapse ID. Try again?" )), sleep = 3) - rm("/tmp/synapse_storage_manifest.csv") } } + # delete tmp manifest + unlink("./tmp/synapse_storage_manifest.csv") }) }) diff --git a/ui.R b/ui.R index c27c7861..1ced1ca2 100644 --- a/ui.R +++ b/ui.R @@ -21,7 +21,7 @@ ui <- shinydashboardPlus::dashboardPage( dropdownBlock( id = "header_selection_dropdown", title = "Selection", - icon = icon("sliders"), + icon = icon("sliders-h"), badgeStatus = "info", fluidRow( lapply(datatypes, function(x) { @@ -34,10 +34,7 @@ ui <- shinydashboardPlus::dashboardPage( ) ) }), - actionButton( - inputId = "btn_header_update", class = "btn-shiny-effect", - label = NULL, icon = icon("sync-alt") - ) + actionButton("btn_header_update", NULL, icon("sync-alt"), class = "btn-shiny-effect") ) ) ), @@ -94,9 +91,10 @@ ui <- shinydashboardPlus::dashboardPage( dashboardBody( tags$head( tags$style(sass(sass_file("www/scss/main.scss"))), - singleton(includeScript("www/js/readCookie.js")) + singleton(includeScript("www/js/readCookie.js")), + tags$script(htmlwidgets::JS("setTimeout(function(){history.pushState({}, 'Data Curator', window.location.pathname);},2000);")) ), - use_notiflix_report(), + use_notiflix_report(width = "400px"), use_waiter(), tabItems( # First tab content @@ -166,14 +164,19 @@ ui <- shinydashboardPlus::dashboardPage( title = "Get Link, Annotate, and Download Template as CSV", status = "primary", width = 12, - actionButton("btn_download", "Click to Generate Google Sheets Template", + actionButton("btn_template", "Click to Generate Google Sheets Template", class = "btn-primary-color" ), hidden( div( - id = "div_download", + id = "div_template_warn", + height = "100%", + htmlOutput("text_template_warn") + ), + div( + id = "div_template", height = "100%", - htmlOutput("text_download") + htmlOutput("text_template") ) ), helpText("This link will leads to an empty template or your previously submitted template with new files if applicable.") @@ -227,7 +230,7 @@ ui <- shinydashboardPlus::dashboardPage( ) ), # waiter loading screen - dcWaiter("show", isLogin = TRUE) + dcWaiter("show", landing = TRUE) ) ) @@ -241,4 +244,4 @@ uiFunc <- function(req) { } else { ui } -} +} \ No newline at end of file diff --git a/www/scss/basic/_button.scss b/www/scss/basic/_button.scss index 31b83af6..00c11c53 100644 --- a/www/scss/basic/_button.scss +++ b/www/scss/basic/_button.scss @@ -120,7 +120,6 @@ } } - // simple float effect // #btn_download, #btn_validate, #btn_val_gsheet, #btn_submit .btn-primary-color { diff --git a/www/scss/basic/_message.scss b/www/scss/basic/_message.scss index 6b192356..4c996168 100644 --- a/www/scss/basic/_message.scss +++ b/www/scss/basic/_message.scss @@ -14,6 +14,9 @@ color: $success_col; } +.warn_msg { + color: $warning_col; +} // notification .shiny-notification { position:fixed; diff --git a/www/scss/basic/_variables.scss b/www/scss/basic/_variables.scss index 90015c30..a1e5a70b 100644 --- a/www/scss/basic/_variables.scss +++ b/www/scss/basic/_variables.scss @@ -7,6 +7,7 @@ $light: #f8f9fa; $light2: #f4f4f4; $dark: #343a40; $glass_grey: rgba(104, 103, 103, 0.3); +$organe_red: #e55a17; // section color $bg_primary_col: $light; @@ -18,6 +19,7 @@ $footer_bg_col: #202020; // message color $error_col: #E53935; $success_col: #28a745; +$warning_col: #FF9900; $notif_process_col: #F7DC6F; $notif_success_col: #82E0AA; diff --git a/www/scss/section/_content.scss b/www/scss/section/_content.scss index 746c823f..7b91471c 100644 --- a/www/scss/section/_content.scss +++ b/www/scss/section/_content.scss @@ -52,6 +52,24 @@ } } +#div_template { + margin: 20px 0; + + #template_link { + margin-left: 5px; // align help text + color: $organe_red; + font-size: 1.2em; + + &:hover { + text-decoration: underline; + } + } +} + +#div_template_warn { + margin-left: 5px; +} + #div_download, #div_validate, #div_val_gsheet { font-size: 18px; background-color: white; diff --git a/www/scss/section/_header.scss b/www/scss/section/_header.scss index 65731949..86bf232d 100644 --- a/www/scss/section/_header.scss +++ b/www/scss/section/_header.scss @@ -29,7 +29,7 @@ // custom dropdown - leftUI // when the box open - .open>a { + .open>a { background-color: $glass_grey !important; &:focus, &:hover { @@ -44,11 +44,10 @@ animation: fadeIn 100ms; ul.menu { - padding: 0 5px !important; // reset all margin - & * { + * { margin: 0px; } @@ -62,7 +61,19 @@ .shiny-input-container{ width: 250px; margin: 5px; - height: 34px; // remove extra space bottom + height: 34px; // match button height + + .selectize-input { + height: 20px; + } + + .item { + display: inline-block; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } } } diff --git a/www/scss/section/_navigation.scss b/www/scss/section/_navigation.scss deleted file mode 100644 index c06cdc59..00000000 --- a/www/scss/section/_navigation.scss +++ /dev/null @@ -1,3 +0,0 @@ -.navbar { - min-height: 50px !important -} \ No newline at end of file