Commit 2e6e7265 authored by Yakubov, Sergey's avatar Yakubov, Sergey
Browse files

add gp-sans app

parent b1265a3e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
from .main import main

__all__ = [
    "main",
]
+105 −0
Original line number Diff line number Diff line
import os
import numpy
import logging

from trame.app import get_server
from trame.decorators import TrameApp, change
from trame.ui.vuetify import SinglePageWithDrawerLayout
from trame.widgets import vuetify, plotly

from .ui import (
    Directory,
    FileSelector,
    FigureControl,
)

from .visualization import Visualization
from .utilities import galaxy


logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# ---------------------------------------------------------
# Engine class
# ---------------------------------------------------------


@TrameApp()
class GpSans:
    def __init__(self, server=None, data=None):
        self.server = get_server(server, client_type="vue2")
        self._viz = Visualization(self.server)
        self._active_directory = None

        # CLI
        self.server.cli.add_argument(
            "--data",
            help="Path to browse",
            dest="data",
            default=".",
        )
        args, _ = self.server.cli.parse_known_args()
        if data is None:
            data = args.data

        self.state.user_file = None
        self.state.staff_file = None
        self.server.state.ipts = None
        self.state.data = None
        self.ui = self._build_ui()

    @property
    def state(self):
        return self.server.state

    @property
    def ctrl(self):
        return self.server.controller

    def run(self):
        user_file = self.server.state.user_file
        staff_file = self.server.state.staff_file
        ipts = self.server.state.ipts
        data = galaxy.run_gpsans(user_file,staff_file,ipts)
        self._viz.create_gpsans_fig(data)
        self.server.state.figure_ready = True

    def _build_ui(self):
        self.state.trame__title = "gp-sans"
        with SinglePageWithDrawerLayout(self.server) as layout:
            with layout.icon:
                vuetify.VIcon("mdi-bullseye")

            with layout.title as title:
                title.set_text("GP-SANS")
                title.classes = "font-weight-medium ml-0 pl-0"

            with layout.drawer as drawer:
                drawer.width = 350
                vuetify.VFileInput(
                    label="User Input File",
                    v_model=("user_file", None),
                )
                vuetify.VFileInput(
                    label="Staff Input File",
                    v_model=("staff_file", None),
                )
                vuetify.VTextField(
                    label="IPTS Number",
                    v_model=("ipts", None),
                )
                vuetify.VBtn("Run in Galaxy",icon=False, click=self.run)

            with layout.content:
                with vuetify.VContainer(
                    fluid=True,
                    classes="pa-0 fill-height",
                ):
                    self.ctrl.update_d11 = plotly.Figure(
                        display_mode_bar=("false",),
                        v_show=("figure_ready", False),
                    ).update

            return layout
+10 −0
Original line number Diff line number Diff line
from .core import GpSans


def main(server=None, **kwargs):
    app = GpSans(server)
    app.server.start(**kwargs)


if __name__ == "__main__":
    main()
+180 −0
Original line number Diff line number Diff line
from trame.widgets import html, vuetify

SUPPORTED_DEVICES = ["D11+","GP-SANS"]


class AbstractCard(vuetify.VCard):
    def __init__(self, key, icon, title):
        super().__init__(
            # classes="mb-3",
            tile=True,
        )
        with self:
            with vuetify.VCardTitle(
                style="user-select: none;",
                hide_details=True,
                dense=True,
                dark=True,
            ) as self._title:
                vuetify.VIcon(icon, classes="mr-1", color="grey darken-3")
                html.Div(title)
            vuetify.VDivider()
            self._content = vuetify.VCardText(classes="pa-1")
class DirectoryDialog(vuetify.VDialog):
    def __init__(self, select_directory_fn):
        super().__init__(
            v_model=("directory_dialog", False),
            persistent=True,
        )
        with self:
            with vuetify.Template(
                v_slot_activator="{ on, attrs }",
            ):
                with vuetify.VBtn(
                    small=True,
                    color="primary",
                    dark=True,
                    icon=True,
                    v_bind="attrs",
                    v_on="on",
                ):
                    vuetify.VIcon("mdi-folder")
            with vuetify.VCard(
                classes="ma-1 rounded elevation-8", style="min-width: 50vw;"
            ):
                with vuetify.VCardTitle(
                    classes="grey lighten-1 px-2 py-0 grey--text text--darken-3",
                    style="user-select: none;",
                    hide_details=True,
                    dense=True,
                ):
                    html.Div("Select History")
                with vuetify.VCardText(
                    classes="pa-1", style="height: 50vh; overflow: auto;"
                ):
                    vuetify.VTreeview(
                        classes="mb-1",
                        dense=True,
                        hide_details=True,
                        v_model=("dirtree", []),
                        items=("dirs", []),
                        item_text="name",
                        activatable=True,
                        item_key="id",
                        open_on_click=True,
                        return_object=True,
                        update_active=(
                            select_directory_fn,
                            "[$event]",
                        ),
                    )
                with vuetify.VCardActions(
                    classes="py-1",
                    hide_details=True,
                    dense=True,
                ):
                    vuetify.VSpacer()
                    with vuetify.VBtn(
                        icon=True,
                        dense=True,
                        small=True,
                        tile=True,
                        color="error",
                        click="directory_dialog = false",
                    ):
                        vuetify.VIcon("mdi-cancel")
                    with vuetify.VBtn(
                        icon=True,
                        dense=True,
                        small=True,
                        tile=True,
                        color="success",
                        click="directory_dialog = false",
                    ):
                        vuetify.VIcon("mdi-check")


class Directory(AbstractCard):
    def __init__(self, select_directory_fn):
        super().__init__("directory", "mdi-folder-eye-outline", "Galaxy History")
        with self._content:
            with vuetify.VRow(classes="px-0 py-1", align_self="center"):
                with vuetify.VCol(cols="1", align_self="center"):
                    DirectoryDialog(select_directory_fn)
                with vuetify.VCol(cols="11"):
                    vuetify.VTextField(
                        classes="mb-1",
                        dense=True,
                        hide_details=True,
                        readonly=True,
                        outlined=True,
                        disabled=True,
                        type="string",
                        v_model=("directory_label", None),
                    )


class FileSelector(AbstractCard):
    def __init__(self, file_selection):
        super().__init__("file", "mdi-application-outline", "Browse")
        with self._content as content:
            content.classes = "px-0 mx-0"
            content.style = "max-height: min(12rem, 40vh); overflow: auto;"
            with vuetify.VList(
                dense=True,
                hide_details=True,
            ):
                with vuetify.VListItemGroup(
                    v_model=("file_selected", None),
                    color="primary",
                ):
                    with vuetify.VListItem(
                        v_for="(item, index) in files",
                        key="index",
                        dense=True,
                        hide_details=True,
                        click=(file_selection, "[item]"),
                        color="primary",
                        style="min-height:10px",
                    ):
                        with vuetify.VListItemIcon(classes="ma-0 mr-1"):
                            vuetify.VIcon("mdi-file", x_small=True)
                        with vuetify.VListItemContent(classes="pa-0"):
                            vuetify.VListItemTitle("{{item['name']}}")


class FigureControl(AbstractCard):
    def __init__(self):
        super().__init__("viz", "mdi-image-multiple-outline", "Image")
        with self._content:
            with vuetify.VRow(classes="pa-0 pt-1", dense=True, hide_details=True):
                with vuetify.VCol(cols="6"):
                    vuetify.VSelect(
                        v_model=("selectedRepresentation", "Heatmap"),
                        items=("representations", ["Heatmap", "Contours", "Combined"]),
                        label="Representation",
                        dense=True,
                        hide_details=True,
                        outlined=True,
                    )
                with vuetify.VCol(cols="6"):
                    vuetify.VSelect(
                        v_model=("selectedColor", "spectral"),
                        items=(
                            "colors",
                            ["spectral", "rdbu", "gray", "blackbody", "sunset"],
                        ),
                        label="Colors",
                        dense=True,
                        hide_details=True,
                        outlined=True,
                    )
            with vuetify.VRow(classes="pa-0 pt-1", dense=True, hide_details=True):
                with vuetify.VCol(cols="6"):
                    vuetify.VCheckbox(
                        v_model=("contour_labels", True),
                        label="Contour labels",
                        dense=True,
                        hide_details=True,
                    )
+0 −0

Empty file added.

Loading