Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
526be3e
Base front end page
juanNH Aug 1, 2025
07ddcff
Add differential expression experiment model and API
TheSinnerAR Aug 3, 2025
42ff665
Add differential expression service, tasks, and migrations
TheSinnerAR Aug 8, 2025
a8f7240
Add JSON results storage for differential expression
TheSinnerAR Aug 8, 2025
73e3151
save 8-8
juanNH Aug 8, 2025
b68181d
Refactor differential expression models and API
TheSinnerAR Aug 14, 2025
1a754ba
Add 'top' parameter to differential expression experiments
TheSinnerAR Aug 14, 2025
cb5b30d
Add R 4.4.2 and limma to Dockerfiles, update docs
TheSinnerAR Aug 16, 2025
18860f9
Add endpoint to stop differential expression experiment
TheSinnerAR Aug 17, 2025
eb5e89c
Merge branch 'fix/prevStateBug' into feature/differential-expression-…
juanNH Aug 18, 2025
da50ff6
form
juanNH Sep 2, 2025
37c08b4
fix list_of_samples
juanNH Sep 2, 2025
6cc27f5
base table + fix form
juanNH Sep 3, 2025
ab8341c
Implemented CGDS Dataset clinical attributes
Genarito Sep 8, 2025
a6390c0
save-9-9
juanNH Sep 9, 2025
2dab121
Merge branch 'feature/differential-expression-experiments' of https:/…
juanNH Sep 9, 2025
0ec3439
fix select from save-9-9
juanNH Sep 9, 2025
b27c145
Add list serializer for differential expression experiments
TheSinnerAR Sep 15, 2025
ee95b9a
Add websocket updates for differential expression experiments
TheSinnerAR Sep 18, 2025
61c0056
Refactor significant genes endpoint into results view
TheSinnerAR Oct 2, 2025
f7f6adb
Add tool selection to DifferentialExpressionExperiment
TheSinnerAR Oct 2, 2025
2aa97eb
Add tests and endpoints for experiment update and delete
TheSinnerAR Oct 11, 2025
fe6d38c
diferential expression page
juanNH Oct 15, 2025
542a5c7
Merge branch 'v5.0.0' into feature/differential-expression-experiments
juanNH Oct 23, 2025
9afc0a8
diffExpressionBase
juanNH Oct 24, 2025
6f74ae8
Changed deprecated prop
Genarito Nov 8, 2025
634cafb
Refactoring, fixed types and typos
Genarito Nov 8, 2025
a6733d2
Fixed bug with serializer
Genarito Nov 8, 2025
09d9dc2
Removed checking optional description field to disabled submitting a …
Genarito Nov 8, 2025
020410a
Removed unused packages
Genarito Nov 8, 2025
396c4c5
Upgraded urllib3 to prevent "SSL: WRONG_VERSION_NUMBER ON PYTHON REQU…
Genarito Nov 10, 2025
5cb81a7
Normalize mRNA dataset column names to match SAMPLE_IDs
TheSinnerAR Nov 21, 2025
b7aa7f9
push to check bugs in serializer
juanNH Nov 28, 2025
80dc468
Add volcano plot and results download endpoints
TheSinnerAR Dec 25, 2025
72ebfaf
Add volcano plot serializer and refactor volcano data endpoint
TheSinnerAR Dec 25, 2025
5bbc378
Differential expression detail
juanNH Jan 5, 2026
0a55eab
Update Dockerfiles and improve view error handling
TheSinnerAR Jan 8, 2026
c7ad3fa
Fixs and update texts
juanNH Jan 14, 2026
c0a53a9
Show thresholds
juanNH Jan 14, 2026
2ff6c01
Refactor differential expression sources to use shared models
TheSinnerAR Jan 14, 2026
1137373
Merge branch 'feature/differential-expression-experiments' of https:/…
TheSinnerAR Jan 14, 2026
43812c7
fixs pr updates
juanNH Jan 15, 2026
c68326d
Merge branch 'feature/differential-expression-experiments' of https:/…
juanNH Jan 15, 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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ src/api_service/experiments/venv
docker-compose.yml
src/secretkey.txt
docker-compose.mauri_dev.yml
venv
venv
.DS_Store
64 changes: 40 additions & 24 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,47 +1,64 @@
FROM python:3.12-slim-bookworm

# Docker Files Vars
ARG LISTEN_PORT 8000
ARG LISTEN_IP "0.0.0.0"
ARG LISTEN_PORT=8000
ARG LISTEN_IP="0.0.0.0"

# Default values for deploying with multiomix image
ENV LISTEN_PORT $LISTEN_PORT
ENV LISTEN_IP $LISTEN_IP
ENV DJANGO_SETTINGS_MODULE "multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS 500
ENV TABLE_PAGE_SIZE 10
ENV LISTEN_PORT=$LISTEN_PORT
ENV LISTEN_IP=$LISTEN_IP
ENV DJANGO_SETTINGS_MODULE="multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS=500
ENV TABLE_PAGE_SIZE=10

# Modulector connection parameters
ENV MODULECTOR_HOST "127.0.0.1"
ENV MODULECTOR_PORT "8001"
ENV MODULECTOR_HOST="127.0.0.1"
ENV MODULECTOR_PORT="8001"

# BioAPI connection parameters
ENV BIOAPI_HOST "127.0.0.1"
ENV BIOAPI_PORT "8002"
ENV BIOAPI_HOST="127.0.0.1"
ENV BIOAPI_PORT="8002"

# PostgreSQL DB connection parameters
ENV POSTGRES_USERNAME "multiomics"
ENV POSTGRES_PASSWORD "multiomics"
ENV POSTGRES_HOST "db"
ENV POSTGRES_PORT 5432
ENV POSTGRES_DB "multiomics"
ENV POSTGRES_USERNAME="multiomics"
ENV POSTGRES_PASSWORD="multiomics"
ENV POSTGRES_HOST="db"
ENV POSTGRES_PORT=5432
ENV POSTGRES_DB="multiomics"

# Mongo DB connection parameters
ENV MONGO_USERNAME "multiomics"
ENV MONGO_PASSWORD "multiomics"
ENV MONGO_HOST "mongo"
ENV MONGO_PORT 27017
ENV MONGO_DB "multiomics"
ENV MONGO_USERNAME="multiomics"
ENV MONGO_PASSWORD="multiomics"
ENV MONGO_HOST="mongo"
ENV MONGO_PORT=27017
ENV MONGO_DB="multiomics"

# Redis
ENV REDIS_HOST "redis"
ENV REDIS_PORT 6379
ENV REDIS_HOST="redis"
ENV REDIS_PORT=6379

# Installs system dependencies and Node.js
RUN apt-get update && apt-get install -y python3-pip curl libcurl4-openssl-dev libssl-dev libxml2-dev \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && mkdir /config \
&& mkdir /src

# Install R 4.4.2 from CRAN (Debian bookworm) and system dependencies
RUN set -eux; \
echo "deb http://deb.debian.org/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list; \
printf 'APT::Default-Release "%s";\n' "bookworm" > /etc/apt/apt.conf.d/00default-release; \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/90no-recommends; \
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 50\n' > /etc/apt/preferences.d/99pin-unstable; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates curl gnupg build-essential gfortran libblas-dev liblapack-dev git \
libssl-dev libcurl4-openssl-dev libxml2-dev; \
apt-get install -y \
r-base=4.2.2.20221110-2 r-base-dev=4.2.2.20221110-2 r-recommended=4.2.2.20221110-2; \
rm -rf /var/lib/apt/lists/*

# Install Bioconductor limma (stats and base come with R)
RUN R -q -e 'options(repos=c(CRAN="https://cloud.r-project.org")); install.packages("BiocManager"); BiocManager::install(version="3.16", ask=FALSE); BiocManager::install("limma", ask=FALSE, update=FALSE)'

# Installs Python dependencies and compiles the frontend
ADD config/requirements.txt /config/
WORKDIR /src
Expand All @@ -58,4 +75,3 @@ HEALTHCHECK --interval=5m --timeout=30s CMD ["/bin/bash", "-c", "/src/tools/chec
ENTRYPOINT ["/bin/bash", "-c", "/src/entrypoint.sh"]

EXPOSE $LISTEN_PORT

63 changes: 40 additions & 23 deletions Dockerfile-celery
Original file line number Diff line number Diff line change
@@ -1,47 +1,64 @@
FROM python:3.12-slim-bookworm

# Docker Files Vars
ARG LISTEN_PORT 8000
ARG LISTEN_IP "0.0.0.0"
ARG LISTEN_PORT=8000
ARG LISTEN_IP="0.0.0.0"

# Default values for deploying with multiomix image
ENV LISTEN_PORT $LISTEN_PORT
ENV LISTEN_IP $LISTEN_IP
ENV DJANGO_SETTINGS_MODULE "multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS 500
ENV TABLE_PAGE_SIZE 10
ENV LISTEN_PORT=$LISTEN_PORT
ENV LISTEN_IP=$LISTEN_IP
ENV DJANGO_SETTINGS_MODULE="multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS=500
ENV TABLE_PAGE_SIZE=10

# Modulector connection parameters
ENV MODULECTOR_HOST "127.0.0.1"
ENV MODULECTOR_PORT "8001"
ENV MODULECTOR_HOST="127.0.0.1"
ENV MODULECTOR_PORT="8001"

# BioAPI connection parameters
ENV BIOAPI_HOST "127.0.0.1"
ENV BIOAPI_PORT "8002"
ENV BIOAPI_HOST="127.0.0.1"
ENV BIOAPI_PORT="8002"

# PostgreSQL DB connection parameters
ENV POSTGRES_USERNAME "multiomics"
ENV POSTGRES_PASSWORD "multiomics"
ENV POSTGRES_HOST "db"
ENV POSTGRES_PORT 5432
ENV POSTGRES_DB "multiomics"
ENV POSTGRES_USERNAME="multiomics"
ENV POSTGRES_PASSWORD="multiomics"
ENV POSTGRES_HOST="db"
ENV POSTGRES_PORT=5432
ENV POSTGRES_DB="multiomics"

# Mongo DB connection parameters
ENV MONGO_USERNAME "multiomics"
ENV MONGO_PASSWORD "multiomics"
ENV MONGO_HOST "mongo"
ENV MONGO_PORT 27017
ENV MONGO_DB "multiomics"
ENV MONGO_USERNAME="multiomics"
ENV MONGO_PASSWORD="multiomics"
ENV MONGO_HOST="mongo"
ENV MONGO_PORT=27017
ENV MONGO_DB="multiomics"

# Redis
ENV REDIS_HOST "redis"
ENV REDIS_PORT 6379
ENV REDIS_HOST="redis"
ENV REDIS_PORT=6379

# Installs system dependencies
RUN apt-get update && apt-get install -y python3-pip curl libcurl4-openssl-dev libssl-dev libxml2-dev \
&& mkdir /config \
&& mkdir /src

# Install R 4.4.2 from CRAN (Debian bookworm) and system dependencies
RUN set -eux; \
echo "deb http://deb.debian.org/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list; \
printf 'APT::Default-Release "%s";\n' "bookworm" > /etc/apt/apt.conf.d/00default-release; \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/90no-recommends; \
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 50\n' > /etc/apt/preferences.d/99pin-unstable; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates curl gnupg build-essential gfortran libblas-dev liblapack-dev git \
libssl-dev libcurl4-openssl-dev libxml2-dev; \
apt-get install -y \
r-base=4.2.2.20221110-2 r-base-dev=4.2.2.20221110-2 r-recommended=4.2.2.20221110-2; \
rm -rf /var/lib/apt/lists/*

# Install Bioconductor limma (stats and base come with R)
RUN R -q -e 'options(repos=c(CRAN="https://cloud.r-project.org")); install.packages("BiocManager"); BiocManager::install(version="3.16", ask=FALSE); BiocManager::install("limma", ask=FALSE, update=FALSE)'

# Installs Python dependencies
ADD config/requirements_celery.txt /config/requirements.txt
RUN pip install --upgrade pip && pip3 install -r /config/requirements.txt
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<img align="right" src="src/frontend/static/frontend/img/logo-readme.png" alt="Multiomix logo">
<img style="float: right" src="src/frontend/static/frontend/img/logo-readme.png" alt="Multiomix logo">

# Multiomix

Expand All @@ -15,6 +15,7 @@ This document is focused on the **development** of the system. If you are lookin
- Node JS >= `20.x` (tested version: `20.x`)
- [Modulector][modulector] `2.2.0`
- [BioAPI][bioapi] `1.2.1`
- R `4.4.2` (required for `differential-expression`)


## Installation
Expand Down Expand Up @@ -66,6 +67,7 @@ Every time you want to work with Multiomix, you need to follow the below steps:
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q stats`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q inference`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q sync_datasets`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q differential_expression`
1. If you want to check Task in the GUI you can run [Flower](https://flower.readthedocs.io/en/latest/index.html) `python3 -m celery -A multiomics_intermediate flower`

**NOTE:** maybe in Windows is needed to add `--pool=solo` to the previous commands. Example: `python3 -m celery -A multiomics_intermediate worker -l info -Q correlation_analysis --concurrency 1 --pool=solo`
Expand Down
2 changes: 2 additions & 0 deletions config/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,5 @@ scipy==1.13.0
statsmodels==0.14.2
xlrd==2.0.1
openpyxl==3.1.5
rpy2==3.6.1
urllib3==2.5.0
2 changes: 2 additions & 0 deletions config/requirements_celery.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,5 @@ scipy==1.13.0
statsmodels==0.14.2
xlrd==2.0.1
openpyxl==3.1.5
rpy2==3.6.1
urllib3==2.5.0
16 changes: 16 additions & 0 deletions docker-compose_dist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,21 @@ services:
# REDIS_HOST: 'redis'
# REDIS_PORT: 6379

# Celery worker for differential expression
differential-expression-worker:
image: omicsdatascience/multiomix:5.6.0-celery
restart: 'always'
depends_on:
- db
- mongo
volumes:
- media_data:/src/media
environment:
<<: *common-variables
QUEUE_NAME: 'differential_expression' # This MUST NOT be changed
CONCURRENCY: 2
# PostgreSQL, Mongo y Redis usan los valores por defecto del resto de servicios

# Django backend service
multiomix:
image: omicsdatascience/multiomix:5.6.0
Expand Down Expand Up @@ -290,6 +305,7 @@ services:
- stats-worker
- inference-worker
- sync-datasets-worker
- differential-expression-worker

volumes:
mongo_data:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# Generated by Django 4.2.19 on 2026-01-14 21:38

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
(
"datasets_synchronization",
"0036_alter_cgdsstudy_clinical_patient_dataset_and_more",
),
("genes", "0002_auto_20210114_2331"),
("user_files", "0015_alter_userfile_options"),
("api_service", "0061_alter_experiment_shared_users"),
]

operations = [
migrations.AlterField(
model_name="experiment",
name="clinical_source",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="experiments_as_clinical_source",
to="api_service.experimentclinicalsource",
),
),
migrations.AlterField(
model_name="experiment",
name="gem_source",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="experiments_as_gem_source",
to="api_service.experimentsource",
),
),
migrations.AlterField(
model_name="experiment",
name="mRNA_source",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="experiments_as_mrna_source",
to="api_service.experimentsource",
),
),
migrations.AlterField(
model_name="experimentclinicalsource",
name="extra_cgds_dataset",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="experiment_clinical_sources_as_extra_cgds_dataset",
to="datasets_synchronization.cgdsdataset",
),
),
migrations.AlterField(
model_name="experimentsource",
name="cgds_dataset",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="experiment_sources_as_cgds_dataset",
to="datasets_synchronization.cgdsdataset",
),
),
migrations.AlterField(
model_name="experimentsource",
name="user_file",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="experiment_sources_as_user_file",
to="user_files.userfile",
),
),
migrations.AlterField(
model_name="genecnacombination",
name="experiment",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(class)ss",
to="api_service.experiment",
),
),
migrations.AlterField(
model_name="genecnacombination",
name="gene",
field=models.ForeignKey(
db_column="gene",
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="%(class)ss_as_gene",
to="genes.gene",
),
),
migrations.AlterField(
model_name="genemethylationcombination",
name="experiment",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(class)ss",
to="api_service.experiment",
),
),
migrations.AlterField(
model_name="genemethylationcombination",
name="gene",
field=models.ForeignKey(
db_column="gene",
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="%(class)ss_as_gene",
to="genes.gene",
),
),
migrations.AlterField(
model_name="genemirnacombination",
name="experiment",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(class)ss",
to="api_service.experiment",
),
),
migrations.AlterField(
model_name="genemirnacombination",
name="gene",
field=models.ForeignKey(
db_column="gene",
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="%(class)ss_as_gene",
to="genes.gene",
),
),
]
Loading