Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
eb36a7a
feat: push
tristan-f-r Jul 3, 2025
bc9ba10
ci: push docker
tristan-f-r Jul 3, 2025
d84be32
ci(push-docker): specify yes-flag
tristan-f-r Jul 3, 2025
800e727
feat: tag, latest and such
tristan-f-r Jul 3, 2025
57998e3
chore: forcibly break ci
tristan-f-r Jul 3, 2025
f947332
feat: better push support over metadata
tristan-f-r Jul 3, 2025
367ea72
chore: bmp oi1
tristan-f-r Jul 3, 2025
b7c9e2c
ci: test using ghcr
tristan-f-r Jul 3, 2025
eb5ae66
chore: specify v1 for domino
tristan-f-r Jul 3, 2025
5dccba4
docs: drop 'no-conda'
tristan-f-r Jul 7, 2025
1e92433
Merge branch 'main' into docker-push
tristan-f-r Aug 24, 2025
514b1ea
Merge branch 'main' into docker-push
tristan-f-r Aug 24, 2025
2e40235
docs: update docker references to ghcr
tristan-f-r Aug 30, 2025
6e83f15
docs(push): clean
tristan-f-r Aug 30, 2025
23621b2
refactor: dockerName -> imageName
tristan-f-r Aug 30, 2025
fa66c42
chore: push responsenet to ghcr, add ghcr links
tristan-f-r Aug 30, 2025
2950a44
chore: label all associated containers
tristan-f-r Aug 30, 2025
cbb19be
chore(docker-wrappers): don't use legacy syntax
tristan-f-r Aug 30, 2025
573240c
chore: use v1 for rn
tristan-f-r Aug 30, 2025
f22b05b
no-push flag, document arch problems
tristan-f-r Aug 30, 2025
eee5c0a
docs: link to issues
tristan-f-r Aug 30, 2025
2594277
ci: check responsenet
tristan-f-r Aug 30, 2025
28eab0e
Merge branch 'docker-push-test'
tristan-f-r Aug 30, 2025
43ebaee
ci: add perms for r/w
tristan-f-r Aug 30, 2025
1687ba0
docs: mention new v1 for ghcr
tristan-f-r Aug 30, 2025
b95838a
ci: use ghcr on release
tristan-f-r Aug 30, 2025
9f35f0d
Merge branch 'main' into docker-push
tristan-f-r Aug 30, 2025
6f2d689
fix(oi1): custom python installation
tristan-f-r Aug 31, 2025
e4c0bb4
Merge branch 'main' into docker-push
tristan-f-r Sep 6, 2025
c0b2929
Merge branch 'main' into docker-push
tristan-f-r Sep 9, 2025
e949160
chore: move sub file back to docker registry
tristan-f-r Sep 9, 2025
b4a31eb
chore: mv push.py -> build.py
tristan-f-r Sep 9, 2025
0ca98c7
chore(docker-wrappers/build): mv nopush -> push
tristan-f-r Sep 9, 2025
94ecdfc
docs: use push over nopush
tristan-f-r Sep 9, 2025
1e5fedc
docs(docker-wrappers/SPRAS): explicitly use docker hub
tristan-f-r Sep 10, 2025
299b299
docs(contributing): use ghcr, don't mention container pushes
tristan-f-r Sep 10, 2025
3bccb93
Merge branch 'main' into docker-push
tristan-f-r Oct 4, 2025
4f81abd
Merge branch 'main' into docker-push
tristan-f-r Oct 14, 2025
6df7b0d
docs: more clarification
tristan-f-r Oct 14, 2025
57a3253
fix: paths
tristan-f-r Oct 14, 2025
3bafaf7
style: fmt
tristan-f-r Oct 14, 2025
49c5b96
Merge branch 'umain' into docker-push
tristan-f-r Oct 24, 2025
bfcc0ef
fix(schema): correct default container prefix
tristan-f-r Oct 24, 2025
84e86d5
Merge branch 'main' into docker-push
tristan-f-r Nov 8, 2025
afbe33e
Merge branch 'main' into docker-push
tristan-f-r Dec 7, 2025
902292a
Merge branch 'main' into docker-push
tristan-f-r Jan 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .github/workflows/build-containers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,57 +12,57 @@ jobs:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/OmicsIntegrator1
container: reedcompbio/omics-integrator-1
container: ghcr.io/reed-compbio/omics-integrator-1
build-and-remove-omics2:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/OmicsIntegrator2
container: reedcompbio/omics-integrator-2
container: ghcr.io/reed-compbio/omics-integrator-2
build-and-remove-pathlinker:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/PathLinker
container: reedcompbio/pathlinker
container: ghcr.io/reed-compbio/pathlinker
build-and-remove-meo:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/MEO
container: reedcompbio/meo
container: ghcr.io/reed-compbio/meo
build-and-remove-mincostflow:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/MinCostFlow
container: reedcompbio/mincostflow
container: ghcr.io/reed-compbio/mincostflow
build-and-remove-allpairs:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/AllPairs
container: reedcompbio/allpairs
container: ghcr.io/reed-compbio/allpairs
build-and-remove-domino:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/DOMINO
container: reedcompbio/domino
container: ghcr.io/reed-compbio/domino
build-and-remove-btb:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/BowTieBuilder
container: reedcompbio/bowtiebuilder
container: ghcr.io/reed-compbio/bowtiebuilder
build-and-remove-cytoscape:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/Cytoscape
container: reedcompbio/py4cytoscape
container: ghcr.io/reed-compbio/py4cytoscape
build-and-remove-responsenet:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/ResponseNet
container: reedcompbio/responsenet
container: ghcr.io/reed-compbio/responsenet
build-and-remove-spras:
uses: "./.github/workflows/build-and-remove-template.yml"
with:
path: docker-wrappers/SPRAS
container: reedcompbio/spras
container: ghcr.io/reed-compbio/spras
# Since any change to the SPRAS codebase would constitute a change to
# the container we produce in this step, build the container regardless
# of detected changes.
Expand Down
30 changes: 30 additions & 0 deletions .github/workflows/push-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Push to Docker

on:
workflow_dispatch:
inputs:
folder:
description: 'The folder to push'
required: true
type: string
version:
description: 'The version to use (e.g. v1)'
required: true
type: string

jobs:
push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Run build.py
run: python3 docker-wrappers/build.py --dir ${{ inputs.folder }} --version ${{ inputs.version }} --yes
23 changes: 5 additions & 18 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,12 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
# Passwords are set up through the GitHub control panel. The docs for
# the login action are explicit about never using a real password, and
# instead setting up a DockerHub personal access token:
# https://github.com/docker/login-action?tab=readme-ov-file#docker-hub
password: ${{ secrets.DOCKER_PASSWORD }}
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: ./
file: docker-wrappers/SPRAS/Dockerfile
tags: |
reedcompbio/spras:${{ github.ref_name }}
reedcompbio/spras:latest
# Use the previous latest for the build cache, assuming they're probably
# relatively similar
cache-from: type=registry,ref=reedcompbio/spras:latest
push: true
run: python3 docker-wrappers/build.py --dir SPRAS --version ${{ github.ref_name }} --yes
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Large SPRAS workflows may benefit from execution with HTCondor, a scheduler/mana
**Dockerized pathway reconstruction algorithms**: Pathway reconstruction algorithms are run via Docker images using the docker-py Python package.
[PathLinker](https://github.com/Murali-group/PathLinker), [Omics Integrator](https://github.com/fraenkel-lab/OmicsIntegrator), [Omics Integrator 2](https://github.com/fraenkel-lab/OmicsIntegrator2), and [Maximum Edge Orientation](https://github.com/agitter/meo/) are the first supported algorithms.
The files to create these Docker images are in the `docker-wrappers` subdirectory along with links to algorithms' original repositories.
The Docker images are available on [DockerHub](https://hub.docker.com/orgs/reedcompbio).
The Docker images are available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages).

**Python wrapper for calling algorithms**: Wrapper functions provide an interface between the common file formats for input and output data and the algorithm-specific file formats and reconstruction commands.
These wrappers are in the `spras/` subdirectory.
Expand Down
6 changes: 3 additions & 3 deletions config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ containers:
# Note that this assumes container names are consistent across registries, and that the
# registry being passed doesn't require authentication for pull actions
registry:
base_url: docker.io
base_url: ghcr.io
# The owner or project of the registry
# For example, "reedcompbio" if the image is available as docker.io/reedcompbio/allpairs
owner: reedcompbio
# For example, "reed-compbio" if the image is available as ghcr.io/reed-compbio/allpairs
owner: reed-compbio

# Enabling profiling adds a file called 'usage-profile.tsv' to the output directory of each algorithm.
# The contents of this file describe the CPU utilization and peak memory consumption of the algorithm
Expand Down
6 changes: 3 additions & 3 deletions config/egfr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ containers:
# Note that this assumes container names are consistent across registries, and that the
# registry being passed doesn't require authentication for pull actions
registry:
base_url: docker.io
base_url: ghcr.io
# The owner or project of the registry
# For example, "reedcompbio" if the image is available as docker.io/reedcompbio/allpairs
owner: reedcompbio
# For example, "reed-compbio" if the image is available as ghcr.io/reed-compbio/allpairs
owner: reed-compbio

algorithms:
- name: pathlinker
Expand Down
1 change: 1 addition & 0 deletions docker-wrappers/AllPairs/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# AllPairs wrapper
FROM python:3.12-alpine3.21
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

# bash is required for dsub in the All of Us cloud environment
RUN apk add --no-cache bash
Expand Down
7 changes: 4 additions & 3 deletions docker-wrappers/AllPairs/README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
# All Pairs Shortest Paths Docker image

A Docker image for All Pairs Shortest Paths that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/allpairs).
A Docker image for All Pairs Shortest Paths that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/allpairs).
This [algorithm](https://github.com/Reed-CompBio/all-pairs-shortest-paths) was implemented by the SPRAS team and relies on the NetworkX [`shortest_path`](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.generic.shortest_path.html) function.

To create the Docker image run:
```
docker build -t reedcompbio/allpairs -f Dockerfile .
docker build -t reed-compbio/allpairs -f Dockerfile .
```
from this directory.

To inspect the installed Python packages:
```
docker run reedcompbio/allpairs pip list
docker run reed-compbio/allpairs pip list
```


Expand All @@ -29,3 +29,4 @@ The Docker wrapper can be tested with `pytest -k test_ap.py` from the root of th
## Versions:
- v1: Initial version. Copies source file from SPRAS repository.
- v2: Add bash, which is not available in Alpine Linux.
- v3: AllPairs directionality
4 changes: 4 additions & 0 deletions docker-wrappers/AllPairs/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"imageName": "allpairs",
"architectures": ["linux/arm64", "linux/amd64"]
}
1 change: 1 addition & 0 deletions docker-wrappers/BowTieBuilder/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM python:3.8-bullseye
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

WORKDIR /btb
RUN wget https://raw.githubusercontent.com/Reed-CompBio/BowTieBuilder-Algorithm/dd8519cd8a8397c0e0724106f498b6002d3f7be2/btb.py
Expand Down
11 changes: 8 additions & 3 deletions docker-wrappers/BowTieBuilder/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
# BowTieBuilder Docker image

A Docker image for [BowTieBuilder](https://github.com/Reed-CompBio/BowTieBuilder-Algorithm) that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/bowtiebuilder).
A Docker image for [BowTieBuilder](https://github.com/Reed-CompBio/BowTieBuilder-Algorithm) that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/bowtiebuilder).

To create the Docker image run:
```
docker build -t reedcompbio/bowtiebuilder:v2 -f Dockerfile .
docker build -t reed-compbio/bowtiebuilder:v1 -f Dockerfile .
```
from this directory.

## Original Paper

The original paper for [BowTieBuilder] can be accessed here:

Supper, J., Spangenberg, L., Planatscher, H. et al. BowTieBuilder: modeling signal transduction pathways. BMC Syst Biol 3, 67 (2009). https://doi.org/10.1186/1752-0509-3-67
Supper, J., Spangenberg, L., Planatscher, H. et al. BowTieBuilder: modeling signal transduction pathways. BMC Syst Biol 3, 67 (2009). https://doi.org/10.1186/1752-0509-3-67

## Versions

- `v1`: Initial docker container
- `v2`: Pin BTB file version for reproducible docker builds.
4 changes: 4 additions & 0 deletions docker-wrappers/BowTieBuilder/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"imageName": "bowtiebuilder",
"architectures": ["linux/arm64", "linux/amd64"]
}
1 change: 1 addition & 0 deletions docker-wrappers/Cytoscape/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# https://github.com/cytoscape/docker-cytoscape-desktop/blob/173ab46b4b5e5c148113ad0c9960a6af3fc50432/py4cytoscape/Dockerfile
# by Kozo Nishida
FROM python:3.9.13
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

# Versions
ENV CYTOSCAPE_VERSION=3.9.1
Expand Down
4 changes: 2 additions & 2 deletions docker-wrappers/Cytoscape/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Cytoscape image

A Docker image for [Cytoscape](https://cytoscape.org/) that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/py4cytoscape).
A Docker image for [Cytoscape](https://cytoscape.org/) that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/py4cytoscape).
It was originally derived from the [`docker-cytoscape-desktop/py4cytoscape`](https://github.com/cytoscape/docker-cytoscape-desktop/blob/173ab46b4b5e5c148113ad0c9960a6af3fc50432/py4cytoscape/Dockerfile) image.

Thank you to Scooter Morris for help debugging problems running Cytoscape in Singularity.
Expand All @@ -9,7 +9,7 @@ Thank you to Scooter Morris for help debugging problems running Cytoscape in Sin

To create the Docker image run:
```
docker build -t reedcompbio/py4cytoscape -f Dockerfile .
docker build -t reed-compbio/py4cytoscape -f Dockerfile .
```
from this directory.

Expand Down
4 changes: 4 additions & 0 deletions docker-wrappers/Cytoscape/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"imageName": "py4cytoscape",
"architectures": ["linux/arm64", "linux/amd64"]
}
1 change: 1 addition & 0 deletions docker-wrappers/DOMINO/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# DOMINO wrapper
# https://github.com/Shamir-Lab/DOMINO
FROM python:3.7
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

RUN pip install domino-python==0.1.1

Expand Down
11 changes: 8 additions & 3 deletions docker-wrappers/DOMINO/README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
# DOMINO Docker image

A Docker image for [DOMINO](https://github.com/Shamir-Lab/DOMINO) that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/domino).
A Docker image for [DOMINO](https://github.com/Shamir-Lab/DOMINO) that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/domino).

DOMINO outputs multiple active modules, which SPRAS combines into a single pathway.
It is [non-deterministic](https://github.com/Shamir-Lab/DOMINO/issues/5) and cannot be made deterministic with a seed.

To create the Docker image run:
```
docker build -t reedcompbio/domino -f Dockerfile .
docker build -t reed-compbio/domino -f Dockerfile .
```
from this directory.

To inspect the installed Python packages:
```
winpty docker run reedcompbio/domino pip list
winpty docker run reed-compbio/domino pip list
```
The `winpty` prefix is only needed on Windows.

## TODO
- Resolve upstream ValueError with small inputs https://github.com/Shamir-Lab/DOMINO/issues/11
- Use cache or reuse slices files from previous runs on the same network
- Investigate why DOMINO does not build on amd64 after https://github.com/Reed-CompBio/spras/pull/235.

## Versions

- `v1`: Initial DOMINO container.
4 changes: 4 additions & 0 deletions docker-wrappers/DOMINO/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"imageName": "domino",
"architectures": ["linux/amd64"]
}
1 change: 1 addition & 0 deletions docker-wrappers/MEO/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Maximum Edge Orientation wrapper
# https://github.com/agitter/meo/
FROM amazoncorretto:8-alpine3.19
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

WORKDIR /meo
RUN export MEO_TAG=v1.1.0 && \
Expand Down
6 changes: 3 additions & 3 deletions docker-wrappers/MEO/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Maximum Edge Orientation Docker image

A Docker image for [Maximum Edge Orientation](https://github.com/agitter/meo/) that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/meo).
A Docker image for [Maximum Edge Orientation](https://github.com/agitter/meo/) that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/meo).
Only supports the Random orientation algorithm, not MINSAT or MAXCSP.

## Building the Docker image

To create the Docker image run:
```
docker build -t reedcompbio/meo -f Dockerfile .
docker build -t reed-compbio/meo -f Dockerfile .
```
from this directory.

Expand All @@ -24,5 +24,5 @@ The Docker wrapper can be tested with `pytest`.

## Versions

- `v1`: Initial version
- `v1`: Initial MEO container
- `v2`: Use `amazoncorretto` alpine base image
4 changes: 4 additions & 0 deletions docker-wrappers/MEO/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"imageName": "meo",
"architectures": ["linux/arm64", "linux/amd64"]
}
1 change: 1 addition & 0 deletions docker-wrappers/MinCostFlow/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#uses ubuntu as the base
FROM python:3.10.7
LABEL org.opencontainers.image.source=https://github.com/Reed-CompBio/spras

WORKDIR /MinCostFlow

Expand Down
14 changes: 9 additions & 5 deletions docker-wrappers/MinCostFlow/README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# MinCostFlow Docker image

A Docker image for [MinCostFlow](https://github.com/gitter-lab/min-cost-flow) that is available on [DockerHub](https://hub.docker.com/repository/docker/reedcompbio/mincostflow).
A Docker image for [MinCostFlow](https://github.com/gitter-lab/min-cost-flow) that is available on the [GitHub Container Registry](https://github.com/orgs/Reed-CompBio/packages/container/package/mincostflow).

To create the Docker image run:
```
docker build -t reedcompbio/mincostflow -f Dockerfile .
docker build -t reed-compbio/mincostflow -f Dockerfile .
```
from this directory.

To inspect the installed Python packages:
```
docker run reedcompbio/mincostflow pip list
docker run reed-compbio/mincostflow pip list
```
or inspect the Python script arguments:
```
docker run reedcompbio/mincostflow python /MinCostFlow/minCostFlow.py -h
docker run reed-compbio/mincostflow python /MinCostFlow/minCostFlow.py -h
```
Windows users may need to add the prefix `winpty` prefix before these commands.

Expand All @@ -30,9 +30,13 @@ The Docker wrapper can be tested with `pytest -k test_mcf.py` from the root of t

Alternatively, to run the Docker image directly, run the following command from the root of the `spras` repository
```
docker run -w /data --mount type=bind,source=/${PWD},target=/data reedcompbio/mincostflow python /MinCostFlow/minCostFlow.py --edges_file /data/test/MinCostFlow/input/graph1/edges.txt --sources_file /data/test/MinCostFlowinput/graph1/sources.txt --targets_file /data/test/MinCostFlowinput/graph1/targets.txt --flow 1 --output graph1 --capacity 1
docker run -w /data --mount type=bind,source=/${PWD},target=/data reed-compbio/mincostflow python /MinCostFlow/minCostFlow.py --edges_file /data/test/MinCostFlow/input/graph1/edges.txt --sources_file /data/test/MinCostFlowinput/graph1/sources.txt --targets_file /data/test/MinCostFlowinput/graph1/targets.txt --flow 1 --output graph1 --capacity 1
```

This will run MinCostFlow on the test input files and write the output files to the root of the `spras` repository.

Windows users may need to escape the absolute paths so that `/data` becomes `//data`, etc.

## Versions

- `v1`: Initial MinCostFlow docker container.
Loading
Loading