From 7be6cc5b90077b0d094f8a2e3bff165755f932e4 Mon Sep 17 00:00:00 2001 From: Natalie Elphick Date: Mon, 25 Mar 2024 13:48:33 -0700 Subject: [PATCH] Finish part 1 working on wynton slides --- docs/Working_on_Wynton_Part_1.html | 1186 +++++++++++++ working-on-wynton-hpc/.Rprofile | 1 + working-on-wynton-hpc/README.md | 12 +- .../Working_on_Wynton_Part_1.Rmd | 412 +++++ working-on-wynton-hpc/renv.lock | 1551 +++++++++++++++++ working-on-wynton-hpc/renv/.gitignore | 7 + working-on-wynton-hpc/renv/activate.R | 1201 +++++++++++++ working-on-wynton-hpc/renv/settings.json | 19 + .../Gladstone_Wynton_Docs.pdf | Bin .../slide_materials/HPC_diagram.png | Bin 0 -> 136053 bytes .../{ => slide_materials}/status-chart.png | Bin working-on-wynton-hpc/style.css | 162 ++ .../working-on-wynton-hpc.Rproj | 13 + 13 files changed, 4563 insertions(+), 1 deletion(-) create mode 100644 docs/Working_on_Wynton_Part_1.html create mode 100644 working-on-wynton-hpc/.Rprofile create mode 100644 working-on-wynton-hpc/Working_on_Wynton_Part_1.Rmd create mode 100644 working-on-wynton-hpc/renv.lock create mode 100644 working-on-wynton-hpc/renv/.gitignore create mode 100644 working-on-wynton-hpc/renv/activate.R create mode 100644 working-on-wynton-hpc/renv/settings.json rename working-on-wynton-hpc/{ => slide_materials}/Gladstone_Wynton_Docs.pdf (100%) create mode 100644 working-on-wynton-hpc/slide_materials/HPC_diagram.png rename working-on-wynton-hpc/{ => slide_materials}/status-chart.png (100%) create mode 100644 working-on-wynton-hpc/style.css create mode 100644 working-on-wynton-hpc/working-on-wynton-hpc.Rproj diff --git a/docs/Working_on_Wynton_Part_1.html b/docs/Working_on_Wynton_Part_1.html new file mode 100644 index 0000000..b894631 --- /dev/null +++ b/docs/Working_on_Wynton_Part_1.html @@ -0,0 +1,1186 @@ + + + + + + + Working on Wynton - Part 1 + + + + + + + + + + + + + + + + + +
+
+ +
+

Working on Wynton - Part 1

+

Natalie Elphick

+

April 15th, 2024

+
+ +
+

+
+Press the ? key for tips on navigating these slides +
+
+
+

Introductions

+

Natalie Elphick
+Bioinformatician I

+

Alex Pico (TA)
+Bioinformatics Core Director

+
+
+

Target Audience

+
    +
  • Prior experience with UNIX command-line
  • +
+
+
+

Part 1:

+
    +
  1. What is an HPC cluster?
  2. +
  3. Node Types and Loging in
  4. +
  5. Storage
  6. +
  7. Data Transfer
  8. +
  9. Installing Software
  10. +
  11. Containers
  12. +
+
+
+
+

What is Wynton HPC?

+ +
+
+

High-performance Computing Cluster

+
    +
  • A collection of specialized computers (nodes) connected together on +a fast local network
  • +
+

HPC Diagram

+
+
+

Wynton

+
    +
  • A HPC Linux environment available to all UCSF researchers for +free
    +
  • +
  • Includes several hundred compute nodes and a large shared storage +system (Cluster +specifications)
    +
  • +
  • Funded and administered cooperatively by UCSF campus IT and key +research groups
  • +
+

https://wynton.ucsf.edu

+
+
+
+

Node Types and Logging in

+ +
+
+

Node Types

+
    +
  • Login: Submit and query jobs. SSH to development +nodes. File management.
  • +
  • Development: Compile and install software. Test job +scripts. Submit and query jobs. Version control. File management.
  • +
  • Compute: Running short and long-running job +scripts.
  • +
  • Transfer: Fast in- & outbound file transfers. +File management.
  • +
+
+
+

The Login Nodes

+
    +
  • Only capable of basic tasks (file management, submitting and +checking on jobs)
  • +
  • Lacks access to pre-installed software tools that the development +nodes have
  • +
  • The primary method to log in is to use an SSH client +application
  • +
  • The Wynton HPC is up to date with information on logging in: Access +Cluster
  • +
+

Names:

+

log1, log2 and plog (for PHI users)

+
+
+

Login

+
    +
  • Make sure you are on the UCSF or Gladstone WiFi networks (or the +respective VPN)
  • +
  • ssh +[your-username]@[node-name].wynton.ucsf.edu
  • +
+
{local}$ ssh alice@log1.wynton.ucsf.edu
+alice@log1.wynton.ucsf.edu's password: 
+[alice@log1 ~]$
+
    +
  • There will not be any visual feedback when typing your password
  • +
+
+
+

The Development Nodes

+
    +
  • Has a set of core +software installed +
      +
    • e.g. git, vim, nano, make and python
    • +
  • +
  • Also has access to software +repositories some which are maintained by other users or research +groups +
      +
    • e.g. matlab, R and openjdk
    • +
  • +
  • Cannot be logged in to directly, only from a login node
  • +
+
ssh dev1
+

Names:

+

dev[1-3], gpudev1, pdev1 (PHI) and pgpudev1 (PHI)

+
+
+

Data Transfer Nodes

+
    +
  • Can be logged in to directly
  • +
  • Fast network speed
  • +
  • Limited software
  • +
  • Use for transferring files to and from Wynton
  • +
+

Example:

+
{local}$ scp local_file.tsv alice@dt1.wynton.ucsf.edu:~/
+

Names:

+

dt1 and dt2

+
+
+
+

Storage

+ +
+
+

BeeGFS

+
    +
  • Wynton uses a parallel file system called BeeGFS +
      +
    • The files are stored as “chunks” spread across many different +servers
    • +
  • +
  • BeeGFS has multiple services that work together to manage the file +system +
      +
    • Storage (stores the chunks)
    • +
    • Metadata (tracks the chunks and information about their file)
    • +
    • Management (tracks all of the services)
    • +
    • Client (provides linux access to the file system)
    • +
  • +
+
+
+

BeeGFS - Advantages

+
    +
  • High throughput
  • +
  • Redundancy can be built in by mirroring services
  • +
  • Adding new storage is fast and does not require downtime
  • +
+
+
+

BeeGFS - Caveats

+
    +
  • For any client node, performance is limited by the network bandwidth +of that node
  • +
  • Network latency becomes extremely important for all metadata +requests
  • +
  • Certain input/output patterns can be problematic
  • +
+
+
+

BeeGFS - I/O patterns

+
    +
  • Anything that requires lots of metadata operations can feel slow +
      +
    • e.g: lots of writes to the same directory and lots of file lookups +and directory searches (conda)
    • +
  • +
  • Users are strongly encouraged to keep the number of reads and writes +to a single directory to a reasonable number
  • +
  • If using conda, putting the conda application inside a Apptainer +(formerly singularity) container will result in better overall file +system performance
  • +
+
+
+

BeeGFS - Tips

+
    +
  • Some general guidelines for optimum use of BeeGFS
  • +
  • Prefer fewer, large files over many small ones
  • +
  • Distribute reading and writing over several directories +
      +
    • Including compute job output and error files
    • +
  • +
  • Use local scratch (/scratch) when possible
  • +
  • Don’t include anything in /wynton in your default +LD_LIBRARY_PATH
  • +
+
+
+

Storage

+
    +
  • Wynton storage is not backed up
  • +
  • /wynton/[group_name]/[user] +
      +
    • User home directory - limited to 500 GiB
    • +
  • +
  • /wynton/[group_name] +
      +
    • User group directory - disk quota varies by group
    • +
  • +
  • More +information on disk quotas
  • +
+

To check your group disk quota run:

+
beegfs-ctl --getquota --storagepoolid=12 --gid "$(id --group)"
+
+
+

Scratch - Temporary Storage

+
    +
  • Local /scratch - 0.1-1.8 TiB/node storage unique to +each compute node +
      +
    • Can only be accessed from the specific compute node
    • +
  • +
  • /wynton/scratch and +/wynton/protected/scratch (for PHI users) +
      +
    • 703 TiB storage accessible from everywhere
    • +
  • +
  • No quotas
  • +
+


+

Files not used for 2 weeks are automatically +deleted

+
+
+

Gladstone HIVE

+
    +
  • Gladstone’s HIVE storage server is mounted directly to Wynton under +/gladstone +
      +
    • Only certain HIVE folders are accessible directly on Wynton
    • +
    • Files under /gladstone are backed up
    • +
  • +
  • Naming: /gladstone/[lab]/[share]
  • +
  • For more information visit the IT +knowledge base page
  • +
+
+
+
+

Data Transfer

+ +
+
+

Secure Copy - scp

+
    +
  • Local file to Wynton
  • +
+
{local}$ scp /path/to/local_file.tsv alice@dt1.wynton.ucsf.edu:/destination/path
+
    +
  • Copy a directory to a folder on Wynton
  • +
+
{local}$ scp -r local_folder/ alice@dt1.wynton.ucsf.edu:/destination/path
+
    +
  • Copy a single file to Wynton from your local machine
  • +
+
{local}$ scp alice@dt1.wynton.ucsf.edu:/path/to/local_file.tsv /destination/path
+
+
+

GUI SFTP Clients

+
    +
  • These let you transfer files to and from Wynton using a GUI
  • +
  • 2 +factor authentication may be required
  • +
  • Cyberduck +
      +
    • Navigate to Preferences -> Transfers -> General
    • +
    • change the Transfer Files setting “Use browser connection” instead +of “Open Multiple connections”
    • +
  • +
  • FileZilla +
      +
    • In the General tab, select ‘SFTP’ as the Protocol instead of +‘FTP’
    • +
    • For Logon Type, select ‘Interactive’ instead of ‘Ask for +Password’
    • +
    • Under the Transfer Settings tab, you might need to click the ‘Limit +number of simultaneous connections’ and make sure the ‘Maximum number of +connections’ is set to 1
    • +
  • +
+
+
+

Globus

+
    +
  • Globus is a +non-profit service for moving, syncing, and sharing large amounts of +data asynchronously in the background
  • +
  • Wynton Accounts are not required to transfer data with Globus
  • +
  • Useful for transferring data between institutions
  • +
+
+
+

Rclone

+
    +
  • Rclone is a command-line program to manage files on remote +storage
  • +
  • Can be used to transfer data from Wynton directly to DropBox or other storage systems +(AWS, Azure, Google Drive etc.) +
      +
    • Do this from a data transfer node using screen/tmux
    • +
  • +
  • Do not use rclone for transfers to Box, follow the Wynton to +UCSF Box instructions
  • +
+
+
+
+

Installing Software

+ +
+
+

Basics

+
    +
  • Ensure the software you are trying to install is compatible with +Rocky linux (use a container if not)
  • +
  • Check if the tool is already available in a module
  • +
  • Always install software in a development node
  • +
  • Download a precompiled binary or install +from source
  • +
+
+
+

Install Samtools from Source

+
    +
  1. Download and extract source code
  2. +
+
[alice@dev1 ~]$ mkdir -p "/scratch/$USER"
+[alice@dev1 ~]$ cd "/scratch/$USER"
+[alice@dev1 alice]$ wget https://github.com/samtools/samtools/releases/download/1.19.2/samtools-1.19.2.tar.bz2
+[alice@dev1 alice]$ tar -x -f samtools-1.19.2.tar.bz2
+
    +
  1. Create install location and configure
  2. +
+
[alice@dev1 ~]$ mkdir -p $HOME/software/samtools-1.14
+[alice@dev1 ~]$ ./configure --prefix=$HOME/software/samtools-1.14
+
    +
  1. Build and install
  2. +
+
[alice@dev1 ~]$ make
+[alice@dev1 ~]$ make install
+
+
+

Install Nextflow for Part 2

+
    +
  • In part 2, we will run the nextflow rna-seq pipeline
  • +
  • Run the following to install nextflow:
  • +
+
[alice@dev1 ~]$ cd ~/software
+[alice@dev1 ~]$ curl -s "https://get.sdkman.io" | bash
+[alice@dev1 ~]$ exit
+[alice@log1 ~]$ ssh dev1
+[alice@dev1 ~]$ sdk install java 17.0.6-tem
+[alice@dev1 ~]$ wget -qO- https://get.nextflow.io | bash
+
    +
  • Let us know if you run into any errors
  • +
+
+
+
+

Containers

+ +
+
+

Definitions

+
    +
  • Virtualization: When software mimics the functions +of physical hardware to run virtual machines +
      +
    • Work around to use OS specific or legacy software that might be hard +to install
    • +
    • Improves reproducibility
    • +
  • +
  • Containers: Implements virtualization using an +image as its base
  • +
  • Images: An ordered collection of root filesystem +changes and the corresponding execution parameters for use within a +container runtime
  • +
+
+
+

Apptainer

+
    +
  • Wynton supports Apptainer +(formerly singularity) containers

  • +
  • Docker is a commonly used +container creation software, these can be turned into apptainer +containers easily

  • +
  • apptainer run

    +
      +
    • Run predefined script within container
    • +
  • +
  • apptainer exec

    +
      +
    • Execute any command within container
    • +
  • +
  • apptainer shell

    +
      +
    • Run bash shell within container
    • +
  • +
+
+
+

Example Container - Hello World

+
    +
  • Run this command to convert the public Docker image to a apptainer +image file
  • +
+
[alice@dev1 ~]$ apptainer pull docker://natalie23gill/hello-world:1.0
+
    +
  • Execute the “hi” command in the container
  • +
+
[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif hi
+
    __  __     ____         _       __           __    __   __
+   / / / /__  / / /___     | |     / /___  _____/ /___/ /  / /
+  / /_/ / _ \/ / / __ \    | | /| / / __ \/ ___/ / __  /  / / 
+ / __  /  __/ / / /_/ /    | |/ |/ / /_/ / /  / / /_/ /  /_/  
+/_/ /_/\___/_/_/\____/     |__/|__/\____/_/  /_/\__,_/  (_) 
+
+
+

Example Container - Hello World

+
    +
  • This container has figlet installed which creates +ASCII art from text input
  • +
  • Try running this command to create your own using exec
  • +
+
[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif figlet your_text
+
+
+

Docker

+
    +
  • Docker uses Dockerfiles to specify image creation
  • +
  • Preferred by the Gladstone Bioinformatics Core to create new +images
  • +
  • In part 2, we will go over how to build custom container images from +DockerFiles +
  • +
  • To see the Dockerfile used to create the hello-world image, +run:
  • +
+
[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif cat /Dockerfile
+
+
+
+

End of Part 1

+ +
+
+

Thank You!

+ +
+
+

Upcoming Data Science Training Program Workshops

+

Introduction +to Linear Mixed Effects Models
+April 25-April 26, 2024 1-3pm PDT

+

Single +Cell RNA-Seq Data Analysis
+April 29-April 30, 2024 9am-4pm PDT

+

Single +Cell ATAC-Seq Data Analysis Part 1
+May 6-May 7, 2024 1-4pm PDT

+

Complete Schedule
+Click “Data Science Training Program”

+
+
+
+ + + + + + + + + + + + + + diff --git a/working-on-wynton-hpc/.Rprofile b/working-on-wynton-hpc/.Rprofile new file mode 100644 index 0000000..81b960f --- /dev/null +++ b/working-on-wynton-hpc/.Rprofile @@ -0,0 +1 @@ +source("renv/activate.R") diff --git a/working-on-wynton-hpc/README.md b/working-on-wynton-hpc/README.md index 83f1535..1098c53 100644 --- a/working-on-wynton-hpc/README.md +++ b/working-on-wynton-hpc/README.md @@ -2,4 +2,14 @@ [Link to wiki](https://github.com/gladstone-institutes/Bioinformatics-Workshops/wiki/Working-on-Wynton-HPC) -### Description of files +## Structure + +- `working-on-wynton-hpc.Rproj` : Used to manage the `renv` for the workshop slides + - To install the project env, open this file and run `renv::restore()` in the console + +- `./slide_materials` : Contains any images/assets needed for the slides. +- `./workshop_materials` : Contains any materials needed by the registrants (switch to using DropBox if the size of this becomes too large) +- `./renv` : Used by `renv` to manage project library, do not modfiy these files directly +- `./Working_on_Wynton_Part_1.Rmd` : revealjs based slides for part 1 +- `./Working_on_Wynton_Part_2.Rmd` : revealjs based slides for part 2 +- `./style.css` : CSS style sheet for both sets of revealjs slides diff --git a/working-on-wynton-hpc/Working_on_Wynton_Part_1.Rmd b/working-on-wynton-hpc/Working_on_Wynton_Part_1.Rmd new file mode 100644 index 0000000..5127161 --- /dev/null +++ b/working-on-wynton-hpc/Working_on_Wynton_Part_1.Rmd @@ -0,0 +1,412 @@ +--- +title: "Working on Wynton - Part 1" +author: "Natalie Elphick" +date: "April 15th, 2024" +knit: (function(input, ...) { + rmarkdown::render( + input, + output_dir = "../docs" + ) + }) +output: + revealjs::revealjs_presentation: + theme: simple + highlight: default + css: style.css +--- + +```{r, setup, include=FALSE} +library(tidyverse) +``` + +## + +
*Press the ? key for tips on navigating these slides*
+ +## Introductions + +**Natalie Elphick** +Bioinformatician I + +**Alex Pico (TA)** +Bioinformatics Core Director + + +## Target Audience +- Prior experience with UNIX command-line + + + +## Part 1: + +1. What is an HPC cluster? +2. Node Types and Loging in +3. Storage +4. Data Transfer +5. Installing Software +6. Containers + + + +# What is Wynton HPC? + +## High-performance Computing Cluster + +- A collection of specialized computers (nodes) connected together on a fast local network + +![HPC Diagram](slide_materials/HPC_diagram.png) + + + +## Wynton {.small-bullets} + +- A HPC Linux environment available to all UCSF researchers for free +- Includes several hundred compute nodes and a large shared storage system ([Cluster specifications](https://wynton.ucsf.edu/hpc/about/specs.html)) +- Funded and administered cooperatively by UCSF campus IT and key research groups + +[https://wynton.ucsf.edu](https://wynton.ucsf.edu) + + + +# Node Types and Logging in + +## Node Types {.small-bullets} + +- **Login:** Submit and query jobs. SSH to development nodes. File management. +- **Development:** Compile and install software. Test job scripts. Submit and query jobs. Version control. File management. +- **Compute:** Running short and long-running job scripts. +- **Transfer:** Fast in- & outbound file transfers. File management. + +## The Login Nodes {.small-bullets} + +- Only capable of basic tasks (file management, submitting and checking on jobs) +- Lacks access to pre-installed software tools that the development nodes have +- The primary method to log in is to use an SSH client application +- The Wynton HPC is up to date with information on logging in: [Access Cluster](https://wynton.ucsf.edu/hpc/get-started/access-cluster.html) + +Names: + + +log1, log2 and plog (for PHI users) + +## Login {.small-bullets} + +- Make sure you are on the UCSF or Gladstone WiFi networks (or the respective VPN) +- **ssh [your-username]@[node-name].wynton.ucsf.edu** + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "{local}$ ssh alice@log1.wynton.ucsf.edu +alice@log1.wynton.ucsf.edu's password: +[alice@log1 ~]$" +``` + +- There will not be any visual feedback when typing your password + + +## The Development Nodes {.small-bullets} + +- Has a set of [core software](https://wynton.ucsf.edu/hpc/software/core-software.html) installed + - e.g. git, vim, nano, make and python +- Also has access to [software repositories](https://wynton.ucsf.edu/hpc/software/software-repositories.htmll) some which are maintained by other users or research groups + - e.g. matlab, R and openjdk +- Cannot be logged in to directly, only from a login node +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "ssh dev1" +``` + +Names: + +dev[1-3], gpudev1, pdev1 (PHI) and pgpudev1 (PHI) + +## Data Transfer Nodes {.small-bullets} + +- Can be logged in to directly +- Fast network speed +- Limited software +- Use for transferring files to and from Wynton + +Example: + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "{local}$ scp local_file.tsv alice@dt1.wynton.ucsf.edu:~/" +``` + +Names: + +dt1 and dt2 + + +# Storage + +## BeeGFS {.small-bullets} + +- Wynton uses a *parallel* file system called BeeGFS + - The files are stored as "chunks" spread across many different servers +- BeeGFS has multiple services that work together to manage the file system + - Storage (stores the chunks) + - Metadata (tracks the chunks and information about their file) + - Management (tracks all of the services) + - Client (provides linux access to the file system) + + +## BeeGFS - Advantages +- High throughput +- Redundancy can be built in by mirroring services +- Adding new storage is fast and does not require downtime + +## BeeGFS - Caveats +- For any client node, performance is limited by the network bandwidth of that node +- Network latency becomes extremely important for all metadata requests +- Certain input/output patterns can be problematic + +## BeeGFS - I/O patterns {.small-bullets} +- Anything that requires lots of metadata operations can feel slow + - e.g: lots of writes to the same directory and lots of file lookups and directory searches (**conda**) +- Users are strongly encouraged to keep the number of reads and writes to a single directory to a reasonable number +- If using conda, putting the conda application inside a Apptainer (formerly singularity) container will result in better overall file system performance + +## BeeGFS - Tips + +- Some general guidelines for optimum use of BeeGFS +- Prefer fewer, large files over many small ones +- Distribute reading and writing over several directories + - Including compute job output and error files +- Use local scratch (/scratch) when possible +- Don't include anything in **/wynton** in your default LD_LIBRARY_PATH + + + + +## Storage {.small-bullets} + +- **Wynton storage is not backed up** +- /wynton/**[group_name]**/**[user]** + - User home directory - limited to 500 GiB +- /wynton/**[group_name]** + - User group directory - disk quota varies by group +- [More information on disk quotas](https://wynton.ucsf.edu/hpc/howto/storage-size.html#file-sizes-and-disk-quotas) + +To check your group disk quota run: + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo 'beegfs-ctl --getquota --storagepoolid=12 --gid "$(id --group)"' +``` + + + +## Scratch - Temporary Storage +- Local **/scratch** - 0.1-1.8 TiB/node storage unique to each compute node + - Can only be accessed from the specific compute node +- **/wynton/scratch** and **/wynton/protected/scratch** (for PHI users) + - 703 TiB storage accessible from everywhere +- No quotas + +

+ +**Files not used for 2 weeks are automatically deleted** + + + +## Gladstone HIVE +- Gladstone's HIVE storage server is mounted directly to Wynton under **/gladstone** + - Only certain HIVE folders are accessible directly on Wynton + - Files under **/gladstone** are backed up +- Naming: **/gladstone/[lab]/[share]** +- For more information visit the [IT knowledge base page](https://help.gladstone.org/support/solutions/articles/14000033963) + + + +# Data Transfer + +## Secure Copy - scp + +- Local file to Wynton +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "{local}$ scp /path/to/local_file.tsv alice@dt1.wynton.ucsf.edu:/destination/path" +``` + +- Copy a directory to a folder on Wynton +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "{local}$ scp -r local_folder/ alice@dt1.wynton.ucsf.edu:/destination/path" +``` + +- Copy a single file to Wynton from your local machine +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo "{local}$ scp alice@dt1.wynton.ucsf.edu:/path/to/local_file.tsv /destination/path" +``` + + +## GUI SFTP Clients {.small-bullets} + +- These let you transfer files to and from Wynton using a GUI +- [2 factor authentication](https://wynton.ucsf.edu/hpc/get-started/duo-signup.html) may be required +- [Cyberduck](https://cyberduck.io/) + - Navigate to Preferences -> Transfers -> General + - change the Transfer Files setting "Use browser connection" instead of "Open Multiple connections" + +- [FileZilla](https://filezilla-project.org/) + - In the General tab, select ‘SFTP’ as the Protocol instead of ‘FTP’ + - For Logon Type, select ‘Interactive’ instead of ‘Ask for Password’ + - Under the Transfer Settings tab, you might need to click the ‘Limit number of simultaneous connections’ and make sure the ‘Maximum number of connections’ is set to 1 + + +## Globus + +- [Globus](https://wynton.ucsf.edu/hpc/transfers/globus.html) is a non-profit service for moving, syncing, and sharing large amounts of data asynchronously in the background +- Wynton Accounts are not required to transfer data with Globus +- Useful for transferring data between institutions + +## Rclone + +- Rclone is a command-line program to manage files on remote storage +- Can be used to transfer data from Wynton directly to [DropBox](https://rclone.org/dropbox/) or other storage systems (AWS, Azure, Google Drive etc.) + - Do this from a data transfer node using screen/tmux +- Do not use rclone for transfers to Box, follow the [Wynton to UCSF Box](https://wynton.ucsf.edu/hpc/transfers/ucsf-box.html) instructions + + +# Installing Software + +## Basics + +- Ensure the software you are trying to install is compatible with Rocky linux (use a container if not) +- Check if the tool is already available in a [module](https://wynton.ucsf.edu/hpc/software/software-modules.html) +- Always install software in a development node +- Download a precompiled binary or [install from source](https://wynton.ucsf.edu/hpc/howto/install-from-source.html) + +## Install Samtools from Source {.small-list} + +1. Download and extract source code + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ mkdir -p "/scratch/$USER" +[alice@dev1 ~]$ cd "/scratch/$USER" +[alice@dev1 alice]$ wget https://github.com/samtools/samtools/releases/download/1.19.2/samtools-1.19.2.tar.bz2 +[alice@dev1 alice]$ tar -x -f samtools-1.19.2.tar.bz2' +``` + +2. Create install location and configure + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ mkdir -p $HOME/software/samtools-1.14' +echo '[alice@dev1 ~]$ ./configure --prefix=$HOME/software/samtools-1.14' +``` +3. Build and install + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ make' +echo '[alice@dev1 ~]$ make install' +``` + +## Install Nextflow for Part 2 + +- In part 2, we will run the nextflow rna-seq pipeline +- Run the following to install nextflow: + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ cd ~/software' +echo '[alice@dev1 ~]$ curl -s "https://get.sdkman.io" | bash' +echo '[alice@dev1 ~]$ exit' +echo '[alice@log1 ~]$ ssh dev1' +echo '[alice@dev1 ~]$ sdk install java 17.0.6-tem' +echo '[alice@dev1 ~]$ wget -qO- https://get.nextflow.io | bash' +``` + + +- Let us know if you run into any errors + + +# Containers + +## Definitions {.small-bullets} + +- **Virtualization:** When software mimics the functions of physical hardware to run virtual machines + - Work around to use OS specific or legacy software that might be hard to install + - Improves reproducibility +- **Containers:** Implements virtualization using an *image* as its base +- **Images:** An ordered collection of root filesystem changes and the corresponding execution parameters for use within a container runtime + + +## Apptainer {.small-bullets} + +- Wynton supports [Apptainer](https://wynton.ucsf.edu/hpc/software/apptainer.html) (formerly singularity) containers +- [Docker](https://docs.docker.com/) is a commonly used container creation software, these can be turned into apptainer containers easily + +- apptainer run + - Run predefined script within container +- apptainer exec + - Execute any command within container +- apptainer shell + - Run bash shell within container + + +## Example Container - Hello World + +- Run this command to convert the public Docker image to a apptainer image file + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ apptainer pull docker://natalie23gill/hello-world:1.0' +``` + +- Execute the "hi" command in the container + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif hi' +``` + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo ' __ __ ____ _ __ __ __ __ + / / / /__ / / /___ | | / /___ _____/ /___/ / / / + / /_/ / _ \/ / / __ \ | | /| / / __ \/ ___/ / __ / / / + / __ / __/ / / /_/ / | |/ |/ / /_/ / / / / /_/ / /_/ +/_/ /_/\___/_/_/\____/ |__/|__/\____/_/ /_/\__,_/ (_) ' +``` + + +## Example Container - Hello World + +- This container has **figlet** installed which creates ASCII art from text input +- Try running this command to create your own using *exec* + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif figlet your_text' +``` + +## Docker {.small-bullets} + +- Docker uses Dockerfiles to specify image creation +- Preferred by the Gladstone Bioinformatics Core to create new images +- In part 2, we will go over how to build custom container images from DockerFiles + - If you want to follow along, [install the docker engine](https://docs.docker.com/engine/install/) following the instructions for your OS +- To see the Dockerfile used to create the hello-world image, run: + +```{r, engine='bash', eval=TRUE, results='markup',comment=NA, highlight=TRUE, echo=FALSE} +echo '[alice@dev1 ~]$ apptainer exec hello-world_1.0.sif cat /Dockerfile' +``` + + +# End of Part 1 + +## Thank You! + +- Please take some time to fill out the workshop survey if you are not attending part 2: +[https://www.surveymonkey.com/r/F75J6VZ](https://www.surveymonkey.com/r/F75J6VZ) + + +## Upcoming Data Science Training Program Workshops + + +[Introduction to Linear Mixed Effects Models](https://gladstone.org/events/introduction-linear-mixed-effects-models) +April 25-April 26, 2024 1-3pm PDT + +[Single Cell RNA-Seq Data Analysis](https://gladstone.org/events/single-cell-rna-seq-data-analysis) +April 29-April 30, 2024 9am-4pm PDT + +[Single Cell ATAC-Seq Data Analysis Part 1](https://gladstone.org/events/single-cell-atac-seq-data-analysis-part-1-1) +May 6-May 7, 2024 1-4pm PDT + + + +[Complete Schedule](https://gladstone.org/events) +Click "Data Science Training Program" + + diff --git a/working-on-wynton-hpc/renv.lock b/working-on-wynton-hpc/renv.lock new file mode 100644 index 0000000..a000798 --- /dev/null +++ b/working-on-wynton-hpc/renv.lock @@ -0,0 +1,1551 @@ +{ + "R": { + "Version": "4.3.2", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://packagemanager.posit.co/cran/latest" + } + ] + }, + "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "164809cd72e1d5160b4cb3aa57f510fe" + }, + "MASS": { + "Package": "MASS", + "Version": "7.3-60.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "b765b28387acc8ec9e9c1530713cb19c" + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.6-5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "lattice", + "methods", + "stats", + "utils" + ], + "Hash": "8c7115cd3a0e048bda2a7cd110549f7a" + }, + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "470851b6d5d0ac559e9d01bb352b4021" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "45f0398006e83a5b10b72a90663d8d8c" + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "sys" + ], + "Hash": "cad6cf7f1d5f6e906700b9d3e718c796" + }, + "backports": { + "Package": "backports", + "Version": "1.4.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c39fbec8a30d23e721980b8afb31984c" + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "543776ae6848fde2f48ff3816d0628bc" + }, + "bit": { + "Package": "bit", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d242abec29412ce988848d0294b208fd" + }, + "bit64": { + "Package": "bit64", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit", + "methods", + "stats", + "utils" + ], + "Hash": "9fe98599ca456d6552421db0d6772d8f" + }, + "blob": { + "Package": "blob", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "rlang", + "vctrs" + ], + "Hash": "40415719b5a479b87949f3aa0aee737c" + }, + "broom": { + "Package": "broom", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "backports", + "dplyr", + "ellipsis", + "generics", + "glue", + "lifecycle", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyr" + ], + "Hash": "fd25391c3c4f6ecf0fa95f1e6d15378c" + }, + "bslib": { + "Package": "bslib", + "Version": "0.6.1", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "base64enc", + "cachem", + "grDevices", + "htmltools", + "jquerylib", + "jsonlite", + "lifecycle", + "memoise", + "mime", + "rlang", + "sass" + ], + "Hash": "c0d8599494bc7fb408cd206bbdd9cab0" + }, + "cachem": { + "Package": "cachem", + "Version": "1.0.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "fastmap", + "rlang" + ], + "Hash": "c35768291560ce302c0a6589f92e837d" + }, + "callr": { + "Package": "callr", + "Version": "3.7.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "processx", + "utils" + ], + "Hash": "9f0e4fae4963ba775a5e5c520838c87b" + }, + "cellranger": { + "Package": "cellranger", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rematch", + "tibble" + ], + "Hash": "f61dbaec772ccd2e17705c1e872e9e7c" + }, + "cli": { + "Package": "cli", + "Version": "3.6.2", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "utils" + ], + "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + }, + "clipr": { + "Package": "clipr", + "Version": "0.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + }, + "colorspace": { + "Package": "colorspace", + "Version": "2.1-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats" + ], + "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + }, + "conflicted": { + "Package": "conflicted", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "memoise", + "rlang" + ], + "Hash": "bb097fccb22d156624fd07cd2894ddb6" + }, + "countdown": { + "Package": "countdown", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "htmltools", + "prismatic", + "utils", + "whisker" + ], + "Hash": "b44ad5a5e287637c3b8ca0e9bb64bb18" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.4.7", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R" + ], + "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "e8a1e41acf02548751f45c718d55aa6a" + }, + "curl": { + "Package": "curl", + "Version": "5.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "411ca2c03b1ce5f548345d2fc2685f7a" + }, + "data.table": { + "Package": "data.table", + "Version": "1.15.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "536dfe4ac4093b5d115caed7a1a7223b" + }, + "dbplyr": { + "Package": "dbplyr", + "Version": "2.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "R6", + "blob", + "cli", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "purrr", + "rlang", + "tibble", + "tidyr", + "tidyselect", + "utils", + "vctrs", + "withr" + ], + "Hash": "39b2e002522bfd258039ee4e889e0fd1" + }, + "digest": { + "Package": "digest", + "Version": "0.6.35", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "698ece7ba5a4fa4559e3d537e7ec3d31" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.1.4", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "R6", + "cli", + "generics", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "rlang", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + }, + "dtplyr": { + "Package": "dtplyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "data.table", + "dplyr", + "glue", + "lifecycle", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ], + "Hash": "54ed3ea01b11e81a86544faaecfef8e2" + }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rlang" + ], + "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" + }, + "evaluate": { + "Package": "evaluate", + "Version": "0.23", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "daf4a1246be12c1fa8c7705a0935c1a0" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "grDevices", + "utils" + ], + "Hash": "962174cf2aeb5b9eea581522286a911f" + }, + "farver": { + "Package": "farver", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8106d78941f34855c440ddb946b8f7a5" + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f7736a18de97dea803bde0a2daaafb27" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "htmltools", + "rlang" + ], + "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + }, + "forcats": { + "Package": "forcats", + "Version": "1.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "tibble" + ], + "Hash": "1a0a9a3d5083d0d573c4214576f1e690" + }, + "fs": { + "Package": "fs", + "Version": "1.6.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "47b5f30c720c23999b913a1a635cf0bb" + }, + "gargle": { + "Package": "gargle", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "fs", + "glue", + "httr", + "jsonlite", + "lifecycle", + "openssl", + "rappdirs", + "rlang", + "stats", + "utils", + "withr" + ], + "Hash": "fc0b272e5847c58cd5da9b20eedbd026" + }, + "generics": { + "Package": "generics", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "3.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "cli", + "glue", + "grDevices", + "grid", + "gtable", + "isoband", + "lifecycle", + "mgcv", + "rlang", + "scales", + "stats", + "tibble", + "vctrs", + "withr" + ], + "Hash": "52ef83f93f74833007f193b2d4c159a2" + }, + "glue": { + "Package": "glue", + "Version": "1.7.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "e0b3a53876554bd45879e596cdb10a52" + }, + "googledrive": { + "Package": "googledrive", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "gargle", + "glue", + "httr", + "jsonlite", + "lifecycle", + "magrittr", + "pillar", + "purrr", + "rlang", + "tibble", + "utils", + "uuid", + "vctrs", + "withr" + ], + "Hash": "e99641edef03e2a5e87f0a0b1fcc97f4" + }, + "googlesheets4": { + "Package": "googlesheets4", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cellranger", + "cli", + "curl", + "gargle", + "glue", + "googledrive", + "httr", + "ids", + "lifecycle", + "magrittr", + "methods", + "purrr", + "rematch2", + "rlang", + "tibble", + "utils", + "vctrs", + "withr" + ], + "Hash": "d6db1667059d027da730decdc214b959" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "grid", + "lifecycle", + "rlang" + ], + "Hash": "b29cf3031f49b04ab9c852c912547eef" + }, + "haven": { + "Package": "haven", + "Version": "2.5.4", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "cpp11", + "forcats", + "hms", + "lifecycle", + "methods", + "readr", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ], + "Hash": "9171f898db9d9c4c1b2c745adc2c1ef1" + }, + "highr": { + "Package": "highr", + "Version": "0.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "xfun" + ], + "Hash": "06230136b2d2b9ba5805e1963fa6e890" + }, + "hms": { + "Package": "hms", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "lifecycle", + "methods", + "pkgconfig", + "rlang", + "vctrs" + ], + "Hash": "b59377caa7ed00fa41808342002138f9" + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "base64enc", + "digest", + "ellipsis", + "fastmap", + "grDevices", + "rlang", + "utils" + ], + "Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f" + }, + "httr": { + "Package": "httr", + "Version": "1.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "curl", + "jsonlite", + "mime", + "openssl" + ], + "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" + }, + "ids": { + "Package": "ids", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "openssl", + "uuid" + ], + "Hash": "99df65cfef20e525ed38c3d2577f7190" + }, + "isoband": { + "Package": "isoband", + "Version": "0.2.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grid", + "utils" + ], + "Hash": "0080607b4a1a7b28979aecef976d8bc2" + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "htmltools" + ], + "Hash": "5aab57a3bd297eee1c1d862735972182" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "1.8.8", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "methods" + ], + "Hash": "e1b9c55281c5adc4dd113652d9e26768" + }, + "knitr": { + "Package": "knitr", + "Version": "1.45", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "evaluate", + "highr", + "methods", + "tools", + "xfun", + "yaml" + ], + "Hash": "1ec462871063897135c1bcbe0fc8f07d" + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "graphics", + "stats" + ], + "Hash": "b64ec208ac5bc1852b285f665d6368b3" + }, + "lattice": { + "Package": "lattice", + "Version": "0.22-6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "stats", + "utils" + ], + "Hash": "cc5ac1ba4c238c7ca9fa6a87ca11a7e2" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "glue", + "rlang" + ], + "Hash": "b8552d117e1b808b09a832f589b79035" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "generics", + "methods", + "timechange" + ], + "Hash": "680ad542fbcf801442c83a6ac5a2126c" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "7ce2733a9826b3aeb1775d56fd305472" + }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cachem", + "rlang" + ], + "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + }, + "mgcv": { + "Package": "mgcv", + "Version": "1.9-1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "graphics", + "methods", + "nlme", + "splines", + "stats", + "utils" + ], + "Hash": "110ee9d83b496279960e162ac97764ce" + }, + "mime": { + "Package": "mime", + "Version": "0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + }, + "modelr": { + "Package": "modelr", + "Version": "0.1.11", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "broom", + "magrittr", + "purrr", + "rlang", + "tibble", + "tidyr", + "tidyselect", + "vctrs" + ], + "Hash": "4f50122dc256b1b6996a4703fecea821" + }, + "munsell": { + "Package": "munsell", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "colorspace", + "methods" + ], + "Hash": "6dfe8bf774944bd5595785e3229d8771" + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-164", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "a623a2239e642806158bc4dc3f51565d" + }, + "openssl": { + "Package": "openssl", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "askpass" + ], + "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5" + }, + "pillar": { + "Package": "pillar", + "Version": "1.9.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "fansi", + "glue", + "lifecycle", + "rlang", + "utf8", + "utils", + "vctrs" + ], + "Hash": "15da5a8412f317beeee6175fbc76f4bb" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "01f28d4278f15c76cddbea05899c5d6f" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, + "prismatic": { + "Package": "prismatic", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "farver", + "grDevices", + "graphics" + ], + "Hash": "faa2193fdec94a45b4390aefc1280a62" + }, + "processx": { + "Package": "processx", + "Version": "3.8.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "ps", + "utils" + ], + "Hash": "0c90a7d71988856bad2a2a45dd871bb9" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "R6", + "crayon", + "hms", + "prettyunits" + ], + "Hash": "f4625e061cb2865f111b47ff163a5ca6" + }, + "ps": { + "Package": "ps", + "Version": "1.7.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "dd2b9319ee0656c8acf45c7f40c59de7" + }, + "purrr": { + "Package": "purrr", + "Version": "1.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "rlang", + "vctrs" + ], + "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + }, + "ragg": { + "Package": "ragg", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "systemfonts", + "textshaping" + ], + "Hash": "082e1a198e3329d571f4448ef0ede4bc" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + }, + "readr": { + "Package": "readr", + "Version": "2.1.5", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "R6", + "cli", + "clipr", + "cpp11", + "crayon", + "hms", + "lifecycle", + "methods", + "rlang", + "tibble", + "tzdb", + "utils", + "vroom" + ], + "Hash": "9de96463d2117f6ac49980577939dfb3" + }, + "readxl": { + "Package": "readxl", + "Version": "1.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cellranger", + "cpp11", + "progress", + "tibble", + "utils" + ], + "Hash": "8cf9c239b96df1bbb133b74aef77ad0a" + }, + "rematch": { + "Package": "rematch", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cbff1b666c6fa6d21202f07e2318d4f1" + }, + "rematch2": { + "Package": "rematch2", + "Version": "2.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tibble" + ], + "Hash": "76c9e04c712a05848ae7a23d2f170a40" + }, + "renv": { + "Package": "renv", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "32c3f93e8360f667ca5863272ec8ba6a" + }, + "reprex": { + "Package": "reprex", + "Version": "2.1.0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "callr", + "cli", + "clipr", + "fs", + "glue", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "rstudioapi", + "utils", + "withr" + ], + "Hash": "1425f91b4d5d9a8f25352c44a3d914ed" + }, + "revealjs": { + "Package": "revealjs", + "Version": "0.9", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rmarkdown" + ], + "Hash": "08e30caa337e6d335d83df1a05d5b9f3" + }, + "rlang": { + "Package": "rlang", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.26", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bslib", + "evaluate", + "fontawesome", + "htmltools", + "jquerylib", + "jsonlite", + "knitr", + "methods", + "tinytex", + "tools", + "utils", + "xfun", + "yaml" + ], + "Hash": "9b148e7f95d33aac01f31282d49e4f44" + }, + "rstudioapi": { + "Package": "rstudioapi", + "Version": "0.15.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "5564500e25cffad9e22244ced1379887" + }, + "rvest": { + "Package": "rvest", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "httr", + "lifecycle", + "magrittr", + "rlang", + "selectr", + "tibble", + "xml2" + ], + "Hash": "0bcf0c6f274e90ea314b812a6d19a519" + }, + "sass": { + "Package": "sass", + "Version": "0.4.9", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R6", + "fs", + "htmltools", + "rappdirs", + "rlang" + ], + "Hash": "d53dbfddf695303ea4ad66f86e99b95d" + }, + "scales": { + "Package": "scales", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "R6", + "RColorBrewer", + "cli", + "farver", + "glue", + "labeling", + "lifecycle", + "munsell", + "rlang", + "viridisLite" + ], + "Hash": "c19df082ba346b0ffa6f833e92de34d1" + }, + "selectr": { + "Package": "selectr", + "Version": "0.4-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "methods", + "stringr" + ], + "Hash": "3838071b66e0c566d55cc26bd6e27bf4" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.3", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "stats", + "tools", + "utils" + ], + "Hash": "058aebddea264f4c99401515182e656a" + }, + "stringr": { + "Package": "stringr", + "Version": "1.5.1", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "stringi", + "vctrs" + ], + "Hash": "960e2ae9e09656611e0b8214ad543207" + }, + "sys": { + "Package": "sys", + "Version": "3.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "3a1be13d68d47a8cd0bfd74739ca1555" + }, + "systemfonts": { + "Package": "systemfonts", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "6d538cff441f0f1f36db2209ac7495ac" + }, + "textshaping": { + "Package": "textshaping", + "Version": "0.3.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11", + "systemfonts" + ], + "Hash": "997aac9ad649e0ef3b97f96cddd5622b" + }, + "tibble": { + "Package": "tibble", + "Version": "3.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "fansi", + "lifecycle", + "magrittr", + "methods", + "pillar", + "pkgconfig", + "rlang", + "utils", + "vctrs" + ], + "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang", + "vctrs", + "withr" + ], + "Hash": "829f27b9c4919c16b593794a6344d6c0" + }, + "tidyverse": { + "Package": "tidyverse", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "broom", + "cli", + "conflicted", + "dbplyr", + "dplyr", + "dtplyr", + "forcats", + "ggplot2", + "googledrive", + "googlesheets4", + "haven", + "hms", + "httr", + "jsonlite", + "lubridate", + "magrittr", + "modelr", + "pillar", + "purrr", + "ragg", + "readr", + "readxl", + "reprex", + "rlang", + "rstudioapi", + "rvest", + "stringr", + "tibble", + "tidyr", + "xml2" + ], + "Hash": "c328568cd14ea89a83bd4ca7f54ae07e" + }, + "timechange": { + "Package": "timechange", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.50", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "xfun" + ], + "Hash": "be7a76845222ad20adb761f462eed3ea" + }, + "tzdb": { + "Package": "tzdb", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "f561504ec2897f4d46f0c7657e488ae1" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "62b65c52671e6665f803ff02954446e9" + }, + "uuid": { + "Package": "uuid", + "Version": "1.2-0", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R" + ], + "Hash": "303c19bfd970bece872f93a824e323d9" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.6.5", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang" + ], + "Hash": "c03fa420630029418f7e6da3667aac4a" + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" + }, + "vroom": { + "Package": "vroom", + "Version": "1.6.5", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "bit64", + "cli", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "progress", + "rlang", + "stats", + "tibble", + "tidyselect", + "tzdb", + "vctrs", + "withr" + ], + "Hash": "390f9315bc0025be03012054103d227c" + }, + "withr": { + "Package": "withr", + "Version": "3.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics" + ], + "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + }, + "xfun": { + "Package": "xfun", + "Version": "0.42", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "stats", + "tools" + ], + "Hash": "fd1349170df31f7a10bd98b0189e85af" + }, + "xml2": { + "Package": "xml2", + "Version": "1.3.6", + "Source": "Repository", + "Repository": "RSPM", + "Requirements": [ + "R", + "cli", + "methods", + "rlang" + ], + "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.8", + "Source": "Repository", + "Repository": "RSPM", + "Hash": "29240487a071f535f5e5d5a323b7afbd" + } + } +} diff --git a/working-on-wynton-hpc/renv/.gitignore b/working-on-wynton-hpc/renv/.gitignore new file mode 100644 index 0000000..0ec0cbb --- /dev/null +++ b/working-on-wynton-hpc/renv/.gitignore @@ -0,0 +1,7 @@ +library/ +local/ +cellar/ +lock/ +python/ +sandbox/ +staging/ diff --git a/working-on-wynton-hpc/renv/activate.R b/working-on-wynton-hpc/renv/activate.R new file mode 100644 index 0000000..9b2e7f1 --- /dev/null +++ b/working-on-wynton-hpc/renv/activate.R @@ -0,0 +1,1201 @@ + +local({ + + # the requested version of renv + version <- "1.0.5" + attr(version, "sha") <- NULL + + # the project directory + project <- getwd() + + # use start-up diagnostics if enabled + diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") + if (diagnostics) { + start <- Sys.time() + profile <- tempfile("renv-startup-", fileext = ".Rprof") + utils::Rprof(profile) + on.exit({ + utils::Rprof(NULL) + elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) + writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) + writeLines(sprintf("- Profile: %s", profile)) + print(utils::summaryRprof(profile)) + }, add = TRUE) + } + + # figure out whether the autoloader is enabled + enabled <- local({ + + # first, check config option + override <- getOption("renv.config.autoloader.enabled") + if (!is.null(override)) + return(override) + + # if we're being run in a context where R_LIBS is already set, + # don't load -- presumably we're being run as a sub-process and + # the parent process has already set up library paths for us + rcmd <- Sys.getenv("R_CMD", unset = NA) + rlibs <- Sys.getenv("R_LIBS", unset = NA) + if (!is.na(rlibs) && !is.na(rcmd)) + return(FALSE) + + # next, check environment variables + # TODO: prefer using the configuration one in the future + envvars <- c( + "RENV_CONFIG_AUTOLOADER_ENABLED", + "RENV_AUTOLOADER_ENABLED", + "RENV_ACTIVATE_PROJECT" + ) + + for (envvar in envvars) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(tolower(envval) %in% c("true", "t", "1")) + } + + # enable by default + TRUE + + }) + + # bail if we're not enabled + if (!enabled) { + + # if we're not enabled, we might still need to manually load + # the user profile here + profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") + if (file.exists(profile)) { + cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") + if (tolower(cfg) %in% c("true", "t", "1")) + sys.source(profile, envir = globalenv()) + } + + return(FALSE) + + } + + # avoid recursion + if (identical(getOption("renv.autoloader.running"), TRUE)) { + warning("ignoring recursive attempt to run renv autoloader") + return(invisible(TRUE)) + } + + # signal that we're loading renv during R startup + options(renv.autoloader.running = TRUE) + on.exit(options(renv.autoloader.running = NULL), 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) + + # unload renv if it's already been loaded + if ("renv" %in% loadedNamespaces()) + unloadNamespace("renv") + + # load bootstrap tools + `%||%` <- function(x, y) { + if (is.null(x)) y else x + } + + catf <- function(fmt, ..., appendLF = TRUE) { + + quiet <- getOption("renv.bootstrap.quiet", default = FALSE) + if (quiet) + return(invisible()) + + msg <- sprintf(fmt, ...) + cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") + + invisible(msg) + + } + + header <- function(label, + ..., + prefix = "#", + suffix = "-", + n = min(getOption("width"), 78)) + { + label <- sprintf(label, ...) + n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) + if (n <= 0) + return(paste(prefix, label)) + + tail <- paste(rep.int(suffix, n), collapse = "") + paste0(prefix, " ", label, " ", tail) + + } + + startswith <- function(string, prefix) { + substring(string, 1, nchar(prefix)) == prefix + } + + bootstrap <- function(version, library) { + + friendly <- renv_bootstrap_version_friendly(version) + section <- header(sprintf("Bootstrapping renv %s", friendly)) + catf(section) + + # attempt to download renv + catf("- Downloading renv ... ", appendLF = FALSE) + withCallingHandlers( + tarball <- renv_bootstrap_download(version), + error = function(err) { + catf("FAILED") + stop("failed to download:\n", conditionMessage(err)) + } + ) + catf("OK") + on.exit(unlink(tarball), add = TRUE) + + # now attempt to install + catf("- Installing renv ... ", appendLF = FALSE) + withCallingHandlers( + status <- renv_bootstrap_install(version, tarball, library), + error = function(err) { + catf("FAILED") + stop("failed to install:\n", conditionMessage(err)) + } + ) + catf("OK") + + # add empty line to break up bootstrapping from normal output + catf("") + + return(invisible()) + } + + renv_bootstrap_tests_running <- function() { + getOption("renv.tests.running", default = FALSE) + } + + renv_bootstrap_repos <- function() { + + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + + # check for repos override + repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) + if (!is.na(repos)) { + + # check for RSPM; if set, use a fallback repository for renv + rspm <- Sys.getenv("RSPM", unset = NA) + if (identical(rspm, repos)) + repos <- c(RSPM = rspm, CRAN = cran) + + return(repos) + + } + + # check for lockfile repositories + repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) + if (!inherits(repos, "error") && length(repos)) + return(repos) + + # retrieve current repos + repos <- getOption("repos") + + # ensure @CRAN@ entries are resolved + repos[repos == "@CRAN@"] <- cran + + # add in renv.bootstrap.repos if set + default <- c(FALLBACK = "https://cloud.r-project.org") + extra <- getOption("renv.bootstrap.repos", default = default) + repos <- c(repos, extra) + + # remove duplicates that might've snuck in + dupes <- duplicated(repos) | duplicated(names(repos)) + repos[!dupes] + + } + + renv_bootstrap_repos_lockfile <- function() { + + lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") + if (!file.exists(lockpath)) + return(NULL) + + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) + if (inherits(lockfile, "error")) { + warning(lockfile) + return(NULL) + } + + repos <- lockfile$R$Repositories + if (length(repos) == 0) + return(NULL) + + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) + vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) + names(vals) <- keys + + return(vals) + + } + + renv_bootstrap_download <- function(version) { + + sha <- attr(version, "sha", exact = TRUE) + + methods <- if (!is.null(sha)) { + + # attempting to bootstrap a development version of renv + c( + function() renv_bootstrap_download_tarball(sha), + function() renv_bootstrap_download_github(sha) + ) + + } else { + + # attempting to bootstrap a release version of renv + c( + function() renv_bootstrap_download_tarball(version), + function() renv_bootstrap_download_cran_latest(version), + function() renv_bootstrap_download_cran_archive(version) + ) + + } + + for (method in methods) { + path <- tryCatch(method(), error = identity) + if (is.character(path) && file.exists(path)) + return(path) + } + + stop("All download methods failed") + + } + + renv_bootstrap_download_impl <- function(url, destfile) { + + mode <- "wb" + + # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 + fixup <- + Sys.info()[["sysname"]] == "Windows" && + substring(url, 1L, 5L) == "file:" + + if (fixup) + mode <- "w+b" + + args <- list( + url = url, + destfile = destfile, + mode = mode, + quiet = TRUE + ) + + if ("headers" %in% names(formals(utils::download.file))) + args$headers <- renv_bootstrap_download_custom_headers(url) + + do.call(utils::download.file, args) + + } + + renv_bootstrap_download_custom_headers <- function(url) { + + headers <- getOption("renv.download.headers") + if (is.null(headers)) + return(character()) + + if (!is.function(headers)) + stopf("'renv.download.headers' is not a function") + + headers <- headers(url) + if (length(headers) == 0L) + return(character()) + + if (is.list(headers)) + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) + + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) + stop("invocation of 'renv.download.headers' did not return a named character vector") + + headers + + } + + renv_bootstrap_download_cran_latest <- function(version) { + + spec <- renv_bootstrap_download_cran_latest_find(version) + type <- spec$type + repos <- spec$repos + + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) + ".tar.gz" + else if (Sys.info()[["sysname"]] == "Windows") + ".zip" + else + ".tgz" + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (inherits(status, "condition")) + return(FALSE) + + # report success and return + destfile + + } + + renv_bootstrap_download_cran_latest_find <- function(version) { + + # check whether binaries are supported on this system + binary <- + getOption("renv.bootstrap.binary", default = TRUE) && + !identical(.Platform$pkgType, "source") && + !identical(getOption("pkgType"), "source") && + Sys.info()[["sysname"]] %in% c("Darwin", "Windows") + + types <- c(if (binary) "binary", "source") + + # iterate over types + repositories + for (type in types) { + for (repos in renv_bootstrap_repos()) { + + # retrieve package database + db <- tryCatch( + as.data.frame( + utils::available.packages(type = type, repos = repos), + stringsAsFactors = FALSE + ), + error = identity + ) + + if (inherits(db, "error")) + next + + # check for compatible entry + entry <- db[db$Package %in% "renv" & db$Version %in% version, ] + if (nrow(entry) == 0) + next + + # found it; return spec to caller + spec <- list(entry = entry, type = type, repos = repos) + return(spec) + + } + } + + # if we got here, we failed to find renv + fmt <- "renv %s is not available from your declared package repositories" + stop(sprintf(fmt, version)) + + } + + renv_bootstrap_download_cran_archive <- function(version) { + + name <- sprintf("renv_%s.tar.gz", version) + repos <- renv_bootstrap_repos() + urls <- file.path(repos, "src/contrib/Archive/renv", name) + destfile <- file.path(tempdir(), name) + + for (url in urls) { + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (identical(status, 0L)) + return(destfile) + + } + + return(FALSE) + + } + + renv_bootstrap_download_tarball <- function(version) { + + # if the user has provided the path to a tarball via + # an environment variable, then use it + tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) + if (is.na(tarball)) + return() + + # allow directories + if (dir.exists(tarball)) { + name <- sprintf("renv_%s.tar.gz", version) + tarball <- file.path(tarball, name) + } + + # bail if it doesn't exist + if (!file.exists(tarball)) { + + # let the user know we weren't able to honour their request + fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail + return() + + } + + catf("- Using local tarball '%s'.", tarball) + tarball + + } + + renv_bootstrap_download_github <- function(version) { + + enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") + if (!identical(enabled, "TRUE")) + return(FALSE) + + # 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) + } + + url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) + name <- sprintf("renv_%s.tar.gz", version) + destfile <- file.path(tempdir(), name) + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (!identical(status, 0L)) + return(FALSE) + + renv_bootstrap_download_augment(destfile) + + return(destfile) + + } + + # Add Sha to DESCRIPTION. This is stop gap until #890, after which we + # can use renv::install() to fully capture metadata. + renv_bootstrap_download_augment <- function(destfile) { + sha <- renv_bootstrap_git_extract_sha1_tar(destfile) + if (is.null(sha)) { + return() + } + + # Untar + tempdir <- tempfile("renv-github-") + on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) + untar(destfile, exdir = tempdir) + pkgdir <- dir(tempdir, full.names = TRUE)[[1]] + + # Modify description + desc_path <- file.path(pkgdir, "DESCRIPTION") + desc_lines <- readLines(desc_path) + remotes_fields <- c( + "RemoteType: github", + "RemoteHost: api.github.com", + "RemoteRepo: renv", + "RemoteUsername: rstudio", + "RemotePkgRef: rstudio/renv", + paste("RemoteRef: ", sha), + paste("RemoteSha: ", sha) + ) + writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) + + # Re-tar + local({ + old <- setwd(tempdir) + on.exit(setwd(old), add = TRUE) + + tar(destfile, compression = "gzip") + }) + invisible() + } + + # Extract the commit hash from a git archive. Git archives include the SHA1 + # hash as the comment field of the tarball pax extended header + # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) + # For GitHub archives this should be the first header after the default one + # (512 byte) header. + renv_bootstrap_git_extract_sha1_tar <- function(bundle) { + + # open the bundle for reading + # We use gzcon for everything because (from ?gzcon) + # > Reading from a connection which does not supply a 'gzip' magic + # > header is equivalent to reading from the original connection + conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) + on.exit(close(conn)) + + # The default pax header is 512 bytes long and the first pax extended header + # with the comment should be 51 bytes long + # `52 comment=` (11 chars) + 40 byte SHA1 hash + len <- 0x200 + 0x33 + res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) + + if (grepl("^52 comment=", res)) { + sub("52 comment=", "", res) + } else { + NULL + } + } + + renv_bootstrap_install <- function(version, tarball, library) { + + # attempt to install it into project library + dir.create(library, showWarnings = FALSE, recursive = TRUE) + output <- renv_bootstrap_install_impl(library, tarball) + + # check for successful install + status <- attr(output, "status") + if (is.null(status) || identical(status, 0L)) + return(status) + + # an error occurred; report it + header <- "installation of renv failed" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- paste(c(header, lines, output), collapse = "\n") + stop(text) + + } + + renv_bootstrap_install_impl <- function(library, tarball) { + + # 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", "--no-multiarch", + "-l", shQuote(path.expand(library)), + shQuote(path.expand(tarball)) + ) + + system2(R, args, stdout = TRUE, stderr = TRUE) + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- paste(R.version$major, R.version$minor, sep = ".") + prefix <- paste("R", numeric_version(version)[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") + + # build list of path components + components <- c(prefix, R.version$platform) + + # include prefix if provided by user + prefix <- renv_bootstrap_platform_prefix_impl() + if (!is.na(prefix) && nzchar(prefix)) + components <- c(prefix, components) + + # build prefix + paste(components, collapse = "/") + + } + + renv_bootstrap_platform_prefix_impl <- function() { + + # if an explicit prefix has been supplied, use it + prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) + if (!is.na(prefix)) + return(prefix) + + # if the user has requested an automatic prefix, generate it + auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (auto %in% c("TRUE", "True", "true", "1")) + return(renv_bootstrap_platform_prefix_auto()) + + # empty string on failure + "" + + } + + renv_bootstrap_platform_prefix_auto <- function() { + + prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) + if (inherits(prefix, "error") || prefix %in% "unknown") { + + msg <- paste( + "failed to infer current operating system", + "please file a bug report at https://github.com/rstudio/renv/issues", + sep = "; " + ) + + warning(msg) + + } + + prefix + + } + + renv_bootstrap_platform_os <- function() { + + sysinfo <- Sys.info() + sysname <- sysinfo[["sysname"]] + + # handle Windows + macOS up front + if (sysname == "Windows") + return("windows") + else if (sysname == "Darwin") + return("macos") + + # check for os-release files + for (file in c("/etc/os-release", "/usr/lib/os-release")) + if (file.exists(file)) + return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) + + # check for redhat-release files + if (file.exists("/etc/redhat-release")) + return(renv_bootstrap_platform_os_via_redhat_release()) + + "unknown" + + } + + renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { + + # read /etc/os-release + release <- utils::read.table( + file = file, + sep = "=", + quote = c("\"", "'"), + col.names = c("Key", "Value"), + comment.char = "#", + stringsAsFactors = FALSE + ) + + vars <- as.list(release$Value) + names(vars) <- release$Key + + # get os name + os <- tolower(sysinfo[["sysname"]]) + + # read id + id <- "unknown" + for (field in c("ID", "ID_LIKE")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + id <- vars[[field]] + break + } + } + + # read version + version <- "unknown" + for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + version <- vars[[field]] + break + } + } + + # join together + paste(c(os, id, version), collapse = "-") + + } + + renv_bootstrap_platform_os_via_redhat_release <- function() { + + # read /etc/redhat-release + contents <- readLines("/etc/redhat-release", warn = FALSE) + + # infer id + id <- if (grepl("centos", contents, ignore.case = TRUE)) + "centos" + else if (grepl("redhat", contents, ignore.case = TRUE)) + "redhat" + else + "unknown" + + # try to find a version component (very hacky) + version <- "unknown" + + parts <- strsplit(contents, "[[:space:]]")[[1L]] + for (part in parts) { + + nv <- tryCatch(numeric_version(part), error = identity) + if (inherits(nv, "error")) + next + + version <- nv[1, 1] + break + + } + + paste(c("linux", id, version), collapse = "-") + + } + + renv_bootstrap_library_root_name <- function(project) { + + # use project name as-is if requested + asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") + if (asis) + return(basename(project)) + + # otherwise, disambiguate based on project's path + id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) + paste(basename(project), id, sep = "-") + + } + + renv_bootstrap_library_root <- function(project) { + + prefix <- renv_bootstrap_profile_prefix() + + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) + if (!is.na(path)) + return(paste(c(path, prefix), collapse = "/")) + + path <- renv_bootstrap_library_root_impl(project) + if (!is.null(path)) { + name <- renv_bootstrap_library_root_name(project) + return(paste(c(path, prefix, name), collapse = "/")) + } + + renv_bootstrap_paths_renv("library", project = project) + + } + + renv_bootstrap_library_root_impl <- function(project) { + + root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) + if (!is.na(root)) + return(root) + + type <- renv_bootstrap_project_type(project) + if (identical(type, "package")) { + userdir <- renv_bootstrap_user_dir() + return(file.path(userdir, "library")) + } + + } + + renv_bootstrap_validate_version <- function(version, description = NULL) { + + # resolve description file + # + # avoid passing lib.loc to `packageDescription()` below, since R will + # use the loaded version of the package by default anyhow. note that + # this function should only be called after 'renv' is loaded + # https://github.com/rstudio/renv/issues/1625 + description <- description %||% packageDescription("renv") + + # check whether requested version 'version' matches loaded version of renv + sha <- attr(version, "sha", exact = TRUE) + valid <- if (!is.null(sha)) + renv_bootstrap_validate_version_dev(sha, description) + else + renv_bootstrap_validate_version_release(version, description) + + if (valid) + return(TRUE) + + # the loaded version of renv doesn't match the requested version; + # give the user instructions on how to proceed + remote <- if (!is.null(description[["RemoteSha"]])) { + paste("rstudio/renv", description[["RemoteSha"]], sep = "@") + } else { + paste("renv", description[["Version"]], sep = "@") + } + + # display both loaded version + sha if available + friendly <- renv_bootstrap_version_friendly( + version = description[["Version"]], + sha = description[["RemoteSha"]] + ) + + fmt <- paste( + "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", + "- Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", + "- Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", + sep = "\n" + ) + catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) + + FALSE + + } + + renv_bootstrap_validate_version_dev <- function(version, description) { + expected <- description[["RemoteSha"]] + is.character(expected) && startswith(expected, version) + } + + renv_bootstrap_validate_version_release <- function(version, description) { + expected <- description[["Version"]] + is.character(expected) && identical(expected, version) + } + + renv_bootstrap_hash_text <- function(text) { + + hashfile <- tempfile("renv-hash-") + on.exit(unlink(hashfile), add = TRUE) + + writeLines(text, con = hashfile) + tools::md5sum(hashfile) + + } + + renv_bootstrap_load <- function(project, libpath, version) { + + # try to load renv from the project library + if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) + return(FALSE) + + # warn if the version of renv loaded does not match + renv_bootstrap_validate_version(version) + + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warnify) + + # load the project + renv::load(project) + + TRUE + + } + + renv_bootstrap_profile_load <- function(project) { + + # if RENV_PROFILE is already set, just use that + profile <- Sys.getenv("RENV_PROFILE", unset = NA) + if (!is.na(profile) && nzchar(profile)) + return(profile) + + # check for a profile file (nothing to do if it doesn't exist) + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) + if (!file.exists(path)) + return(NULL) + + # read the profile, and set it if it exists + contents <- readLines(path, warn = FALSE) + if (length(contents) == 0L) + return(NULL) + + # set RENV_PROFILE + profile <- contents[[1L]] + if (!profile %in% c("", "default")) + Sys.setenv(RENV_PROFILE = profile) + + profile + + } + + renv_bootstrap_profile_prefix <- function() { + profile <- renv_bootstrap_profile_get() + if (!is.null(profile)) + return(file.path("profiles", profile, "renv")) + } + + renv_bootstrap_profile_get <- function() { + profile <- Sys.getenv("RENV_PROFILE", unset = "") + renv_bootstrap_profile_normalize(profile) + } + + renv_bootstrap_profile_set <- function(profile) { + profile <- renv_bootstrap_profile_normalize(profile) + if (is.null(profile)) + Sys.unsetenv("RENV_PROFILE") + else + Sys.setenv(RENV_PROFILE = profile) + } + + renv_bootstrap_profile_normalize <- function(profile) { + + if (is.null(profile) || profile %in% c("", "default")) + return(NULL) + + profile + + } + + renv_bootstrap_path_absolute <- function(path) { + + substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( + substr(path, 1L, 1L) %in% c(letters, LETTERS) && + substr(path, 2L, 3L) %in% c(":/", ":\\") + ) + + } + + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { + renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") + root <- if (renv_bootstrap_path_absolute(renv)) NULL else project + prefix <- if (profile) renv_bootstrap_profile_prefix() + components <- c(root, renv, prefix, ...) + paste(components, collapse = "/") + } + + renv_bootstrap_project_type <- function(path) { + + descpath <- file.path(path, "DESCRIPTION") + if (!file.exists(descpath)) + return("unknown") + + desc <- tryCatch( + read.dcf(descpath, all = TRUE), + error = identity + ) + + if (inherits(desc, "error")) + return("unknown") + + type <- desc$Type + if (!is.null(type)) + return(tolower(type)) + + package <- desc$Package + if (!is.null(package)) + return("package") + + "unknown" + + } + + renv_bootstrap_user_dir <- function() { + dir <- renv_bootstrap_user_dir_impl() + path.expand(chartr("\\", "/", dir)) + } + + renv_bootstrap_user_dir_impl <- function() { + + # use local override if set + override <- getOption("renv.userdir.override") + if (!is.null(override)) + return(override) + + # use R_user_dir if available + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) + return(tools$R_user_dir("renv", "cache")) + + # try using our own backfill for older versions of R + envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") + for (envvar in envvars) { + root <- Sys.getenv(envvar, unset = NA) + if (!is.na(root)) + return(file.path(root, "R/renv")) + } + + # use platform-specific default fallbacks + if (Sys.info()[["sysname"]] == "Windows") + file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") + else if (Sys.info()[["sysname"]] == "Darwin") + "~/Library/Caches/org.R-project.R/R/renv" + else + "~/.cache/R/renv" + + } + + renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { + sha <- sha %||% attr(version, "sha", exact = TRUE) + parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) + paste(parts, collapse = "") + } + + renv_bootstrap_exec <- function(project, libpath, version) { + if (!renv_bootstrap_load(project, libpath, version)) + renv_bootstrap_run(version, libpath) + } + + renv_bootstrap_run <- function(version, libpath) { + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(renv::load(project = getwd())) + } + + # 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) + + } + + renv_json_read <- function(file = NULL, text = NULL) { + + jlerr <- NULL + + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { + + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + jlerr <- json + + } + + # otherwise, fall back to the default JSON reader + json <- tryCatch(renv_json_read_default(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + # report an error + if (!is.null(jlerr)) + stop(jlerr) + else + stop(json) + + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # find strings in the JSON + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + locs <- gregexpr(pattern, text, perl = TRUE)[[1]] + + # if any are found, replace them with placeholders + replaced <- text + strings <- character() + replacements <- character() + + if (!identical(c(locs), -1L)) { + + # get the string values + starts <- locs + ends <- locs + attr(locs, "match.length") - 1L + strings <- substring(text, starts, ends) + + # only keep those requiring escaping + strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) + + # compute replacements + replacements <- sprintf('"\032%i\032"', seq_along(strings)) + + # replace the strings + mapply(function(string, replacement) { + replaced <<- sub(string, replacement, replaced, fixed = TRUE) + }, strings, replacements) + + } + + # transform the JSON into something the R parser understands + transformed <- replaced + transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) + transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) + transformed <- gsub("[]}]", ")", transformed, perl = TRUE) + transformed <- gsub(":", "=", transformed, fixed = TRUE) + text <- paste(transformed, collapse = "\n") + + # parse it + json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] + + # construct map between source strings, replaced strings + map <- as.character(parse(text = strings)) + names(map) <- as.character(parse(text = replacements)) + + # convert to list + map <- as.list(map) + + # remap strings in object + remapped <- renv_json_read_remap(json, map) + + # evaluate + eval(remapped, envir = baseenv()) + + } + + renv_json_read_remap <- function(json, map) { + + # fix names + if (!is.null(names(json))) { + lhs <- match(names(json), names(map), nomatch = 0L) + rhs <- match(names(map), names(json), nomatch = 0L) + names(json)[rhs] <- map[lhs] + } + + # fix values + if (is.character(json)) + return(map[[json]] %||% json) + + # handle true, false, null + if (is.name(json)) { + text <- as.character(json) + if (text == "true") + return(TRUE) + else if (text == "false") + return(FALSE) + else if (text == "null") + return(NULL) + } + + # recurse + if (is.recursive(json)) { + for (i in seq_along(json)) { + json[i] <- list(renv_json_read_remap(json[[i]], map)) + } + } + + json + + } + + # load the renv profile, if any + renv_bootstrap_profile_load(project) + + # construct path to library root + root <- renv_bootstrap_library_root(project) + + # construct library prefix for platform + prefix <- renv_bootstrap_platform_prefix() + + # construct full libpath + libpath <- file.path(root, prefix) + + # run bootstrap code + renv_bootstrap_exec(project, libpath, version) + + invisible() + +}) diff --git a/working-on-wynton-hpc/renv/settings.json b/working-on-wynton-hpc/renv/settings.json new file mode 100644 index 0000000..ffdbb32 --- /dev/null +++ b/working-on-wynton-hpc/renv/settings.json @@ -0,0 +1,19 @@ +{ + "bioconductor.version": null, + "external.libraries": [], + "ignored.packages": [], + "package.dependency.fields": [ + "Imports", + "Depends", + "LinkingTo" + ], + "ppm.enabled": null, + "ppm.ignored.urls": [], + "r.version": null, + "snapshot.type": "implicit", + "use.cache": true, + "vcs.ignore.cellar": true, + "vcs.ignore.library": true, + "vcs.ignore.local": true, + "vcs.manage.ignores": true +} diff --git a/working-on-wynton-hpc/Gladstone_Wynton_Docs.pdf b/working-on-wynton-hpc/slide_materials/Gladstone_Wynton_Docs.pdf similarity index 100% rename from working-on-wynton-hpc/Gladstone_Wynton_Docs.pdf rename to working-on-wynton-hpc/slide_materials/Gladstone_Wynton_Docs.pdf diff --git a/working-on-wynton-hpc/slide_materials/HPC_diagram.png b/working-on-wynton-hpc/slide_materials/HPC_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ad22bf6770735451742126ff915dd105609e47aa GIT binary patch literal 136053 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�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�OHrOu96+9<_#<4&3ek9>g4FS-QQ9VB?c8; z{_rz6<+rOOP#{G_i@z^zZ>P+Qd*fW1C6p*N_$XuCGWVGcmO4lW0yx;>qgBk)MW*lB zbj~MDp6GlosTsq?82UmY9!;~23!?n3D4HNqf;?KBTV~Vek{tYf923(%`k-{Uxv;nE zI9@K{rgHE-QrTn=8a%0bjI+}MZe_~j?5q=0KiHvkcz-webf50iTUwd05dcX7Hxzb#rnqc#>p0sDA(z&90>A^R~0YIdE-K*mQF)wKBa8ioU1UX}+KX zZ)%u{@Zeg_+AN8eGU;g_j;%}@2(Q1yPwBlfB|t{A{*_Ua_ox zHZ;`@=yOa)H*D;PBJKSgWrQJD?!92FWjtACPGwvar0(Puh~ch883k^YxPQ0s%js8b zV?R|#_SXboK(c49VF)-NJC9t(vY~xAUr#T!${${^*>hk-Dl7)me;)eboWaf zwDFW`ocrd@sPzK4hm-CeJZA3BGp6`ti|DqfG}*a(B-PJRnwX)=iwviur4Lb)ln!C7 zLE0u6nd;f&AE=D#HtrUDKn`{RC0BmltpxsXY_@fW!R4nqOR#Qvx86i1Y%Z zK07(uwA)g~b^KlA7|XZ(Rqx}3dwOpipmMW~@J)o~+%bmFaDA+6i-H~`y@!57OR9Mx zIImfeV=*o5FOw4pqSznbNtn*f%Q`I()L& zoT^zV!HcQ*B5{Tcz?QDl9>Wj*UFv}m(tjpcFhMbPUg|HLc#)=fizbBH(C9N%_9aj< zm7%a{1dyGj#@qJGT_f&f){q&0#+sbM6Avu_x_Pd8N)4RrjNx-)S}t`Z6w9>@Vf_2N z{93hU-`6Hi^!{=aIdW(98JoX=5H-Qr)l`?c1wQXL)1wL=gR?nIcvJgg3?@HXpRk0L z4!oXw!5%g!FZ<|^Sk<8dUfo}I@cq%ICgg%2boDHr zM!cFVbB)@S`J%=O$+BTZRE^JsA5&-PFhRSQG+GL6GcMP3g#4YE%xd4^O##OA&6 z{xmC))WArE4^NS}9f+A$tYJDoZVOJsHPerCsT~%>U{I9^{bZznU;Gl+wBTYLWb&Fr z3@0ATZnq91fLwIyJu2_UKnmSM1U5tp$637=_VYJ9JWMW!O8BXY{&5S` zF3{~Y2w5(a`HSn=ojsn`4GVWjxfAOGvx6Ak3)f`f7K+Z)=o?w}dap8S_Pjw2%upl_ z`!Epl0eK_|*8*kA-CZ-i5htEt-S4zFveZ5S5H!SG#mIhJl zV1gwj*}@Kq68XT^G*Chl(;|~7=skbn+aA4S)`qv>w?v0zstdx|R5P6(BK0n?x2ktt z&-7-j(aK1a!pAJM%P*Cp!$Y1zV|5VA{DGQE6&FKq?(DMm#yVY$)V1OHxM#C7AEQ3M z=-Dp1*dojAk7o|feIaP@M_>CN14_l6sG8R-j7Hk>8s?QKt&J1=q;>-rg`|#Ax%Lub zppn;^IViDMk^6&|gNst^*zU^j6 zRtJB$RsH>4ALi+W2e&4*K1m2{mgq0o zORZJ>qc9IsUeG6n4&dzIz~qAMpxV04?THMhU0m4p#liH17;EA~p08UX@t*?#`y|5n z@xMDg`z-F&4{~euH;)PYP6iKGXFC1ud9aH$9t_ba{2DcDuM-CqdgELy;AxOxJ4!2ILQgpv*kZD^i)sfuD0c8OG7^#C z=CH}auz*mUg;4i}_52t;qJ6ReWR2TnENBqs9)Jf~J9Y#k|A1t-&r!bTHdFlWiBx5X zTBrSvNl=|mHxHEEPCD8mp@0%oj;B0Y$rg6i?()%TQJXFC#8kh3IF-0GcVSnKUnRthC13TW5zD<_;+@a z?VH4Y4)R3K&n&imcO?MXI`*{MLLztuJt+regbZciqjD8n4nD{P#}mHo5nPWyY)s7~ zPXHS#+L)NBY-8cdvBm|t745$w2FB;1uJ;D4?a~W5>TFny62wYx<^4!$j9>~^^yP1b z8Lvsb`u{Fz(61NYf$W*YJ}^qU%$y(y#I3!2QBxh5xRiu-&Y~|0kpbG(C`73;UKokOX>elyHrjan?Zu zN_lq14zaEK6lIBE59|9Gm0}FkCmWSg_1g{xk?I?F?4SyYMN%IW;$%7Vzib9KlCkSw zHq$0a!QuX^&Hq=N1_T6RMeW;HyhUGE$>7gkulb;~I7CuYS}5B$JpOabQP*hS2P3FS z@Tvojr&dy(RW3Ly7vDHp#49`UYO#j})&FkA>pry#$}CB1UXo}Ar4r-fW1mE$i4U-@ zxPz5TFGMi$73`3{@YS%`Qhl}td=7bSM>iMu1{}|&2}#$Tj7InT_t!5gxKu&oEcyFj z(^8U#gFmSPyE|d-U8aH3(*5CL;mZp{Tn2emM3A3M!Nf@8C58!1k6EuN56@WBc45<9 z7-y0DJLfw!w%>wBZ~C4^MI}%p4S?kX9NaB8;!>Vir-VS#N*fQ90=mox(+a3gk3|j| zjCP5)Jf9A@p*-g; zsAJmOVCSce9D-@9gWuQyL3HgyypWQ9^9z`4DK^4aSmRApB(2v%NwsBQn=LGV zROxg<#!_=@G6E5yqBJ02g=n1V#DYPpXYQfylyCz+i@l1Zn;>MQ)Fp7uz?!U?GoHUG zDyGzmb&FQ~M9PK?glf1ot~xU3kC7D{%FF-&bQ;u$Gza9QT$KgV9hh%gY8GculAxL) zh8YC-;%wyLyHlB)q}3px;Mem~Mf)FSy!1}VCzyIA805iMy;7Z~nE;PNP-p0d6;J>-TUPx4!%6~}g+`^vK00mYZrM(v(p}q`V6HE5`bbSt|-!-Eo`6ZXY#g zQiql=v^yjoFZf1KmRQONakwD*x)7YFDWQz9S%(|6h?G}s=%{?VZ#aUgaL3tp5yDwd z?4s6oC~LT&Y7ETrlqB(5#Q8I4Z!>uht#p-5|FB77X^8HWS~2Hlz0B%ORBr)_zvTd? z$5I9zaLCF|w0_5Zoc`m!$`Yr+6Vz7!H?VoS9G9Y6xJ$UUE)wYq=i*S?wT-Jc8iwH7 zdc~4PQ%*ls`^{UzCNL(wtolUyN2y~}aih9pMm|Z`k1)Hu5lafaG$BuQgcxWgg-e{E zri_a;@1>|SqK#OvYYW2Wk{v}Dzg8;^(uPyc zf)~x*zHH(1u<%MZU4BW75?#NBA95-4Q(g8^RAq(8@{9R`7NwEm%I?)u-6EW!Le2JJ z7XEz!)vr+sK!khDDDCYq`@5a>cS8IzGsl*?UDO~1&|G!;O&A6hA0XEGuMt^mc%7T& z+7`?%L3Bgil3)n0z%1s1cUVcFOs@HX8akR59!7E`$p`Ef5NqoE`h=Zpy%EmBl3}HS3YFG%68e z4&nD@s_`6{>{$davQoZ#lm%$Qi!B)9Y;Xv z$lNG~M@3r79E(?KeHSky8CBXDd5 zCK4H-#z8M&E8}~vWxLt}ooEvcQ4^Zvswk!CIg#eS=s1OngiY+I)mcw_!WK$<((8OU zHFc&494fz*NW(#611b@2)9X6Rx9o}Qz~{*^JlcxLegoXb9k!ab_@eg6!uD;)_wdnH z8vxEU4LuX4XGDwuNM?I#CT((y@ETmuMR_f6+HI8o3_}&@ee3@W!*aND*qkU@=k>Ku zB1&whE4$EP%1oK*TS|AYrQVE&Bw{#VbL;&x+3Cr@Chg=k-Fb_6zAR4WI6;|trvbCJ zFE@!cXMus^jnuB)Z?nrWg+p#XTTaLM-eVKQ;Kk`qpP9gEr=9Kex6?JFK9ksyBplj>(PN0Hz6fuJ`A0#_{_743$?^^bGsU{U5B zd$&>_k^-L(ywrV0f5Tn<;;#P07b30+ls4#G8EPl>%vsES2<2Z+9kWMjgTSI02v(DP zlHYxX_J}9&^!?UE6w5yfvlQN3U=leZ|JNi@cQ-)}o0d#v0|%&{p138r11a)tedwzouIJ|M{IkS{pSWvCzian9kI(~*0a2?z1 zP)oo1J033Vckc>Sb1%6-P7|u;KcU?Rmv6VlPit9(J+eMORv_9qCYWlJiuhHC|3Z3#U$BW`J&XgWjc3 z$Ra`rUv?mdDm-eO{AYiiN(%ML)eu(&FH~=!C!YG-Z$Ib(0vi~w(Wf%_pI81qK#^2=COc$YT+z5`> zi0y^8w_^j=`0}Eyb8P21uM!(V3l-Vvd`eYjv7u^?T*z@(dWZD`CMEj_-PFXB;$uEQ z0pND^ssr@*MgxW`h;E|m7`z3H#b0Z;o|;R-)ixrQ7f=ig+~(T&JtjvXh?I0hQ0wND zpP}Ac;}k(l3MuOs>p`Lmf9QqgDG7EEAL_I8>HpXQFU)X==kNJIzZRv*+e*Wj6wWw< zTV6IY&Ol&=uXr#P2x4U*s8jg&#Ul#gU)3d`Ekvb>{!Hw5);exX!6AIUD?Z;BpAUZ` z-xxoO$IqU^&pP2}FB7Md3Eu5e*tU(>w!g6f3Rn?*2`9dUtX^WUCjWCqZ<{Q(O%dC+ z9oxo*Zs$fX*q2P~LyijlC-i@jJzNCiPN?qDDA~MeS3s?8#<;0iXFpHrpkU2K<3J2n z<*UNurX6V(UFBk(qWF@^4Qb>vVx7SbA#*AHk$EyjmiYX2=!Y(6K8j;iRGm5AAi+rz z&Oc>7_Gp%*@tBc`hb>$XQ!rq=ZEUlQ!MvXbXK*la%Ky%uD)Pz0GY1>a`0JPMXssH= z*KF1-QPs^E%+|#B_>Ya5Vmr5sb?%ih5Spv#uhq{^;>K+35TsdM#y$#Mn{jBMQ?P3? zhDU?OyBi1}FaLZtH*|%#Hf=@pOrrM;aq2R9Wc|>3uQGBT=0~VT$wJ<-k7*3OPh?ia zI~H~+FxH5KIMa?I{ZVCG)R&K&DNFZYI}JE+qeIf?V>yY$3Sn3GA$f(OfS#&C-NH!) zeAAA~EQVx7sfqbJp=rJ$45zIF8jyAj^ylbmwu|xEm?fMaBW$@!A)7pZ3q5l2&XMx= zVB&%Ry0!93ktCMnxxxQ1-fw)(({^FBb#|9;t5B<-WyXtvF)8#&s92|}Rr;?rXlK8< zcO*+frD)-Zeq6Jw1ACZ}&um$Gdq}wKXKLRaXb6VVnp8^bPTI`jBBD%S){@aEd1EoN zaD(VoM4Wo1csSrB-tT+FEv0rJ0nA*JaD)4i%C!SiR^<5v>5QgHEt0g-v@UvNt3}$t zxirs$mNy1xe_81Sja#Be-l9hy%A9{TL?k{8A&LeQPx7?!L{Q5zT$q2(Y%&l&pmf;7 z=GF0j!%}YyNNX++#?9R&PBlrLZ|hVb=Ke~}CaE0A9N193O1-3i$l~X8eD%q*0@?i! z)XB_R*8J#)d}!6%8CiePDZydYNCxC65k(JI%NQDgTA)W;-zCKkz6?Oa`1+8 zkqUO+vD3UYLzN$W(xTMUw^yXVbL@o#uCG*B15ch(q(2ZuNhSr%=mxwoILzLdc!tvr ztdATN0~N3;fia$p?wi8{yn?Gmo1Ddar9WA^&Rr)?&16fr@L}fWiBmP#q6KsoD^$M` z-%D_5sf#+e#5!{jxOqp5Cn%GI3Sp-#k$7C5+!z`Yyx_3@!atpT5 zseD#+9eUwJd4uZYXtj&=t&AQp*g!$_!tC@z=@RWZx1@V2j^!Py>(Ht<6yAq82Z~{> zT>D8fL}DfI5M)vrOq3rtYuJd$o?m8L9jA2gWz;glESU22XID?SHiE$yU^^8(-MT9A zB|RrR`ts651<3B`k#ub5LaXzfuE3DV2g$CGH$_vUe|xuzjW`5kF>6`27Cj%rrXlel z!;KId;B<%-H%GH=h%Oyj#cA8VOJO@tuIgxVZ|Ye)V=k=Vn*Z8P&Lx!mYj0gZsTzJ^H7M)}ux1T|d>8lgftuXH#Fn zFoiO0m;%MJ0pb#O>}rH0sE{TWCs{wN%k}@V3SUxGasN#7aC)JiN$cj8=~4rYlIG*^ zl3Mgg?46-~(?sHwFnZ*=KtsUTcd-E#C2T-<=?-f?bdhJdkY$HlU5`Xo{z({&3{Ue$ z%;hkpBf^G=3R(b~9mm8TDN4D{jOAfF`&XHbKGZC^+!ER2i|xEazMnVqYgjqGN9j5- z^cu0DWqU&pzT{!S-`xOT4q2pmbD^W6-4hOP!s+anMIZ|f!t3(G7AThEEJErfzamBg zcVp+ZN|l-~dA#}rE~~T%U`&2bOQlTU7;%aNJ@PktN!*EKkxul>gWE~X|;L} z^TdjKMGiF7yN=Z|D>!OBjb#raZF{O1>o!(9@O`aD$%}rOfX?r%j|b7N*{YV0>n~d5 zKKzvIn^ap-$=PN$^s9kcEBARRqH8&jnttP_uQ$QpP-=IY+mh2P;RoSjK%_k27~U=R z{Xk_JSz-=?ZHL8q)#1@r&4o>ImmFq`+GOWj#X5b{ivrf6+Y4+zTIa0(IFBziZ><84 z+MfMA(%zjtOxBqLX#qLGF|uBjzuJ*+Kw|<41_i6t3Xhk6SLH$vtw*c29qTi=LX>HB zX${4f$b4~8NLoK_iynEOoz^R&OKy<;95_=>UO)FEV#Km)Y)-y#{tc*+Md{ol;f5jc z*ydx|4b2bJt}nRv2Q$TA(-1`L;g1opMK?Ch>PGmq(CFOTpk7j@SyE}cuk``8PoKwr zX7)C5>Z5Rbe_>mJZ*O-`yE@+U=;>QI^Or57kM^~B1KTeiY(3WP5J2+8xDTn3=DtjL z71)jeYjUs} zWls}jB#&R`4rskzm5}#Me!y$hezIAvOpCK!Z?{pa?{(5}qOV^|MPXTGLJn2sHFe>8Zdz^8IE(_R0ypN*sKkot_)_QB?pPIDdVp2x2Xu%(95T z+j-GNfo0msgC|P?H_E7&%-H8na%z;cH;ztJULjf@X)ry!@?a}Duj*%aZ;~fOKzO&j zwGcY+RGA2~R#)4b6Et-&ive>W=w;IlPeBi%adIj<_UcqO@rQnQ{?};Mp(kH0WX`7m zJXr8iZpg!zTpnV1KuQ=iCs&9)VoxNIJp2P>v81veb7%4S3(AZZrVWs5Jmkl4xHsRW z6~lvyTPc54204%jAwCg3RaefVZY?`(wDu06awxa!hI96vnNi|YJfq!@*AK~8h(krk z(gsoWs!h%=TeB}%y9=KkAbnzuKfJ#Sak4GYOm+!g#$g2lIfPimgC5#ld=rdDMds_b z>WTzXS+Bn>-mgTYe*uU0JBrVjK5{+#DlwfDu-f|duqnr{=>9WB1JS|ETK;a9duj6O zSOW=2^RiA`EnB`j1l%=!`b_q|=~e#qZbL%T{pgYDnU#Z60c6*XBy~JlKenavq-F_V z@RPFAKR?g>AWofA6uIo_O9~V~pG1#LTw(mej;?-CO8V97r?MqZe=kB4;1nQAaT!r6 z1TtxjX@EL@_9k&Epy?LtH=Od?R)psTXXoA@S^*#&v`N*7 ztVMEY9UO6MEqYkQ*_#Kxo3-xZZq@L-cOfIHGFX*eSe4Ofe~nhf2oibc-0S{d3%+>2 zAzNYV_2`9wW$`Vjm;nMDBNyE{Q!uAXs5VJ#w0cQmtnwE&y8PiDT)S`E8#y@LrY+j9bRsA%~kxK2T*yw2zH0QF=5V(C;B3IiYT0kxf0aHoDx zyRwP|3FgF_X5^0|&~b8cGZ^UP{Mm;^;xy<i(l?_`cj+^4dKCqA_zW^j^=zD9zA`<>{#6WwrT;1hotFNO cD8{^MS^DO-owAo?8Q`C`x;{Ql&F0+y0%oxTaR2}S literal 0 HcmV?d00001 diff --git a/working-on-wynton-hpc/status-chart.png b/working-on-wynton-hpc/slide_materials/status-chart.png similarity index 100% rename from working-on-wynton-hpc/status-chart.png rename to working-on-wynton-hpc/slide_materials/status-chart.png diff --git a/working-on-wynton-hpc/style.css b/working-on-wynton-hpc/style.css new file mode 100644 index 0000000..ae62ab5 --- /dev/null +++ b/working-on-wynton-hpc/style.css @@ -0,0 +1,162 @@ + +/* Set font size and alignment for the message */ +.bottom-message { + font-size: 0.8em !important; + font-style: italic !important; + text-align: center; + position: relative; + bottom: 0 !important; + left: 0; + right: 0; +} + +.reveal code { + background-color: #1e1e1eef; /* Dark background for code chunks */ + color: white !important; /* White text for code */ + font-size: 1.2em; + line-height: 1.2; +} + +.reveal code::selection { + background-color: #d97306 !important; /* Dark magenta background for selected text */ +} + + + + + +/* Specific styles for code output: background */ +.reveal code.output { + background-color: black; /* Black background for code outputs */ +} + +/* Style for text selection within code outputs */ +.reveal pre code.output::selection { + background-color: #9c0366 !important; /* Dark magenta background for selected text in outputs */ +} + +/* Code output text color */ +.reveal pre code.output { + color: white; +} + + +/* Left-align all code outputs */ +.reveal pre code { + text-align: left !important; +} + + +/* Add horizontal scrolling to all code outputs */ +.reveal pre code.output { + white-space: pre !important; + overflow-x: auto !important; +} +/* Change the font family used for code blocks */ +pre, code, kbd, samp { + font-family: "Courier New", Courier, monospace; +} + + +/* Add horizontal scrolling to all code chunks */ +.reveal pre code { + white-space: pre !important; + overflow-x: auto !important; +} +/* Bold slide titles and change color */ +.reveal h2 { + font-weight: bold !important; + color: #9c0366; +} +/* Bold slide titles and change color */ +.reveal h1 { + font-weight: bold !important; + color: #9c0366; +} +.reveal .slides>section:first-child h2 { + color: #333; + font-weight: normal !important; + } +/* Custom slide title */ +.my-title-slide h1 { + font-weight: bold; + color: #9c0366; + } +.my-title-slide h2 { +color: #333; +font-weight: normal !important; +} + + + +.reveal .slides>section:first-child h1 { + font-weight: bold !important; + color: #9c0366; +} + + +.reveal p { + text-align: left; + margin-left: 20px !important; + } +.reveal ul { + display: block; + margin-left: 75px !important; + margin-right: 50px !important; +} + +.reveal ul ul { + font-size: 0.75em; /* Smaller font size */ + margin-top: 5px !important; + margin-bottom: 5px !important; +} +.reveal ol { + display: block; + margin-bottom: 20px !important; +} + + +/* Decrease size of image, remove border, shadow and center align*/ +.reveal img { + max-width: 60%; + border: none !important; + box-shadow: none !important; + display: block !important; + margin: 0 auto !important; +} + +small { + font-size: 70%; +} + +/* Create a custom class for the small bullets, increase the spacing between list items */ +.small-bullets ul { + font-size: 85%; +} +.small-list ol { + font-size: 80%; +} + +.reveal li { + margin-bottom: 10px !important; +} + + +.less-small-bullets ul { + font-size: 80%; +} + +.big-picture img{ + max-width: 70%; + border: 1px solid black !important; +} + +/* Chage link color to purple */ +.reveal a { + color: #0c74dc !important; +} + +/* Change link color to purple on hover */ +.reveal a:hover { + color: #9c0366 !important; +} diff --git a/working-on-wynton-hpc/working-on-wynton-hpc.Rproj b/working-on-wynton-hpc/working-on-wynton-hpc.Rproj new file mode 100644 index 0000000..8e3c2eb --- /dev/null +++ b/working-on-wynton-hpc/working-on-wynton-hpc.Rproj @@ -0,0 +1,13 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX