Downloading the data

← all fields

In a web browser — no token needed

Just click any download link on a field page. If you are not already signed in, Globus will prompt you to log in (your ORCID works), then the file downloads. The bulk ⬇ Everything / Mosaic images / Catalogs / Detector-frame exposures buttons open the folder in the Globus file manager — press Ctrl/Cmd-A to select all and Start a transfer to your own collection. No access token is required for browser downloads.

If your download destination is itself a Globus collection, this is the whole job: globus handles authentication and the transfer — no wget, no token, no extra steps.

pip install globus-cli
globus login                 # one-time; handles authentication
globus transfer --recursive \
  d9873d5e-0fbd-4980-aedf-4ca56f65a045:/releases/<version>/<field>/ \
  <YOUR_ENDPOINT_ID>:/local/destination/

The destination must be a Globus collection. On an HPC/cluster you almost certainly already have one (ask your admin for its endpoint ID). On a laptop or workstation, install Globus Connect Personal once to make it a collection. Track progress with globus task list.

This is also the best way to take the detector-frame exposures: a field's exposures/ folder runs to tens or hundreds of GB across hundreds of files, which is what a recursive, resumable Globus transfer is for. Append exposures/ (or exposures/<FILTER>/) to the source path above to take just those.

Can the bundle buttons be used from a terminal?

No — and there is nothing to unpack. Every Everything / bundle button is a link into app.globus.org/file-manager, the Globus web file manager: it opens a browser, signs you in, and shows that folder with the transfer already aimed at it. Pasted into wget or curl it fetches the file manager's HTML, not data. The buttons package nothing, and this site ships no tarballs — one field-filter of frames is ~20 GB and the release is several hundred GB, so a pre-built archive would duplicate data that is hardlinked precisely so it is not duplicated.

A button’s exact equivalent is the globus command above. The two values it needs are in the button’s own link: origin_id is the collection and origin_path the folder. Copy them out of any button on this site (right-click → copy link) and hand them to globus transfer --recursive. Same service, same resumable transfer, no browser after the one-time login — and it follows the symlinked frames that HTTPS cannot serve.

No Globus collection? Use the URL lists. Beside every bundle button is a URLs link: one URL per line for exactly that group, for wget -i or curl. Whole-field lists (_files.txt, _images.txt, _catalogs.txt, _exposures.txt) sit under Bulk download on each field page. This route needs a bearer token (below), is not resumable within a file, and cannot fetch symlinked frames: those groups show transfer only instead of a list, and are left out of the lists rather than shipped as links that 404.

No Globus collection at your destination? wget / curl

Only needed if you cannot use a Globus collection as the destination (e.g. pulling straight onto a plain web server). wget cannot do the interactive login itself, so you first mint a short-lived bearer token. The login step still happens in your browser (open a URL, sign in, paste back a code); the helper then prints the token. There is no way to copy a raw token straight from a web page.

pip install globus-sdk
python get_globus_token.py        # browser login, prints a token
TOKEN=<paste the token>
wget --header="Authorization: Bearer $TOKEN" -i <field>_files.txt

Save get_globus_token.py (or copy it below). Token is valid ~48 h; re-run for a fresh one. Each field page links _files.txt / _images.txt / _catalogs.txt / _exposures.txt URL lists for wget -i, and each exposure group links a list of its own beside its bundle button.

#!/usr/bin/env python
"""Mint a Globus HTTPS bearer token for the JWST root collection so you can
download release files with wget/curl.

  pip install globus-sdk      # once
  python get_globus_token.py  # opens an ORCID/Globus login in your browser

Then:
  TOKEN=<paste the printed token>
  wget --header="Authorization: Bearer $TOKEN" -i sgrb2_files.txt
The token lasts ~48 h; re-run to get a fresh one.
"""
import globus_sdk

CLIENT_ID = "3b1925c0-a87b-452b-a492-2c9921d3bd14"   # Globus tutorial native client
COLLECTION = "d9873d5e-0fbd-4980-aedf-4ca56f65a045"  # JWST root

scope = f"https://auth.globus.org/scopes/{COLLECTION}/https"
client = globus_sdk.NativeAppAuthClient(CLIENT_ID)
client.oauth2_start_flow(requested_scopes=scope, refresh_tokens=False)
print("\n1. Open this URL in a browser and log in (ORCID works):\n")
print("   " + client.oauth2_get_authorize_url() + "\n")
code = input("2. Paste the authorization code here: ").strip()
tokens = client.oauth2_exchange_code_for_tokens(code)
token = tokens.by_resource_server[COLLECTION]["access_token"]
print("\nBearer token (valid ~48h):\n")
print(token)