Skip to content

added tests #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 1 addition & 4 deletions app/.streamlit/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@ headless = true
[client]
toolbarMode = "viewer"

[deprecation]
showPyplotGlobalUse = false

[theme]
primaryColor="#1976d2"
primaryColor="#004dcf"
backgroundColor="#181a1e"
secondaryBackgroundColor="linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%)"
textColor="#fff"
Expand Down
27 changes: 21 additions & 6 deletions app/components/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from utils.species import *
import numpy as np
from state.StateManager import StateManager
from models.ErrorMessage import ErrorMessage, WarningMessage
from enums.ErrorMessage import ErrorMessage, WarningMessage


class Sidebar:
Expand Down Expand Up @@ -50,7 +50,7 @@ def show_preview(self, integrate=False):

def delete_experiment_btn(self):
with st.sidebar:
delete_btn = st.button(label="🗑️ Delete Experiment", use_container_width=True, key="btn_delete_adata")
delete_btn = st.button(label="🗑️ Delete Experiment", use_container_width=True, key="btn_delete_adata", type='primary')
if delete_btn:
self.state_manager.adata_state() \
.delete_record(adata_name=st.session_state.sb_adata_selection)
Expand Down Expand Up @@ -151,6 +151,21 @@ def add_experiment(self):
except Exception as e:
print("Error: ", e)
st.error(e)


def steps(self):
with st.sidebar:
with st.form("form_session_steps"):
current_adata_id = self.state_manager.adata_state().current.id
sessions = self.conn.query(schemas.Session).filter(schemas.Session.adata_id == current_adata_id).all()
if sessions:
session_names = [session.description for session in sessions]

steps = st.select_slider(label="Pipeline steps", options=session_names)
submit_btn = st.form_submit_button(label="🔧 Undo", use_container_width=True)

if submit_btn:
print("hi")


def download_adata(self):
Expand Down Expand Up @@ -286,8 +301,7 @@ def change_gene_format():
st.toggle(label="Ensembl ID", value=(format == "ensembl"), key="toggle_gene_format", on_change=change_gene_format)

except Exception as e:
st.error(e)
print("Error: ", e)
st.toast(e, icon="❌")


def show_version(self):
Expand Down Expand Up @@ -394,10 +408,11 @@ def set_adata():


self.download_adata()

self.add_experiment()

self.notes()
self.show_preview()
self.export_script()




74 changes: 12 additions & 62 deletions app/css/common.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,69 +10,19 @@



footer {visibility: hidden;}
.st-emotion-cache-1cypcdb {background: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); box-shadow: 1px 0 10px -2px #000;}
.st-emotion-cache-86cver {color: rgba(250, 250, 250, 0.6)}
.stButton button {
border-radius: 0.5rem;
background: #004dcf;
color: #fff;
border: 1px solid #004dcf;
padding: 0.25rem 0.75rem;
}

.stButton button:hover {
background: transparent;
color: #004dcf;
transition: all 0.1s ease-in-out;
border: 1px solid #004dcf;
}

.stButton button:focus {
border: 1px solid #004dcf;
color: #004dcf;
}

.stButton button:active {
border: 1px solid #004dcf;
color: #004dcf;
}

.stButton button:visited {
border: 1px solid #004dcf;
color: #004dcf;
}

.st-emotion-cache-1b9yna5:focus:not(:active) {
border: 1px solid #004dcf;
color: #004dcf;
}

.st-emotion-cache-1b9yna5:focus:not(:hover) {
border: 1px solid #004dcf;
color: #fff;
}

.st-emotion-cache-oooxyj:focus:not(:active) {
border: 1px solid #004dcf;
color: #004dcf;
}
footer {
visibility: hidden;
}

.st-emotion-cache-oooxyj:focus:not(:hover) {
border: 1px solid #004dcf;
color: #fff;
}
.st-emotion-cache-1cypcdb {
background: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); box-shadow: 1px 0 10px -2px #000;

.st-emotion-cache-1ts31n5:focus:not(:active) {
border: 1px solid #004dcf;
color: #004dcf;
}
}
.st-emotion-cache-86cver {
color: rgba(250, 250, 250, 0.6)
}

.st-emotion-cache-1ts31n5:focus:not(:hover) {
border: 1px solid #004dcf;
color: #fff;
}
.st-emotion-cache-z5fcl4 {
padding-top: 2rem;
}

.st-emotion-cache-z5fcl4 {
padding-top: 2rem;
}
6 changes: 3 additions & 3 deletions app/css/workspace.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
}
}

.st-emotion-cache-1qcb9zv, .st-emotion-cache-1ts31n5 {
.st-emotion-cache-1h7cibc {
width: 100%;
font-size: 48px;
font-weight: 800;
Expand All @@ -48,7 +48,7 @@
}


.st-emotion-cache-1qcb9zv:hover, .st-emotion-cache-1ts31n5:hover {
.st-emotion-cache-1h7cibc:hover {

background-position: 10% 0;
moz-transition: all .8s ease-in-out;
Expand All @@ -61,7 +61,7 @@
color: #fff;
}

.st-emotion-cache-1qcb9zv:focus, .st-emotion-cache-1ts31n5:focus {
.st-emotion-cache-1h7cibc:focus {
border: rgba(255,255,255,0.8) 2px solid;
}

Expand Down
13 changes: 11 additions & 2 deletions app/database/schemas/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ class Workspaces(Base):
data_dir = Column(String, nullable=False, unique=True)
created = Column(TIMESTAMP(timezone=True), nullable=False, server_default=text('now()'))
description = Column(String, nullable=True)
cache_file = Column(String, nullable=True)

class Adata(Base):
__tablename__ = "adata"
Expand All @@ -31,4 +30,14 @@ class Scripts(Base):
id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)
script = Column(String, nullable=False)
language = Column(String, nullable=False)
created = Column(TIMESTAMP(timezone=True), nullable=False, server_default=text('now()'))
created = Column(TIMESTAMP(timezone=True), nullable=False, server_default=text('now()'))

class Session(Base):
__tablename__ = "sessions"

id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)
adata_id = Column(Integer, ForeignKey("adata.id", ondelete="CASCADE"), nullable=False)
session_id = Column(String, nullable=False)
filename = Column(String, nullable=False)
description = Column(String, nullable=True)
created = Column(TIMESTAMP(timezone=True), nullable=False, server_default=text('now()'))
1 change: 0 additions & 1 deletion app/models/ErrorMessage.py → app/enums/ErrorMessage.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,3 @@ class ErrorMessage(Enum):

class WarningMessage(Enum):
DATASET_ALREADY_EXISTS = "Dataset already exists in workspace, using original."

6 changes: 6 additions & 0 deletions app/enums/Language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from enum import Enum

class Language(Enum):
python = "python"
R = "R"
ALL_SUPPORTED = ["python", "R"]
5 changes: 0 additions & 5 deletions app/models/ScriptModel.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict, ValidationError
from datetime import date
from enum import Enum

class ScriptModel(BaseModel):
adata_id: int
Expand All @@ -10,7 +9,3 @@ class ScriptModel(BaseModel):
language: str
created: Optional[date]

class Language(Enum):
python = "python"
R = "R"
ALL_SUPPORTED = ["python", "R"]
11 changes: 11 additions & 0 deletions app/models/SessionModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict, ValidationError
from datetime import date

class SessionModel(BaseModel):
id: Optional[int] #Uses autoincrement when not included
adata_id: int
session_id: str
filename: str
description: Optional[str]
created: Optional[date]
2 changes: 1 addition & 1 deletion app/pages/11_Plotly_3D.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def change_embeddings():
break
st.selectbox(label="Embedding colors", options=adata.obs_keys(), key="plotly_embedding_color", index=cluster_color_index)
st.slider(label="Point size", min_value=0.5, max_value=5.0, step=0.1, value=1.0, key="plotly_point_size")
st.button(label="Plot chart", use_container_width=True, on_click=change_embeddings)
st.button(label="Plot chart", use_container_width=True, on_click=change_embeddings, type='primary')


if 'plotly_df' in st.session_state:
Expand Down
42 changes: 27 additions & 15 deletions app/pages/1_Upload.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from pydantic import ValidationError
import streamlit as st
import scanpy as sc
import squidpy as sq
import pickle
import os
from models.AdataModel import AdataModel
from models.WorkspaceModel import WorkspaceModel
Expand All @@ -11,8 +9,6 @@
from database.schemas import schemas
from state.AdataState import AdataState
from state.StateManager import StateManager
from state.ScriptState import ScriptState
from utils.session_cache import load_data_from_cache, cache_data_to_session
import loompy as lmp
import glob
from components.sidebar import Sidebar
Expand Down Expand Up @@ -40,6 +36,7 @@ class Upload:
"""
def __init__(self):
self.conn: Session = SessionLocal()
self.state_manager = StateManager()
self.upload_file()
self.scanpy_dataset()
self.external_sources()
Expand Down Expand Up @@ -279,33 +276,48 @@ def var_unique(self):


def show_anndata(self, adata, f = None, filename = ""):
#upload raw adata
# If there are already a file in this location. If so, don't overwrite.
if not os.path.isfile(os.path.join(os.getenv('WORKDIR'), 'adata', f'{filename}.h5ad')):
"""upload raw adata. If there are already a file in this location. If so, don't overwrite. """

if filename == "":
filename = f.name.split(".")[0]

filename = filename.replace(" ", "_") #files must not contain spaces
if filename == "":
filename = f.name.split(".")[0]
filename = filename.replace(" ", "_") # files must not contain spaces
filepath = os.path.join(os.getenv('WORKDIR'), 'adata', f'{filename}.h5ad')

if not os.path.isfile(filepath):

sc.write(filename=os.path.join(os.getenv('WORKDIR'), 'uploads', f'{filename}.h5ad'), adata=adata)

adata.raw = adata
active_adata = AdataModel(
work_id = st.session_state.current_workspace.id,
adata_name=f"{filename}", adata=adata,
filename=os.path.join(os.getenv('WORKDIR'), 'adata', f'{filename}.h5ad')
filename=filepath
)
st.session_state["adata_state"] = AdataState(active=active_adata)

self.state_manager \
.add_adata(adata) \
.add_description("Raw") \
.save_session()

st.toast("Successfully uploaded file", icon='✅')

else:
st.warning("A dataset with the same name already exists, will not overwrite.")

existing_adata = sc.read_h5ad(filename=filepath)

active_adata = AdataModel(
work_id = st.session_state.current_workspace.id,
adata_name=f"{filename}", adata=existing_adata,
filename=filepath
)

st.session_state["adata_state"] = AdataState(active=active_adata)

self.show_sidebar_preview(f)




def show_sidebar_preview(self, file):

with st.sidebar:
Expand Down
Loading