egenn commited on
Commit
977cc7d
1 Parent(s): 356a8ff
Dockerfile CHANGED
@@ -4,13 +4,21 @@ WORKDIR /code
4
 
5
  # Install stable packages from CRAN
6
  RUN install2.r --error \
7
- ggExtra \
8
- shiny
 
 
 
 
 
 
9
 
10
  # Install development packages from GitHub
11
  RUN installGithub.r \
12
  rstudio/bslib \
13
- rstudio/httpuv
 
 
14
 
15
  COPY . .
16
 
 
4
 
5
  # Install stable packages from CRAN
6
  RUN install2.r --error \
7
+ shiny \
8
+ htmltools \
9
+ plotly \
10
+ bsicons \
11
+ sass \
12
+ shinyWidgets \
13
+ shinybusy \
14
+ listviewer
15
 
16
  # Install development packages from GitHub
17
  RUN installGithub.r \
18
  rstudio/bslib \
19
+ rstudio/httpuv \
20
+ egenn/rtemis \
21
+ egenn/rtemisbio
22
 
23
  COPY . .
24
 
app.R CHANGED
@@ -1,58 +1,527 @@
 
 
 
 
 
 
 
 
1
  library(shiny)
2
  library(bslib)
3
- library(dplyr)
4
- library(ggplot2)
5
-
6
- df <- readr::read_csv("penguins.csv")
7
- # Find subset of columns that are suitable for scatter plot
8
- df_num <- df |> select(where(is.numeric), -Year)
9
-
10
- ui <- page_sidebar(
11
- theme = bs_theme(bootswatch = "minty"),
12
- title = "Penguins explorer",
13
- sidebar = sidebar(
14
- varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"),
15
- varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"),
16
- checkboxGroupInput("species", "Filter by species",
17
- choices = unique(df$Species), selected = unique(df$Species)
18
- ),
19
- hr(), # Add a horizontal rule
20
- checkboxInput("by_species", "Show species", TRUE),
21
- checkboxInput("show_margins", "Show marginal plots", TRUE),
22
- checkboxInput("smooth", "Add smoother"),
23
- ),
24
- plotOutput("scatter")
25
- )
26
-
27
- server <- function(input, output, session) {
28
- subsetted <- reactive({
29
- req(input$species)
30
- df |> filter(Species %in% input$species)
31
- })
32
-
33
- output$scatter <- renderPlot(
34
- {
35
- p <- ggplot(subsetted(), aes(!!input$xvar, !!input$yvar)) +
36
- theme_light() +
37
- list(
38
- theme(legend.position = "bottom"),
39
- if (input$by_species) aes(color = Species),
40
- geom_point(),
41
- if (input$smooth) geom_smooth()
42
- )
43
-
44
- if (input$show_margins) {
45
- margin_type <- if (input$by_species) "density" else "histogram"
46
- p <- p |> ggExtra::ggMarginal(
47
- type = margin_type, margins = "both",
48
- size = 8, groupColour = input$by_species, groupFill = input$by_species
49
- )
50
- }
51
-
52
- p
53
- },
54
- res = 100
55
  )
56
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- shinyApp(ui, server)
 
1
+ # rtemisseq
2
+ # ::rtemislive::
3
+ # 2024 EDG rtemis.org
4
+
5
+ # shiny::runApp("./")
6
+ # Setup
7
+ library(rtemis)
8
+ library(rtemisbio)
9
  library(shiny)
10
  library(bslib)
11
+ library(htmltools)
12
+ library(plotly)
13
+ source("globals.R")
14
+ source("data.R")
15
+
16
+ # Colors
17
+ primary <- "#72CDF4"
18
+ info <- helpcol <- "#FEB2E0"
19
+ success <- "#B4DC55"
20
+
21
+ #' Create protein visualization shinylive app
22
+ #'
23
+ #' Visualize protein amino acid sequence and annotations using
24
+ #' `dplot3_protein()`
25
+ #'
26
+ #' Set verbosity to 1 to monitor app progress
27
+ #'
28
+ #' @param default_theme Character: "dark" or "light" theme
29
+ #' @param verbosity Integer: 0 = silent, 1 = verbose
30
+ #'
31
+ #' @author EDG
32
+ #' @export
33
+ #' @return A shiny app that can be converted to a shinylive app
34
+ rtemisseq_version <- "0.2.6"
35
+ seqvizlive <- function(
36
+ default_theme = "dark",
37
+ protein_plotly_height = "900px",
38
+ jsonedit_height = "900px",
39
+ verbosity = 0) {
40
+ # Logo
41
+ logo <- base64enc::dataURI(
42
+ file = "./www/rtemisbio_gray.png", mime = "image/png"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  )
44
+ # Version
45
+ platform <- sessionInfo()[["platform"]]
46
+ svl <- paste0(
47
+ "rtemisseq v.", rtemisseq_version,
48
+ " | ", "rtemis v.0.97.3", utils::packageVersion("rtemis"), # doesn't work in shinylive
49
+ " | ", "rtemisbio v.", utils::packageVersion("rtemisbio"),
50
+ " | R v.", version$major, ".", version$minor,
51
+ " | running on ", platform
52
+ )
53
+
54
+ # Shinylive info
55
+ shinylive_info <- if (substr(platform, 1, 4) == "wasm") {
56
+ paste0(
57
+ "<br><br>This application has been compiled to ",
58
+ as.character(a("WebAssembly", href = "https://webassembly.org/", target = "_blank")),
59
+ " using ",
60
+ as.character(a("shinylive", href = "https://posit-dev.github.io/r-shinylive/", target = "_blank")),
61
+ "<br>and is best viewed with the latest version of Chrome."
62
+ )
63
+ } else {
64
+ NULL
65
+ }
66
+
67
+ # UI page_navbar ----
68
+ ui <- function(request) {
69
+ bslib::page_navbar(
70
+ # Title ----
71
+ title = list(
72
+ logo = a(
73
+ img(
74
+ src = logo,
75
+ width = "140px",
76
+ height = "auto",
77
+ alt = "rtemisbio"
78
+ ),
79
+ href = "https://rtemis.org/rtemisbio",
80
+ )
81
+ ),
82
+ id = "rtemisbio",
83
+ selected = "Welcome",
84
+ footer = span(
85
+ svl,
86
+ " © 2024 EDG",
87
+ style = "display: block; text-align: center; margin-top: 1em; margin-bottom: 1em;"
88
+ ),
89
+ # Theme ----
90
+ theme = bslib::bs_theme(
91
+ bg = "#fff",
92
+ fg = "#000",
93
+ primary = primary,
94
+ secondary = "#704071",
95
+ success = success,
96
+ info = info,
97
+ `tooltip-bg` = "#303030",
98
+ `tooltip-color` = helpcol,
99
+ `tooltip-opacity` = 1,
100
+ `tooltip-border-radius` = "10px",
101
+ `tooltip-padding-x` = "1rem",
102
+ `tooltip-padding-y` = "1rem",
103
+ `tooltip-font-size` = "1rem"
104
+ # base_font = bslib::font_google("Inter"), # doesn't work in shinylive
105
+ # code_font = bslib::font_google("Fira Code")
106
+ ) |>
107
+ bs_add_rules(sass::sass_file("www/rtemislive.scss")),
108
+ # Window title ----
109
+ window_title = "rtemisSeq",
110
+ # Language ----
111
+ lang = "en",
112
+ # tags$script(src = "globals.js"),
113
+ # Nav Panels ----
114
+ ## [] Welcome ----
115
+ bslib::nav_panel(
116
+ title = "Welcome",
117
+ icon = bsicons::bs_icon("stars"),
118
+ bslib::card(
119
+ h4("Welcome to rtemisSeq", style = "text-align: center;"),
120
+ card_body(
121
+ class = "d-inline text-center",
122
+ HTML(paste0(
123
+ "rtemisSeq is a web interface for ",
124
+ as.character(a("rtemisbio", href = "https://rtemis.org/rtemisbio", target = "_blank")),
125
+ ", <br>providing interactive visualization of sequence data.",
126
+ "<br>Created for the ", as.character(a("FTD CWOW", href = "https://cwow.ucsf.edu/", target = "_blank")),
127
+ ".<br><br>",
128
+ rthelp_inline(
129
+ "To get started, use the navigation tabs at the top.",
130
+ title = "Welcome"
131
+ ),
132
+ shinylive_info
133
+ )),
134
+ br(), br(),
135
+ bslib::card_image(
136
+ file = "./www/svl.webp",
137
+ alt = "rtemislive",
138
+ align = "center",
139
+ border_radius = "all",
140
+ fill = FALSE,
141
+ width = "40%",
142
+ class = "mx-auto"
143
+ )
144
+ )
145
+ )
146
+ ), # /nav_panel Welcome
147
+ ## [] Protein Visualization ----
148
+ bslib::nav_panel(
149
+ title = "Protein Visualization",
150
+ icon = bsicons::bs_icon("body-text"),
151
+ card(
152
+ full_screen = TRUE,
153
+ class = "p-0",
154
+ # allow items side by side ----
155
+ card_header(
156
+ class = "d-flex justify-content-end",
157
+ # tooltip UI output ----
158
+ uiOutput("ui_a3_tooltip"),
159
+ # popover UI output ----
160
+ uiOutput("ui_a3_popover")
161
+ ),
162
+ layout_sidebar(
163
+ fillable = TRUE,
164
+ # Data Load Sidebar ----
165
+ sidebar = bslib::sidebar(
166
+ uiOutput("ui_a3_load_switch"), # Switch between file upload and built-in data
167
+ uiOutput("ui_a3_data_load"), # File upload or built-in data selection depending on switch
168
+ uiOutput("ui_a3_data_info"), # Shows dataset info
169
+ uiOutput("ui_a3_plot_button"), # Click to plot
170
+ # uiOutput("ui_a3_tooltip")
171
+ ),
172
+ # Plot Output ----
173
+ # for shinylive, do not use plotlyOutput directly in ui !!
174
+ # fails when no plot is rendered, unlike shiny
175
+ uiOutput("ui_dplot3_protein")
176
+ )
177
+ )
178
+ # bslib::navset_card_tab(
179
+ # full_screen = TRUE,
180
+ # # []] Sequence Viewer ----
181
+ # bslib::nav_panel(
182
+ # title = "Sequence Viewer",
183
+ # layout_sidebar(
184
+ # # Data Load Sidebar ----
185
+ # sidebar = bslib::sidebar(
186
+ # uiOutput("ui_a3_load_switch"), # Switch between file upload and built-in data
187
+ # uiOutput("ui_a3_data_load"), # File upload or built-in data selection depending on switch
188
+ # uiOutput("ui_a3_data_info"), # Shows dataset info
189
+ # uiOutput("ui_a3_plot_button") # Click to plot
190
+ # ),
191
+ # # Plot Output ----
192
+ # # for shinylive, do not use plotlyOutput directly in ui !!
193
+ # # fails when no plot is rendered, unlike shiny
194
+ # uiOutput("ui_dplot3_protein")
195
+ # )
196
+ # ),
197
+ # # []] jsonedit ----
198
+ # bslib::nav_panel(
199
+ # title = "Raw Data",
200
+ # bslib::card(
201
+ # bslib::card_title("Sequence & Annotation data"),
202
+ # uiOutput("ui_jsonedit")
203
+ # )
204
+ # ) # /nav_panel jsonedit
205
+ # ) # /navset_card_tab
206
+ ), # /nav_panel Protein Visualization
207
+ ## [] About ----
208
+ bslib::nav_panel(
209
+ title = "About",
210
+ icon = bsicons::bs_icon("info-square"),
211
+ bslib::card(
212
+ card_image(
213
+ file = "./www/rtemisbio_s.webp",
214
+ href = "https://rtemis.org/rtemisbio",
215
+ alt = "rtemislive",
216
+ align = "center",
217
+ border_radius = "all",
218
+ fill = FALSE,
219
+ width = "54%",
220
+ class = "mx-auto"
221
+ ),
222
+ div(
223
+ class = "d-inline text-center",
224
+ HTML(paste0(
225
+ "Created by the ",
226
+ as.character(a("FTD CWOW", href = "https://cwow.ucsf.edu/", target = "_blank")),
227
+ " Genomics & Transcriptomics core.<br/>",
228
+ "Powered by rtemis & rtemisbio (",
229
+ as.character(a("rtemis.org", href = "https://rtemis.org", target = "_blank")),
230
+ ")."
231
+ )),
232
+ br(), br(),
233
+ a(
234
+ img(
235
+ src = "rtemis_gray.png",
236
+ alt = "rtemis",
237
+ align = "center",
238
+ width = "190px"
239
+ ),
240
+ href = "https://rtemis.org",
241
+ target = "_blank"
242
+ ),
243
+ align = "center"
244
+ )
245
+ )
246
+ ), # /nav_panel About
247
+ bslib::nav_spacer(),
248
+ bslib::nav_item(input_dark_mode(id = "dark_mode", mode = default_theme)),
249
+ header = list(
250
+ # busy indicators ----
251
+ shinybusy::add_busy_spinner(
252
+ spin = "orbit",
253
+ # color = "#72CDF4",
254
+ color = "#00ffff",
255
+ timeout = 200,
256
+ position = "bottom-left",
257
+ onstart = FALSE
258
+ )
259
+ )
260
+ ) # /ui /bslib::page_navbar
261
+ } # /ui function
262
+
263
+ # Server ----
264
+ server <- function(input, output, session) {
265
+ # UI a3 load switch ----
266
+ output$ui_a3_load_switch <- shiny::renderUI({
267
+ if (verbosity > 0) {
268
+ message("Rendering ui_a3_load_switch")
269
+ }
270
+ # Radio buttons: built-in data vs upload file ----
271
+ shiny::radioButtons(
272
+ inputId = "a3_load_switch",
273
+ label = "Data source",
274
+ choices = list(
275
+ `Built-in datasets` = "builtin",
276
+ `File upload` = "upload"
277
+ ),
278
+ selected = "builtin"
279
+ )
280
+ })
281
+
282
+ # UI a3 Data ----
283
+ output$ui_a3_data_load <- shiny::renderUI({
284
+ req(input$a3_load_switch)
285
+ if (input$a3_load_switch == "upload") {
286
+ # Upload a3 JSON file
287
+ if (verbosity > 0) {
288
+ message("Rendering ui_a3_data_load for file upload")
289
+ }
290
+ shiny::fileInput(
291
+ inputId = "a3_file",
292
+ label = "Upload a3 JSON file",
293
+ buttonLabel = "Browse local files...",
294
+ )
295
+ } else {
296
+ # Select built-in data stored in ./data/ directory
297
+ if (verbosity > 0) {
298
+ message("Rendering ui_a3_data_load for built-in data selection")
299
+ }
300
+ shiny::selectizeInput(
301
+ inputId = "a3_builtin_data",
302
+ label = "Select built-in a3 dataset",
303
+ choices = c("mapt_annot", "mapt_clv"),
304
+ selected = "mapt_annot"
305
+ )
306
+ }
307
+ }) # /ui_a3_data_load
308
+
309
+ # UI for a3 data info ----
310
+ output$ui_a3_data_info <- shiny::renderUI({
311
+ req(a3_obj())
312
+ if (verbosity > 0) {
313
+ message("Rendering ui_a3_data_info")
314
+ }
315
+ bslib::card(
316
+ bslib::card_title("a3 Dataset Info", container = htmltools::h6),
317
+ bslib::card_body(
318
+ # HTML("Sequence length:", paste0("<b>", length(a3_obj()$Sequence), "</b>")),
319
+ # if (length(a3_obj()$UniprotID) > 0) {
320
+ # HTML("Uniprot ID:", paste0("<b>", a3_obj()$UniprotID, "</b>"))
321
+ # },
322
+ # if (length(a3_obj()$Reference) > 0) {
323
+ # a("Reference", href = a3_obj()$Reference, target = "_blank")
324
+ # },
325
+ summarize_a3(a3_obj()),
326
+ fillable = FALSE
327
+ ) # /card_body
328
+ ) # /card
329
+ }) # /ui_a3_data_info
330
+
331
+ # UI for plot action button ----
332
+ output$ui_a3_plot_button <- shiny::renderUI({
333
+ req(a3_obj())
334
+ if (verbosity > 0) {
335
+ message("Rendering ui_a3_plot_button")
336
+ }
337
+ bslib::input_task_button(
338
+ "a3_plot_button",
339
+ "Plot dataset",
340
+ icon = bsicons::bs_icon("magic"),
341
+ label_busy = "Drawing...",
342
+ icon_busy = bsicons::bs_icon("clock-history"),
343
+ type = "primary",
344
+ auto_reset = TRUE
345
+ )
346
+ }) # /ui_a3_plot_button
347
+
348
+ # Load Dataset ----
349
+ a3_obj <- shiny::reactive({
350
+ req(input$a3_load_switch)
351
+ if (input$a3_load_switch == "upload") {
352
+ req(input$a3_file)
353
+ if (verbosity > 0) {
354
+ message("Loading a3 JSON file '", input$a3_file$datapath, "'")
355
+ }
356
+ dat <- read.a3json(input$a3_file$datapath)
357
+ if (verbosity > 0) {
358
+ message("Loaded dataset of class '", class(dat)[1], "'")
359
+ }
360
+ return(dat)
361
+ } else {
362
+ # Load built-in data from data.R objects
363
+ req(input$a3_builtin_data)
364
+ if (verbosity > 0) {
365
+ message("Loading built-in a3 dataset '", input$a3_builtin_data, "'")
366
+ }
367
+ # read.3.json from data folder works fine in shiny app, not shinylive,
368
+ # use objects from data.R instead
369
+ # assign to dat object of name input$a3_builtin_data
370
+ dat <- get(input$a3_builtin_data)
371
+ if (verbosity > 0) {
372
+ message("Loaded dataset of class '", class(dat)[1], "'")
373
+ }
374
+ return(dat)
375
+ }
376
+ }) # /a3_obj
377
+
378
+ # dplot3 theme is "white" or "black" ----
379
+ dplot3_theme <- shiny::reactive({
380
+ req(input$dark_mode)
381
+ if (input$dark_mode == "dark") {
382
+ "black"
383
+ } else {
384
+ "white"
385
+ }
386
+ }) # /dplot3_theme
387
+
388
+ # Render plotly ----
389
+ output$dplot3_protein <- plotly::renderPlotly({
390
+ req(a3_obj())
391
+ if (verbosity > 0) {
392
+ message("Rendering dplot3_protein of object with class '", class(a3_obj())[1], "'")
393
+ }
394
+ plot(
395
+ a3_obj(),
396
+ theme = dplot3_theme(),
397
+ marker.size = input$marker.size,
398
+ font.size = input$font.size,
399
+ ptm.marker.size = input$ptm.marker.size,
400
+ clv.marker.size = input$clv.marker.size,
401
+ bg = input$plot.bg, # legend.bg defaults to transparent, this sets paper bg
402
+ plot.bg = input$plot.bg,
403
+ marker.col = input$marker.col,
404
+ n.per.row = if (input$n.per.row == "auto") NULL else as.integer(input$n.per.row)
405
+ )
406
+ }) |> # /dplot3_protein
407
+ bindEvent(input$a3_plot_button, input$a3_plot_update_button)
408
+
409
+ # Create variable clicked that is TRUE after input$a3_plot_button is clicked
410
+ clicked <- shiny::reactiveVal(FALSE)
411
+ shiny::observeEvent(input$a3_plot_button, {
412
+ clicked(TRUE)
413
+ })
414
+
415
+ # UI a3 tooltip ----
416
+ output$ui_a3_tooltip <- shiny::renderUI({
417
+ if (clicked()) {
418
+ bslib::tooltip(
419
+ trigger = span(
420
+ "Plot help", bsicons::bs_icon("info-circle", class = "text-info"),
421
+ style = "text-align: right;",
422
+ class = "rtanihi"
423
+ ),
424
+ div(
425
+ # HTML(
426
+ # paste0(
427
+ # "<ul>",
428
+ # "<li>Hover over plot to see annotations.",
429
+ # "<li>Click on legend items to toggle visibility of annotations.",
430
+ # "<li>Double-click on legend items to isolate a single annotation type.",
431
+ # "<li>Click on top-right gear icon to change plot settings.",
432
+ # "</ul>"
433
+ # )
434
+ # ),
435
+ rhelplist(
436
+ c(
437
+ "Hover over plot to see annotations.",
438
+ "Click on legend items to toggle visibility of annotations.",
439
+ "Double-click on legend items to isolate a single annotation type.",
440
+ "Click on top-right gear icon to change plot settings."
441
+ )
442
+ ),
443
+ style = "text-align: left;"
444
+ ), # /div rt-tooltip
445
+ placement = "bottom"
446
+ ) # /tooltip
447
+ }
448
+ }) # /ui_a3_tooltip
449
+
450
+ # UI a3 popover ----
451
+ output$ui_a3_popover <- shiny::renderUI({
452
+ if (clicked()) {
453
+ popover(
454
+ trigger = bsicons::bs_icon("gear", class = "ms-auto"),
455
+ # trigger = span(
456
+ # "Plot settings", bsicons::bs_icon("gear", class = "ms-auto"),
457
+ # style = "text-align: right;"
458
+ # shiny::selectizeInput("a3.theme", label = "Theme", choices = c("dark", "light"), selected = default_theme),
459
+ shiny::sliderInput("marker.size", label = "Marker size", min = 1, max = 100, value = 28),
460
+ shiny::sliderInput("font.size", label = "Font size", min = 1, max = 72, value = 18),
461
+ if (length(a3_obj()$Annotations$PTM) > 0) shiny::sliderInput("ptm.marker.size", label = "PTM Marker size", min = .1, max = 36, value = 28 / 4.5),
462
+ if (length(a3_obj()$Annotations$Cleavage_site) > 0) shiny::sliderInput("clv.marker.size", label = "Cleavage Site Marker size", min = .1, max = 36, value = 28 / 4),
463
+ shinyWidgets::colorPickr(
464
+ "plot.bg",
465
+ label = "Plot background",
466
+ selected = ifelse(input$dark_mode == "dark", "#191919", "#FFFFFF")
467
+ ),
468
+ shinyWidgets::colorPickr(
469
+ "marker.col",
470
+ label = "Marker color",
471
+ selected = ifelse(input$dark_mode == "dark", "#3f3f3f", "#dfdfdf")
472
+ ),
473
+ textInput("n.per.row", "Number of AAs per row", value = "auto"),
474
+ # tags$i("Click on 'Plot dataset' to update render after changing settings."),
475
+ bslib::input_task_button(
476
+ "a3_plot_update_button",
477
+ "Update rendering",
478
+ icon = bsicons::bs_icon("arrow-clockwise"),
479
+ label_busy = "Drawing...",
480
+ icon_busy = bsicons::bs_icon("clock-history"),
481
+ type = "primary",
482
+ auto_reset = TRUE
483
+ ),
484
+ title = "Plot settings",
485
+ placement = "auto"
486
+ # options = list(trigger = "hover focus click")
487
+ ) # /popover
488
+ }
489
+ }) # /ui_a3_popover
490
+
491
+
492
+ # UI dplot3_protein ----
493
+ output$ui_dplot3_protein <- renderUI({
494
+ if (clicked() == FALSE || is.null(a3_obj())) {
495
+ rthelp(
496
+ "Select Data Source and Click 'Plot dataset' on the left.",
497
+ title = "Protein Visualization "
498
+ )
499
+ } else {
500
+ plotly::plotlyOutput(
501
+ "dplot3_protein",
502
+ width = "100%",
503
+ height = protein_plotly_height
504
+ )
505
+ }
506
+ }) # /ui_dplot3_protein
507
+
508
+ # Render JSON ----
509
+ output$jsonedit <- listviewer::renderJsonedit({
510
+ req(a3_obj())
511
+ listviewer::jsonedit(a3_obj())
512
+ }) # /json
513
+
514
+ # UI jsonedit ----
515
+ output$ui_jsonedit <- shiny::renderUI({
516
+ listviewer::jsoneditOutput(
517
+ "jsonedit",
518
+ height = jsonedit_height
519
+ )
520
+ })
521
+ } # /server
522
+
523
+ # Shiny app ----
524
+ shiny::shinyApp(ui = ui, server = server, enableBookmarking = "url")
525
+ } # seqvizlive
526
 
527
+ seqvizlive()
data.R ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # mapt_annot ----
2
+ # library(rtemisbio)
3
+ # mapt_annot <- read.a3json("./seqvizlive_app_fl/data/mapt_annot.json")
4
+ # mapt_annot
5
+ # dput(mapt_annot)
6
+ mapt_annot <- structure(list(
7
+ Sequence = c(
8
+ "M", "A", "E", "P", "R", "Q", "E",
9
+ "F", "E", "V", "M", "E", "D", "H", "A", "G", "T", "Y", "G", "L",
10
+ "G", "D", "R", "K", "D", "Q", "G", "G", "Y", "T", "M", "H", "Q",
11
+ "D", "Q", "E", "G", "D", "T", "D", "A", "G", "L", "K", "E", "S",
12
+ "P", "L", "Q", "T", "P", "T", "E", "D", "G", "S", "E", "E", "P",
13
+ "G", "S", "E", "T", "S", "D", "A", "K", "S", "T", "P", "T", "A",
14
+ "E", "D", "V", "T", "A", "P", "L", "V", "D", "E", "G", "A", "P",
15
+ "G", "K", "Q", "A", "A", "A", "Q", "P", "H", "T", "E", "I", "P",
16
+ "E", "G", "T", "T", "A", "E", "E", "A", "G", "I", "G", "D", "T",
17
+ "P", "S", "L", "E", "D", "E", "A", "A", "G", "H", "V", "T", "Q",
18
+ "A", "R", "M", "V", "S", "K", "S", "K", "D", "G", "T", "G", "S",
19
+ "D", "D", "K", "K", "A", "K", "G", "A", "D", "G", "K", "T", "K",
20
+ "I", "A", "T", "P", "R", "G", "A", "A", "P", "P", "G", "Q", "K",
21
+ "G", "Q", "A", "N", "A", "T", "R", "I", "P", "A", "K", "T", "P",
22
+ "P", "A", "P", "K", "T", "P", "P", "S", "S", "G", "E", "P", "P",
23
+ "K", "S", "G", "D", "R", "S", "G", "Y", "S", "S", "P", "G", "S",
24
+ "P", "G", "T", "P", "G", "S", "R", "S", "R", "T", "P", "S", "L",
25
+ "P", "T", "P", "P", "T", "R", "E", "P", "K", "K", "V", "A", "V",
26
+ "V", "R", "T", "P", "P", "K", "S", "P", "S", "S", "A", "K", "S",
27
+ "R", "L", "Q", "T", "A", "P", "V", "P", "M", "P", "D", "L", "K",
28
+ "N", "V", "K", "S", "K", "I", "G", "S", "T", "E", "N", "L", "K",
29
+ "H", "Q", "P", "G", "G", "G", "K", "V", "Q", "I", "I", "N", "K",
30
+ "K", "L", "D", "L", "S", "N", "V", "Q", "S", "K", "C", "G", "S",
31
+ "K", "D", "N", "I", "K", "H", "V", "P", "G", "G", "G", "S", "V",
32
+ "Q", "I", "V", "Y", "K", "P", "V", "D", "L", "S", "K", "V", "T",
33
+ "S", "K", "C", "G", "S", "L", "G", "N", "I", "H", "H", "K", "P",
34
+ "G", "G", "G", "Q", "V", "E", "V", "K", "S", "E", "K", "L", "D",
35
+ "F", "K", "D", "R", "V", "Q", "S", "K", "I", "G", "S", "L", "D",
36
+ "N", "I", "T", "H", "V", "P", "G", "G", "G", "N", "K", "K", "I",
37
+ "E", "T", "H", "K", "L", "T", "F", "R", "E", "N", "A", "K", "A",
38
+ "K", "T", "D", "H", "G", "A", "E", "I", "V", "Y", "K", "S", "P",
39
+ "V", "V", "S", "G", "D", "T", "S", "P", "R", "H", "L", "S", "N",
40
+ "V", "S", "S", "T", "G", "S", "I", "D", "M", "V", "D", "S", "P",
41
+ "Q", "L", "A", "T", "L", "A", "D", "E", "V", "S", "A", "S", "L",
42
+ "A", "K", "Q", "G", "L"
43
+ ), Annotations = list(
44
+ Site = list(
45
+ Disease_associated_variant = c(
46
+ 4L,
47
+ 5L, 14L, 17L, 18L, 30L, 39L, 41L, 55L, 75L, 86L, 90L, 152L, 176L,
48
+ 178L, 200L, 203L, 211L, 224L, 227L, 239L, 255L, 257L, 260L, 266L,
49
+ 272L, 273L, 279L, 280L, 284L, 285L, 287L, 291L, 296L, 300L, 301L,
50
+ 303L, 305L, 320L, 332L, 335L, 336L, 337L, 342L, 352L, 356L, 360L,
51
+ 363L, 364L, 366L, 369L, 372L, 389L, 406L, 410L, 427L, 441L
52
+ ),
53
+ `N-terminal Repeat` = 45:86, `Microtubule Binding Domain (R1, R3, R4)` = c(
54
+ 244L,
55
+ 245L, 246L, 247L, 248L, 249L, 250L, 251L, 252L, 253L, 254L,
56
+ 255L, 256L, 257L, 258L, 259L, 260L, 261L, 262L, 263L, 264L,
57
+ 265L, 266L, 267L, 268L, 269L, 270L, 271L, 272L, 273L, 274L,
58
+ 306L, 307L, 308L, 309L, 310L, 311L, 312L, 313L, 314L, 315L,
59
+ 316L, 317L, 318L, 319L, 320L, 321L, 322L, 323L, 324L, 325L,
60
+ 326L, 327L, 328L, 329L, 330L, 331L, 332L, 333L, 334L, 335L,
61
+ 336L, 337L, 338L, 339L, 340L, 341L, 342L, 343L, 344L, 345L,
62
+ 346L, 347L, 348L, 349L, 350L, 351L, 352L, 353L, 354L, 355L,
63
+ 356L, 357L, 358L, 359L, 360L, 361L, 362L, 363L, 364L, 365L,
64
+ 366L, 367L, 368L
65
+ ), `Microtubule Binding Domain (R2)` = 274:305
66
+ ),
67
+ Region = list(
68
+ KXGS = list(259:262, 290:293, 321:324, 353:356),
69
+ `Canonical KFERQ` = list(336:340, 347:351), `Potential KFERQ` = list(
70
+ 240:244, 280:284, 307:311, 343:347
71
+ ), Phosphodegron = list(
72
+ 46:51, 149:154, 195:200, 208:213, 231:236, 400:405
73
+ )
74
+ ),
75
+ PTM = list(Phosphorylation = c(
76
+ 17L, 18L, 29L, 30L, 39L, 46L,
77
+ 50L, 52L, 56L, 61L, 63L, 64L, 68L, 69L, 71L, 76L, 95L, 101L,
78
+ 102L, 111L, 113L, 123L, 129L, 131L, 135L, 137L, 149L, 153L,
79
+ 169L, 175L, 181L, 184L, 185L, 191L, 195L, 197L, 198L, 199L,
80
+ 202L, 205L, 208L, 210L, 217L, 212L, 214L, 220L, 229L, 235L,
81
+ 231L, 232L, 235L, 236L, 237L, 238L, 241L, 245L, 258L, 262L,
82
+ 263L, 285L, 289L, 293L, 305L, 316L, 319L, 320L, 321L, 324L,
83
+ 336L, 341L, 352L, 356L, 361L, 362L, 366L, 370L, 373L, 380L,
84
+ 382L, 383L, 385L, 386L, 394L, 396L, 403L, 409L, 400L, 404L,
85
+ 412L, 413L, 414L, 416L, 435L, 427L, 433L, 422L
86
+ ), Acetylation = c(
87
+ 148L,
88
+ 150L, 163L, 174L, 180L, 224L, 225L, 234L, 240L, 254L, 257L,
89
+ 259L, 267L, 274L, 280L, 281L, 290L, 294L, 298L, 311L, 317L,
90
+ 321L, 331L, 343L, 347L, 353L, 369L, 370L, 375L, 383L, 385L,
91
+ 395L
92
+ ), Methylation = c(
93
+ 24L, 44L, 67L, 87L, 126L, 148L, 150L,
94
+ 155L, 163L, 174L, 180L, 190L, 234L, 240L, 254L, 259L, 267L,
95
+ 281L, 290L, 311L, 317L, 331L, 349L, 353L, 369L, 370L, 375L,
96
+ 385L, 395L
97
+ ), Glycation = c(
98
+ 67L, 87L, 132L, 148L, 150L, 163L,
99
+ 174L, 180L, 190L, 225L, 234L, 259L, 267L, 274L, 280L, 281L,
100
+ 290L, 298L, 311L, 321L, 331L, 340L, 343L, 347L, 353L, 369L,
101
+ 370L, 375L, 383L, 385L, 395L
102
+ ), Ubiquitination = c(
103
+ 44L, 254L,
104
+ 259L, 267L, 281L, 290L, 298L, 311L, 317L, 321L, 331L, 343L,
105
+ 347L, 353L, 369L, 375L, 385L
106
+ ), `O-Glycosilation` = c(
107
+ 123L,
108
+ 208L, 238L, 400L, 412L, 413L
109
+ ), SUMOylation = 340L), Cleavage_site = structure(list(), names = character(0)),
110
+ Variant = structure(list(), names = character(0))
111
+ ), UniprotID = "P10636",
112
+ Reference = "https://www.frontiersin.org/journals/neurology/articles/10.3389/fneur.2020.595532"
113
+ ), class = c(
114
+ "a3",
115
+ "list"
116
+ ))
117
+ mapt_annot
118
+
119
+
120
+ # mapt_clv ----
121
+ # mapt_clv <- read.a3json("./seqvizlive_app_fl/data/mapt_clv.json")
122
+ # mapt_clv
123
+ # dput(mapt_clv)
124
+ mapt_clv <- structure(list(
125
+ Sequence = c(
126
+ "M", "A", "E", "P", "R", "Q", "E",
127
+ "F", "E", "V", "M", "E", "D", "H", "A", "G", "T", "Y", "G", "L",
128
+ "G", "D", "R", "K", "D", "Q", "G", "G", "Y", "T", "M", "H", "Q",
129
+ "D", "Q", "E", "G", "D", "T", "D", "A", "G", "L", "K", "E", "S",
130
+ "P", "L", "Q", "T", "P", "T", "E", "D", "G", "S", "E", "E", "P",
131
+ "G", "S", "E", "T", "S", "D", "A", "K", "S", "T", "P", "T", "A",
132
+ "E", "D", "V", "T", "A", "P", "L", "V", "D", "E", "G", "A", "P",
133
+ "G", "K", "Q", "A", "A", "A", "Q", "P", "H", "T", "E", "I", "P",
134
+ "E", "G", "T", "T", "A", "E", "E", "A", "G", "I", "G", "D", "T",
135
+ "P", "S", "L", "E", "D", "E", "A", "A", "G", "H", "V", "T", "Q",
136
+ "E", "P", "E", "S", "G", "K", "V", "V", "Q", "E", "G", "F", "L",
137
+ "R", "E", "P", "G", "P", "P", "G", "L", "S", "H", "Q", "L", "M",
138
+ "S", "G", "M", "P", "G", "A", "P", "L", "L", "P", "E", "G", "P",
139
+ "R", "E", "A", "T", "R", "Q", "P", "S", "G", "T", "G", "P", "E",
140
+ "D", "T", "E", "G", "G", "R", "H", "A", "P", "E", "L", "L", "K",
141
+ "H", "Q", "L", "L", "G", "D", "L", "H", "Q", "E", "G", "P", "P",
142
+ "L", "K", "G", "A", "G", "G", "K", "E", "R", "P", "G", "S", "K",
143
+ "E", "E", "V", "D", "E", "D", "R", "D", "V", "D", "E", "S", "S",
144
+ "P", "Q", "D", "S", "P", "P", "S", "K", "A", "S", "P", "A", "Q",
145
+ "D", "G", "R", "P", "P", "Q", "T", "A", "A", "R", "E", "A", "T",
146
+ "S", "I", "P", "G", "F", "P", "A", "E", "G", "A", "I", "P", "L",
147
+ "P", "V", "D", "F", "L", "S", "K", "V", "S", "T", "E", "I", "P",
148
+ "A", "S", "E", "P", "D", "G", "P", "S", "V", "G", "A", "A", "K",
149
+ "G", "Q", "D", "A", "P", "L", "E", "F", "T", "F", "H", "V", "E",
150
+ "I", "T", "P", "N", "V", "Q", "K", "E", "Q", "A", "H", "S", "E",
151
+ "E", "H", "A", "G", "R", "A", "A", "F", "P", "G", "A", "P", "G",
152
+ "E", "G", "P", "E", "A", "R", "G", "P", "S", "L", "G", "E", "D",
153
+ "T", "K", "E", "A", "D", "L", "P", "E", "P", "S", "E", "K", "Q",
154
+ "P", "A", "A", "A", "P", "R", "G", "K", "P", "V", "S", "R", "V",
155
+ "P", "Q", "L", "K", "A", "R", "M", "V", "S", "K", "S", "K", "D",
156
+ "G", "T", "G", "S", "D", "D", "K", "K", "A", "K", "T", "S", "T",
157
+ "R", "S", "S", "A", "K", "T", "L", "K", "N", "R", "P", "C", "L",
158
+ "S", "P", "K", "H", "P", "T", "P", "G", "S", "S", "D", "P", "L",
159
+ "I", "Q", "P", "S", "S", "P", "A", "V", "C", "P", "E", "P", "P",
160
+ "S", "S", "P", "K", "Y", "V", "S", "S", "V", "T", "S", "R", "T",
161
+ "G", "S", "S", "G", "A", "K", "E", "M", "K", "L", "K", "G", "A",
162
+ "D", "G", "K", "T", "K", "I", "A", "T", "P", "R", "G", "A", "A",
163
+ "P", "P", "G", "Q", "K", "G", "Q", "A", "N", "A", "T", "R", "I",
164
+ "P", "A", "K", "T", "P", "P", "A", "P", "K", "T", "P", "P", "S",
165
+ "S", "G", "E", "P", "P", "K", "S", "G", "D", "R", "S", "G", "Y",
166
+ "S", "S", "P", "G", "S", "P", "G", "T", "P", "G", "S", "R", "S",
167
+ "R", "T", "P", "S", "L", "P", "T", "P", "P", "T", "R", "E", "P",
168
+ "K", "K", "V", "A", "V", "V", "R", "T", "P", "P", "K", "S", "P",
169
+ "S", "S", "A", "K", "S", "R", "L", "Q", "T", "A", "P", "V", "P",
170
+ "M", "P", "D", "L", "K", "N", "V", "K", "S", "K", "I", "G", "S",
171
+ "T", "E", "N", "L", "K", "H", "Q", "P", "G", "G", "G", "K", "V",
172
+ "Q", "I", "I", "N", "K", "K", "L", "D", "L", "S", "N", "V", "Q",
173
+ "S", "K", "C", "G", "S", "K", "D", "N", "I", "K", "H", "V", "P",
174
+ "G", "G", "G", "S", "V", "Q", "I", "V", "Y", "K", "P", "V", "D",
175
+ "L", "S", "K", "V", "T", "S", "K", "C", "G", "S", "L", "G", "N",
176
+ "I", "H", "H", "K", "P", "G", "G", "G", "Q", "V", "E", "V", "K",
177
+ "S", "E", "K", "L", "D", "F", "K", "D", "R", "V", "Q", "S", "K",
178
+ "I", "G", "S", "L", "D", "N", "I", "T", "H", "V", "P", "G", "G",
179
+ "G", "N", "K", "K", "I", "E", "T", "H", "K", "L", "T", "F", "R",
180
+ "E", "N", "A", "K", "A", "K", "T", "D", "H", "G", "A", "E", "I",
181
+ "V", "Y", "K", "S", "P", "V", "V", "S", "G", "D", "T", "S", "P",
182
+ "R", "H", "L", "S", "N", "V", "S", "S", "T", "G", "S", "I", "D",
183
+ "M", "V", "D", "S", "P", "Q", "L", "A", "T", "L", "A", "D", "E",
184
+ "V", "S", "A", "S", "L", "A", "K", "Q", "G", "L"
185
+ ), Annotations = list(
186
+ Site = structure(list(), names = character(0)), Region = structure(list(), names = character(0)),
187
+ PTM = structure(list(), names = character(0)), Cleavage_site = list(
188
+ CTSL_pH_4_5 = c(
189
+ 1L, 9L, 11L, 13L, 19L, 21L, 30L, 44L,
190
+ 49L, 54L, 67L, 71L, 76L, 81L, 116L, 129L, 173L, 198L,
191
+ 227L, 229L, 244L, 254L, 256L, 257L, 261L, 267L, 281L,
192
+ 283L, 300L, 307L, 310L, 314L, 316L, 319L, 326L, 340L,
193
+ 340L, 341L, 351L, 355L, 377L, 379L, 379L, 394L, 395L,
194
+ 402L, 405L, 417L, 419L, 421L, 426L, 427L, 429L, 433L,
195
+ 437L, 438L
196
+ ), CTSL_pH_5_5 = c(54L, 244L, 319L), CTSD_pH_3_4 = c(
197
+ 340L,
198
+ 391L, 426L
199
+ ), CTSD_pH_4_5 = c(340L, 399L, 400L, 417L),
200
+ CTSB_pH_4_5 = c(
201
+ 7L, 12L, 15L, 17L, 30L, 53L, 82L, 130L,
202
+ 186L, 209L, 225L, 237L, 238L, 257L, 259L, 262L, 264L,
203
+ 282L, 284L, 321L, 349L, 353L, 407L, 438L
204
+ ), CTSB_pH_5_5 = c(
205
+ 14L,
206
+ 17L, 27L, 81L, 173L, 186L, 209L, 225L, 238L, 253L, 256L,
207
+ 257L, 259L, 262L, 264L, 284L, 290L, 338L, 349L, 353L,
208
+ 400L, 407L, 419L, 419L, 424L, 425L
209
+ ), CTSK_pH_4_5 = c(
210
+ 1L,
211
+ 21L, 30L, 44L, 109L, 184L, 184L, 214L, 244L, 254L, 261L,
212
+ 319L, 326L, 343L, 355L, 377L, 399L, 421L
213
+ ), CTSF_pH_4_5 = c(
214
+ 300L,
215
+ 402L
216
+ ), CTSV_pH_3_4 = c(
217
+ 248L, 254L, 276L, 285L, 307L,
218
+ 314L, 316L, 340L, 351L, 361L, 395L, 433L
219
+ ), CTSV_pH_4_5 = c(
220
+ 1L,
221
+ 11L, 21L, 30L, 30L, 44L, 244L, 254L, 256L, 257L, 276L,
222
+ 283L, 285L, 288L, 307L, 310L, 316L, 326L, 340L, 340L,
223
+ 351L, 361L, 379L, 381L, 394L, 395L, 407L, 425L, 426L,
224
+ 429L, 433L
225
+ ), CTSE_pH_3_4 = c(
226
+ 8L, 9L, 11L, 21L, 30L, 44L,
227
+ 73L, 81L, 109L, 129L, 244L, 254L, 257L, 261L, 283L, 288L,
228
+ 307L, 310L, 319L, 326L, 340L, 351L, 355L, 395L, 418L,
229
+ 419L, 419L, 425L, 426L, 433L
230
+ ), CTSE_pH_4_5 = c(
231
+ 8L, 111L,
232
+ 307L, 322L, 419L, 425L
233
+ ), CTSS_pH_4_5 = c(
234
+ 1L, 5L, 7L,
235
+ 9L, 12L, 30L, 44L, 49L, 67L, 72L, 76L, 80L, 95L, 105L,
236
+ 109L, 115L, 116L, 129L, 212L, 243L, 244L, 254L, 257L,
237
+ 267L, 276L, 283L, 288L, 307L, 308L, 309L, 310L, 316L,
238
+ 339L, 345L, 351L, 355L, 361L, 391L, 394L, 395L, 400L,
239
+ 407L, 411L, 412L, 420L, 425L, 426L, 427L, 429L, 433L
240
+ ),
241
+ CTSS_pH_5_5 = c(
242
+ 1L, 11L, 12L, 30L, 30L, 44L, 49L, 67L,
243
+ 72L, 76L, 80L, 92L, 95L, 109L, 115L, 129L, 243L, 244L,
244
+ 254L, 256L, 257L, 261L, 267L, 283L, 288L, 307L, 308L,
245
+ 310L, 316L, 319L, 326L, 339L, 351L, 355L, 355L, 361L,
246
+ 379L, 379L, 391L, 394L, 395L, 400L, 407L, 411L, 412L,
247
+ 423L, 425L, 426L, 427L, 429L, 430L, 433L, 433L
248
+ ), CTSO_pH_5_5 = c(
249
+ 92L,
250
+ 212L, 339L, 430L
251
+ ), AEP_pH_4_5 = c(
252
+ 40L, 49L, 54L, 54L,
253
+ 67L, 116L, 209L, 212L, 252L, 255L, 265L, 279L, 286L,
254
+ 327L, 339L, 345L, 361L, 368L, 368L, 381L, 402L, 418L,
255
+ 423L, 430L, 430L
256
+ ), AEP_pH_5_5 = c(
257
+ 67L, 92L, 265L, 284L,
258
+ 339L, 345L, 368L, 423L, 430L
259
+ ), CTSX_pH_3_4 = c(
260
+ 16L, 41L,
261
+ 67L, 112L, 212L, 339L, 345L, 402L, 423L, 430L
262
+ ), CTSX_pH_4_5 = c(
263
+ 3L,
264
+ 16L, 67L, 212L, 339L, 345L, 355L, 355L, 394L, 432L, 433L
265
+ ), CTSA_pH_4_5 = c(48L, 55L, 67L, 73L, 339L, 430L)
266
+ ),
267
+ Variant = structure(list(), names = character(0))
268
+ ), UniprotID = NULL,
269
+ Reference = "https://molecularneurodegeneration.biomedcentral.com/articles/10.1186/s13024-023-00621-8"
270
+ ), class = c(
271
+ "a3",
272
+ "list"
273
+ ))
favicon.png ADDED
globals.R ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # globals.R
2
+ # seqvizlive
3
+ # EDG rtemis.org
4
+
5
+ # Themes ----
6
+ # {bg_dark, bg_light} also used by plot.bg
7
+ bg_dark <- "#191919"
8
+ bg_light <- "#ffffff"
9
+ primary_dark <- "#72CDF4"
10
+ primary_light <- "#1295D8"
11
+ seconday_dark <- "#808080"
12
+ secondary_light <- "#808080"
13
+ info_dark <- "#FEB2E0"
14
+ info_light <- "#E44C9A"
15
+ success_dark <- "#B4DC55"
16
+ success_light <- "#84C234"
17
+
18
+ bslib_dark <- bslib::bs_theme(
19
+ bg = bg_dark,
20
+ fg = "#fff",
21
+ primary = primary_dark,
22
+ secondary = seconday_dark,
23
+ success = success_dark,
24
+ info = info_dark,
25
+ `tooltip-bg` = "#bbbbbb",
26
+ `tooltip-color` = info_dark,
27
+ `tooltip-opacity` = .95
28
+ ) |>
29
+ bslib::bs_add_rules(sass::sass_file("www/rtemislive.scss"))
30
+
31
+ bslib_light <- bslib::bs_theme(
32
+ bg = bg_light,
33
+ fg = "#000",
34
+ primary = primary_light,
35
+ secondary = secondary_light,
36
+ success = success_light,
37
+ info = info_light,
38
+ `tooltip-bg` = "#303030",
39
+ `tooltip-color` = info_light,
40
+ `tooltip-opacity` = .95
41
+ ) |>
42
+ bslib::bs_add_rules(sass::sass_file("www/rtemislive.scss"))
43
+
44
+ # from rtemislive
45
+ rthelp <- function(..., title = NULL, class = "rthelp") {
46
+ div(
47
+ div(HTML(paste0(title, " Instructions")),
48
+ style = "color: #808080; font-weight: 300; padding-bottom:.5em;"
49
+ ),
50
+ HTML(paste0("<i>", paste(..., sep = "<br>")), "</i>"),
51
+ class = class
52
+ )
53
+ } # rtemislive::rthelp
54
+
55
+ rthelp_inline <- function(..., title = NULL, class = "rthelp-inline") {
56
+ rthelp(..., title = title, class = class)
57
+ } # rtemislive::rthelp_inline
58
+
59
+ bold <- function(x) {
60
+ paste0("<b>", x, "</b>")
61
+ }
62
+
63
+ hilite <- function(x) {
64
+ paste0("<span style='color: #72CDF4;font-weight: bold;'>", x, "</span>")
65
+ }
66
+
67
+ #' Summarize a3 object in HTML
68
+ #'
69
+ #' @param x a3 object
70
+ #'
71
+ #' @return HTML string
72
+ #' @author EDG
73
+ summarize_a3 <- function(x) {
74
+ htmltools::HTML(
75
+ paste0(
76
+ if (!is.null(x$UniprotID)) paste0("Uniprot ID: ", hilite(x$UniprotID), "<br>"),
77
+ paste0("Sequence length: ", hilite(length(x$Sequence)), "<br>"),
78
+ "<ul>",
79
+ if (length(x$Annotations$Site) > 0) paste("<li>", hilite(length(x$Annotations$Site)), "site annotations<br>"),
80
+ if (length(x$Annotations$Region) > 0) paste("<li>", hilite(length(x$Annotations$Region)), "region annotations<br>"),
81
+ if (length(x$Annotations$PTM) > 0) paste("<li>", hilite(length(x$Annotations$PTM)), "PTM annotations<br>"),
82
+ if (length(x$Annotations$Cleavage_site) > 0) paste("<li>", hilite(length(x$Annotations$Cleavage_site)), " cleavage site annotations<br>"),
83
+ if (length(x$Annotations$Variant) > 0) paste("<li>", hilite(length(x$Annotations$Variant)), "variant annotations<br>"),
84
+ "</ul>",
85
+ if (!is.null(x$Reference)) a("Reference", href = x$Reference, target = "_blank")
86
+ )
87
+ )
88
+ } # seqvizlive::summarize_a3
89
+
90
+
91
+ # Create list using custom bullet
92
+ rhelplist <- function(x, bullet = bsicons::bs_icon("arrow-right-short")) {
93
+ htmltools::HTML(
94
+ paste0(
95
+ bullet, "<i>", x, "</i>", "<br>"
96
+ )
97
+ )
98
+ } # seqvizlive::rtlist
penguins.csv DELETED
@@ -1,345 +0,0 @@
1
- Species,Island,Bill Length (mm),Bill Depth (mm),Flipper Length (mm),Body Mass (g),Sex,Year
2
- Adelie,Torgersen,39.1,18.7,181,3750,male,2007
3
- Adelie,Torgersen,39.5,17.4,186,3800,female,2007
4
- Adelie,Torgersen,40.3,18,195,3250,female,2007
5
- Adelie,Torgersen,NA,NA,NA,NA,NA,2007
6
- Adelie,Torgersen,36.7,19.3,193,3450,female,2007
7
- Adelie,Torgersen,39.3,20.6,190,3650,male,2007
8
- Adelie,Torgersen,38.9,17.8,181,3625,female,2007
9
- Adelie,Torgersen,39.2,19.6,195,4675,male,2007
10
- Adelie,Torgersen,34.1,18.1,193,3475,NA,2007
11
- Adelie,Torgersen,42,20.2,190,4250,NA,2007
12
- Adelie,Torgersen,37.8,17.1,186,3300,NA,2007
13
- Adelie,Torgersen,37.8,17.3,180,3700,NA,2007
14
- Adelie,Torgersen,41.1,17.6,182,3200,female,2007
15
- Adelie,Torgersen,38.6,21.2,191,3800,male,2007
16
- Adelie,Torgersen,34.6,21.1,198,4400,male,2007
17
- Adelie,Torgersen,36.6,17.8,185,3700,female,2007
18
- Adelie,Torgersen,38.7,19,195,3450,female,2007
19
- Adelie,Torgersen,42.5,20.7,197,4500,male,2007
20
- Adelie,Torgersen,34.4,18.4,184,3325,female,2007
21
- Adelie,Torgersen,46,21.5,194,4200,male,2007
22
- Adelie,Biscoe,37.8,18.3,174,3400,female,2007
23
- Adelie,Biscoe,37.7,18.7,180,3600,male,2007
24
- Adelie,Biscoe,35.9,19.2,189,3800,female,2007
25
- Adelie,Biscoe,38.2,18.1,185,3950,male,2007
26
- Adelie,Biscoe,38.8,17.2,180,3800,male,2007
27
- Adelie,Biscoe,35.3,18.9,187,3800,female,2007
28
- Adelie,Biscoe,40.6,18.6,183,3550,male,2007
29
- Adelie,Biscoe,40.5,17.9,187,3200,female,2007
30
- Adelie,Biscoe,37.9,18.6,172,3150,female,2007
31
- Adelie,Biscoe,40.5,18.9,180,3950,male,2007
32
- Adelie,Dream,39.5,16.7,178,3250,female,2007
33
- Adelie,Dream,37.2,18.1,178,3900,male,2007
34
- Adelie,Dream,39.5,17.8,188,3300,female,2007
35
- Adelie,Dream,40.9,18.9,184,3900,male,2007
36
- Adelie,Dream,36.4,17,195,3325,female,2007
37
- Adelie,Dream,39.2,21.1,196,4150,male,2007
38
- Adelie,Dream,38.8,20,190,3950,male,2007
39
- Adelie,Dream,42.2,18.5,180,3550,female,2007
40
- Adelie,Dream,37.6,19.3,181,3300,female,2007
41
- Adelie,Dream,39.8,19.1,184,4650,male,2007
42
- Adelie,Dream,36.5,18,182,3150,female,2007
43
- Adelie,Dream,40.8,18.4,195,3900,male,2007
44
- Adelie,Dream,36,18.5,186,3100,female,2007
45
- Adelie,Dream,44.1,19.7,196,4400,male,2007
46
- Adelie,Dream,37,16.9,185,3000,female,2007
47
- Adelie,Dream,39.6,18.8,190,4600,male,2007
48
- Adelie,Dream,41.1,19,182,3425,male,2007
49
- Adelie,Dream,37.5,18.9,179,2975,NA,2007
50
- Adelie,Dream,36,17.9,190,3450,female,2007
51
- Adelie,Dream,42.3,21.2,191,4150,male,2007
52
- Adelie,Biscoe,39.6,17.7,186,3500,female,2008
53
- Adelie,Biscoe,40.1,18.9,188,4300,male,2008
54
- Adelie,Biscoe,35,17.9,190,3450,female,2008
55
- Adelie,Biscoe,42,19.5,200,4050,male,2008
56
- Adelie,Biscoe,34.5,18.1,187,2900,female,2008
57
- Adelie,Biscoe,41.4,18.6,191,3700,male,2008
58
- Adelie,Biscoe,39,17.5,186,3550,female,2008
59
- Adelie,Biscoe,40.6,18.8,193,3800,male,2008
60
- Adelie,Biscoe,36.5,16.6,181,2850,female,2008
61
- Adelie,Biscoe,37.6,19.1,194,3750,male,2008
62
- Adelie,Biscoe,35.7,16.9,185,3150,female,2008
63
- Adelie,Biscoe,41.3,21.1,195,4400,male,2008
64
- Adelie,Biscoe,37.6,17,185,3600,female,2008
65
- Adelie,Biscoe,41.1,18.2,192,4050,male,2008
66
- Adelie,Biscoe,36.4,17.1,184,2850,female,2008
67
- Adelie,Biscoe,41.6,18,192,3950,male,2008
68
- Adelie,Biscoe,35.5,16.2,195,3350,female,2008
69
- Adelie,Biscoe,41.1,19.1,188,4100,male,2008
70
- Adelie,Torgersen,35.9,16.6,190,3050,female,2008
71
- Adelie,Torgersen,41.8,19.4,198,4450,male,2008
72
- Adelie,Torgersen,33.5,19,190,3600,female,2008
73
- Adelie,Torgersen,39.7,18.4,190,3900,male,2008
74
- Adelie,Torgersen,39.6,17.2,196,3550,female,2008
75
- Adelie,Torgersen,45.8,18.9,197,4150,male,2008
76
- Adelie,Torgersen,35.5,17.5,190,3700,female,2008
77
- Adelie,Torgersen,42.8,18.5,195,4250,male,2008
78
- Adelie,Torgersen,40.9,16.8,191,3700,female,2008
79
- Adelie,Torgersen,37.2,19.4,184,3900,male,2008
80
- Adelie,Torgersen,36.2,16.1,187,3550,female,2008
81
- Adelie,Torgersen,42.1,19.1,195,4000,male,2008
82
- Adelie,Torgersen,34.6,17.2,189,3200,female,2008
83
- Adelie,Torgersen,42.9,17.6,196,4700,male,2008
84
- Adelie,Torgersen,36.7,18.8,187,3800,female,2008
85
- Adelie,Torgersen,35.1,19.4,193,4200,male,2008
86
- Adelie,Dream,37.3,17.8,191,3350,female,2008
87
- Adelie,Dream,41.3,20.3,194,3550,male,2008
88
- Adelie,Dream,36.3,19.5,190,3800,male,2008
89
- Adelie,Dream,36.9,18.6,189,3500,female,2008
90
- Adelie,Dream,38.3,19.2,189,3950,male,2008
91
- Adelie,Dream,38.9,18.8,190,3600,female,2008
92
- Adelie,Dream,35.7,18,202,3550,female,2008
93
- Adelie,Dream,41.1,18.1,205,4300,male,2008
94
- Adelie,Dream,34,17.1,185,3400,female,2008
95
- Adelie,Dream,39.6,18.1,186,4450,male,2008
96
- Adelie,Dream,36.2,17.3,187,3300,female,2008
97
- Adelie,Dream,40.8,18.9,208,4300,male,2008
98
- Adelie,Dream,38.1,18.6,190,3700,female,2008
99
- Adelie,Dream,40.3,18.5,196,4350,male,2008
100
- Adelie,Dream,33.1,16.1,178,2900,female,2008
101
- Adelie,Dream,43.2,18.5,192,4100,male,2008
102
- Adelie,Biscoe,35,17.9,192,3725,female,2009
103
- Adelie,Biscoe,41,20,203,4725,male,2009
104
- Adelie,Biscoe,37.7,16,183,3075,female,2009
105
- Adelie,Biscoe,37.8,20,190,4250,male,2009
106
- Adelie,Biscoe,37.9,18.6,193,2925,female,2009
107
- Adelie,Biscoe,39.7,18.9,184,3550,male,2009
108
- Adelie,Biscoe,38.6,17.2,199,3750,female,2009
109
- Adelie,Biscoe,38.2,20,190,3900,male,2009
110
- Adelie,Biscoe,38.1,17,181,3175,female,2009
111
- Adelie,Biscoe,43.2,19,197,4775,male,2009
112
- Adelie,Biscoe,38.1,16.5,198,3825,female,2009
113
- Adelie,Biscoe,45.6,20.3,191,4600,male,2009
114
- Adelie,Biscoe,39.7,17.7,193,3200,female,2009
115
- Adelie,Biscoe,42.2,19.5,197,4275,male,2009
116
- Adelie,Biscoe,39.6,20.7,191,3900,female,2009
117
- Adelie,Biscoe,42.7,18.3,196,4075,male,2009
118
- Adelie,Torgersen,38.6,17,188,2900,female,2009
119
- Adelie,Torgersen,37.3,20.5,199,3775,male,2009
120
- Adelie,Torgersen,35.7,17,189,3350,female,2009
121
- Adelie,Torgersen,41.1,18.6,189,3325,male,2009
122
- Adelie,Torgersen,36.2,17.2,187,3150,female,2009
123
- Adelie,Torgersen,37.7,19.8,198,3500,male,2009
124
- Adelie,Torgersen,40.2,17,176,3450,female,2009
125
- Adelie,Torgersen,41.4,18.5,202,3875,male,2009
126
- Adelie,Torgersen,35.2,15.9,186,3050,female,2009
127
- Adelie,Torgersen,40.6,19,199,4000,male,2009
128
- Adelie,Torgersen,38.8,17.6,191,3275,female,2009
129
- Adelie,Torgersen,41.5,18.3,195,4300,male,2009
130
- Adelie,Torgersen,39,17.1,191,3050,female,2009
131
- Adelie,Torgersen,44.1,18,210,4000,male,2009
132
- Adelie,Torgersen,38.5,17.9,190,3325,female,2009
133
- Adelie,Torgersen,43.1,19.2,197,3500,male,2009
134
- Adelie,Dream,36.8,18.5,193,3500,female,2009
135
- Adelie,Dream,37.5,18.5,199,4475,male,2009
136
- Adelie,Dream,38.1,17.6,187,3425,female,2009
137
- Adelie,Dream,41.1,17.5,190,3900,male,2009
138
- Adelie,Dream,35.6,17.5,191,3175,female,2009
139
- Adelie,Dream,40.2,20.1,200,3975,male,2009
140
- Adelie,Dream,37,16.5,185,3400,female,2009
141
- Adelie,Dream,39.7,17.9,193,4250,male,2009
142
- Adelie,Dream,40.2,17.1,193,3400,female,2009
143
- Adelie,Dream,40.6,17.2,187,3475,male,2009
144
- Adelie,Dream,32.1,15.5,188,3050,female,2009
145
- Adelie,Dream,40.7,17,190,3725,male,2009
146
- Adelie,Dream,37.3,16.8,192,3000,female,2009
147
- Adelie,Dream,39,18.7,185,3650,male,2009
148
- Adelie,Dream,39.2,18.6,190,4250,male,2009
149
- Adelie,Dream,36.6,18.4,184,3475,female,2009
150
- Adelie,Dream,36,17.8,195,3450,female,2009
151
- Adelie,Dream,37.8,18.1,193,3750,male,2009
152
- Adelie,Dream,36,17.1,187,3700,female,2009
153
- Adelie,Dream,41.5,18.5,201,4000,male,2009
154
- Gentoo,Biscoe,46.1,13.2,211,4500,female,2007
155
- Gentoo,Biscoe,50,16.3,230,5700,male,2007
156
- Gentoo,Biscoe,48.7,14.1,210,4450,female,2007
157
- Gentoo,Biscoe,50,15.2,218,5700,male,2007
158
- Gentoo,Biscoe,47.6,14.5,215,5400,male,2007
159
- Gentoo,Biscoe,46.5,13.5,210,4550,female,2007
160
- Gentoo,Biscoe,45.4,14.6,211,4800,female,2007
161
- Gentoo,Biscoe,46.7,15.3,219,5200,male,2007
162
- Gentoo,Biscoe,43.3,13.4,209,4400,female,2007
163
- Gentoo,Biscoe,46.8,15.4,215,5150,male,2007
164
- Gentoo,Biscoe,40.9,13.7,214,4650,female,2007
165
- Gentoo,Biscoe,49,16.1,216,5550,male,2007
166
- Gentoo,Biscoe,45.5,13.7,214,4650,female,2007
167
- Gentoo,Biscoe,48.4,14.6,213,5850,male,2007
168
- Gentoo,Biscoe,45.8,14.6,210,4200,female,2007
169
- Gentoo,Biscoe,49.3,15.7,217,5850,male,2007
170
- Gentoo,Biscoe,42,13.5,210,4150,female,2007
171
- Gentoo,Biscoe,49.2,15.2,221,6300,male,2007
172
- Gentoo,Biscoe,46.2,14.5,209,4800,female,2007
173
- Gentoo,Biscoe,48.7,15.1,222,5350,male,2007
174
- Gentoo,Biscoe,50.2,14.3,218,5700,male,2007
175
- Gentoo,Biscoe,45.1,14.5,215,5000,female,2007
176
- Gentoo,Biscoe,46.5,14.5,213,4400,female,2007
177
- Gentoo,Biscoe,46.3,15.8,215,5050,male,2007
178
- Gentoo,Biscoe,42.9,13.1,215,5000,female,2007
179
- Gentoo,Biscoe,46.1,15.1,215,5100,male,2007
180
- Gentoo,Biscoe,44.5,14.3,216,4100,NA,2007
181
- Gentoo,Biscoe,47.8,15,215,5650,male,2007
182
- Gentoo,Biscoe,48.2,14.3,210,4600,female,2007
183
- Gentoo,Biscoe,50,15.3,220,5550,male,2007
184
- Gentoo,Biscoe,47.3,15.3,222,5250,male,2007
185
- Gentoo,Biscoe,42.8,14.2,209,4700,female,2007
186
- Gentoo,Biscoe,45.1,14.5,207,5050,female,2007
187
- Gentoo,Biscoe,59.6,17,230,6050,male,2007
188
- Gentoo,Biscoe,49.1,14.8,220,5150,female,2008
189
- Gentoo,Biscoe,48.4,16.3,220,5400,male,2008
190
- Gentoo,Biscoe,42.6,13.7,213,4950,female,2008
191
- Gentoo,Biscoe,44.4,17.3,219,5250,male,2008
192
- Gentoo,Biscoe,44,13.6,208,4350,female,2008
193
- Gentoo,Biscoe,48.7,15.7,208,5350,male,2008
194
- Gentoo,Biscoe,42.7,13.7,208,3950,female,2008
195
- Gentoo,Biscoe,49.6,16,225,5700,male,2008
196
- Gentoo,Biscoe,45.3,13.7,210,4300,female,2008
197
- Gentoo,Biscoe,49.6,15,216,4750,male,2008
198
- Gentoo,Biscoe,50.5,15.9,222,5550,male,2008
199
- Gentoo,Biscoe,43.6,13.9,217,4900,female,2008
200
- Gentoo,Biscoe,45.5,13.9,210,4200,female,2008
201
- Gentoo,Biscoe,50.5,15.9,225,5400,male,2008
202
- Gentoo,Biscoe,44.9,13.3,213,5100,female,2008
203
- Gentoo,Biscoe,45.2,15.8,215,5300,male,2008
204
- Gentoo,Biscoe,46.6,14.2,210,4850,female,2008
205
- Gentoo,Biscoe,48.5,14.1,220,5300,male,2008
206
- Gentoo,Biscoe,45.1,14.4,210,4400,female,2008
207
- Gentoo,Biscoe,50.1,15,225,5000,male,2008
208
- Gentoo,Biscoe,46.5,14.4,217,4900,female,2008
209
- Gentoo,Biscoe,45,15.4,220,5050,male,2008
210
- Gentoo,Biscoe,43.8,13.9,208,4300,female,2008
211
- Gentoo,Biscoe,45.5,15,220,5000,male,2008
212
- Gentoo,Biscoe,43.2,14.5,208,4450,female,2008
213
- Gentoo,Biscoe,50.4,15.3,224,5550,male,2008
214
- Gentoo,Biscoe,45.3,13.8,208,4200,female,2008
215
- Gentoo,Biscoe,46.2,14.9,221,5300,male,2008
216
- Gentoo,Biscoe,45.7,13.9,214,4400,female,2008
217
- Gentoo,Biscoe,54.3,15.7,231,5650,male,2008
218
- Gentoo,Biscoe,45.8,14.2,219,4700,female,2008
219
- Gentoo,Biscoe,49.8,16.8,230,5700,male,2008
220
- Gentoo,Biscoe,46.2,14.4,214,4650,NA,2008
221
- Gentoo,Biscoe,49.5,16.2,229,5800,male,2008
222
- Gentoo,Biscoe,43.5,14.2,220,4700,female,2008
223
- Gentoo,Biscoe,50.7,15,223,5550,male,2008
224
- Gentoo,Biscoe,47.7,15,216,4750,female,2008
225
- Gentoo,Biscoe,46.4,15.6,221,5000,male,2008
226
- Gentoo,Biscoe,48.2,15.6,221,5100,male,2008
227
- Gentoo,Biscoe,46.5,14.8,217,5200,female,2008
228
- Gentoo,Biscoe,46.4,15,216,4700,female,2008
229
- Gentoo,Biscoe,48.6,16,230,5800,male,2008
230
- Gentoo,Biscoe,47.5,14.2,209,4600,female,2008
231
- Gentoo,Biscoe,51.1,16.3,220,6000,male,2008
232
- Gentoo,Biscoe,45.2,13.8,215,4750,female,2008
233
- Gentoo,Biscoe,45.2,16.4,223,5950,male,2008
234
- Gentoo,Biscoe,49.1,14.5,212,4625,female,2009
235
- Gentoo,Biscoe,52.5,15.6,221,5450,male,2009
236
- Gentoo,Biscoe,47.4,14.6,212,4725,female,2009
237
- Gentoo,Biscoe,50,15.9,224,5350,male,2009
238
- Gentoo,Biscoe,44.9,13.8,212,4750,female,2009
239
- Gentoo,Biscoe,50.8,17.3,228,5600,male,2009
240
- Gentoo,Biscoe,43.4,14.4,218,4600,female,2009
241
- Gentoo,Biscoe,51.3,14.2,218,5300,male,2009
242
- Gentoo,Biscoe,47.5,14,212,4875,female,2009
243
- Gentoo,Biscoe,52.1,17,230,5550,male,2009
244
- Gentoo,Biscoe,47.5,15,218,4950,female,2009
245
- Gentoo,Biscoe,52.2,17.1,228,5400,male,2009
246
- Gentoo,Biscoe,45.5,14.5,212,4750,female,2009
247
- Gentoo,Biscoe,49.5,16.1,224,5650,male,2009
248
- Gentoo,Biscoe,44.5,14.7,214,4850,female,2009
249
- Gentoo,Biscoe,50.8,15.7,226,5200,male,2009
250
- Gentoo,Biscoe,49.4,15.8,216,4925,male,2009
251
- Gentoo,Biscoe,46.9,14.6,222,4875,female,2009
252
- Gentoo,Biscoe,48.4,14.4,203,4625,female,2009
253
- Gentoo,Biscoe,51.1,16.5,225,5250,male,2009
254
- Gentoo,Biscoe,48.5,15,219,4850,female,2009
255
- Gentoo,Biscoe,55.9,17,228,5600,male,2009
256
- Gentoo,Biscoe,47.2,15.5,215,4975,female,2009
257
- Gentoo,Biscoe,49.1,15,228,5500,male,2009
258
- Gentoo,Biscoe,47.3,13.8,216,4725,NA,2009
259
- Gentoo,Biscoe,46.8,16.1,215,5500,male,2009
260
- Gentoo,Biscoe,41.7,14.7,210,4700,female,2009
261
- Gentoo,Biscoe,53.4,15.8,219,5500,male,2009
262
- Gentoo,Biscoe,43.3,14,208,4575,female,2009
263
- Gentoo,Biscoe,48.1,15.1,209,5500,male,2009
264
- Gentoo,Biscoe,50.5,15.2,216,5000,female,2009
265
- Gentoo,Biscoe,49.8,15.9,229,5950,male,2009
266
- Gentoo,Biscoe,43.5,15.2,213,4650,female,2009
267
- Gentoo,Biscoe,51.5,16.3,230,5500,male,2009
268
- Gentoo,Biscoe,46.2,14.1,217,4375,female,2009
269
- Gentoo,Biscoe,55.1,16,230,5850,male,2009
270
- Gentoo,Biscoe,44.5,15.7,217,4875,NA,2009
271
- Gentoo,Biscoe,48.8,16.2,222,6000,male,2009
272
- Gentoo,Biscoe,47.2,13.7,214,4925,female,2009
273
- Gentoo,Biscoe,NA,NA,NA,NA,NA,2009
274
- Gentoo,Biscoe,46.8,14.3,215,4850,female,2009
275
- Gentoo,Biscoe,50.4,15.7,222,5750,male,2009
276
- Gentoo,Biscoe,45.2,14.8,212,5200,female,2009
277
- Gentoo,Biscoe,49.9,16.1,213,5400,male,2009
278
- Chinstrap,Dream,46.5,17.9,192,3500,female,2007
279
- Chinstrap,Dream,50,19.5,196,3900,male,2007
280
- Chinstrap,Dream,51.3,19.2,193,3650,male,2007
281
- Chinstrap,Dream,45.4,18.7,188,3525,female,2007
282
- Chinstrap,Dream,52.7,19.8,197,3725,male,2007
283
- Chinstrap,Dream,45.2,17.8,198,3950,female,2007
284
- Chinstrap,Dream,46.1,18.2,178,3250,female,2007
285
- Chinstrap,Dream,51.3,18.2,197,3750,male,2007
286
- Chinstrap,Dream,46,18.9,195,4150,female,2007
287
- Chinstrap,Dream,51.3,19.9,198,3700,male,2007
288
- Chinstrap,Dream,46.6,17.8,193,3800,female,2007
289
- Chinstrap,Dream,51.7,20.3,194,3775,male,2007
290
- Chinstrap,Dream,47,17.3,185,3700,female,2007
291
- Chinstrap,Dream,52,18.1,201,4050,male,2007
292
- Chinstrap,Dream,45.9,17.1,190,3575,female,2007
293
- Chinstrap,Dream,50.5,19.6,201,4050,male,2007
294
- Chinstrap,Dream,50.3,20,197,3300,male,2007
295
- Chinstrap,Dream,58,17.8,181,3700,female,2007
296
- Chinstrap,Dream,46.4,18.6,190,3450,female,2007
297
- Chinstrap,Dream,49.2,18.2,195,4400,male,2007
298
- Chinstrap,Dream,42.4,17.3,181,3600,female,2007
299
- Chinstrap,Dream,48.5,17.5,191,3400,male,2007
300
- Chinstrap,Dream,43.2,16.6,187,2900,female,2007
301
- Chinstrap,Dream,50.6,19.4,193,3800,male,2007
302
- Chinstrap,Dream,46.7,17.9,195,3300,female,2007
303
- Chinstrap,Dream,52,19,197,4150,male,2007
304
- Chinstrap,Dream,50.5,18.4,200,3400,female,2008
305
- Chinstrap,Dream,49.5,19,200,3800,male,2008
306
- Chinstrap,Dream,46.4,17.8,191,3700,female,2008
307
- Chinstrap,Dream,52.8,20,205,4550,male,2008
308
- Chinstrap,Dream,40.9,16.6,187,3200,female,2008
309
- Chinstrap,Dream,54.2,20.8,201,4300,male,2008
310
- Chinstrap,Dream,42.5,16.7,187,3350,female,2008
311
- Chinstrap,Dream,51,18.8,203,4100,male,2008
312
- Chinstrap,Dream,49.7,18.6,195,3600,male,2008
313
- Chinstrap,Dream,47.5,16.8,199,3900,female,2008
314
- Chinstrap,Dream,47.6,18.3,195,3850,female,2008
315
- Chinstrap,Dream,52,20.7,210,4800,male,2008
316
- Chinstrap,Dream,46.9,16.6,192,2700,female,2008
317
- Chinstrap,Dream,53.5,19.9,205,4500,male,2008
318
- Chinstrap,Dream,49,19.5,210,3950,male,2008
319
- Chinstrap,Dream,46.2,17.5,187,3650,female,2008
320
- Chinstrap,Dream,50.9,19.1,196,3550,male,2008
321
- Chinstrap,Dream,45.5,17,196,3500,female,2008
322
- Chinstrap,Dream,50.9,17.9,196,3675,female,2009
323
- Chinstrap,Dream,50.8,18.5,201,4450,male,2009
324
- Chinstrap,Dream,50.1,17.9,190,3400,female,2009
325
- Chinstrap,Dream,49,19.6,212,4300,male,2009
326
- Chinstrap,Dream,51.5,18.7,187,3250,male,2009
327
- Chinstrap,Dream,49.8,17.3,198,3675,female,2009
328
- Chinstrap,Dream,48.1,16.4,199,3325,female,2009
329
- Chinstrap,Dream,51.4,19,201,3950,male,2009
330
- Chinstrap,Dream,45.7,17.3,193,3600,female,2009
331
- Chinstrap,Dream,50.7,19.7,203,4050,male,2009
332
- Chinstrap,Dream,42.5,17.3,187,3350,female,2009
333
- Chinstrap,Dream,52.2,18.8,197,3450,male,2009
334
- Chinstrap,Dream,45.2,16.6,191,3250,female,2009
335
- Chinstrap,Dream,49.3,19.9,203,4050,male,2009
336
- Chinstrap,Dream,50.2,18.8,202,3800,male,2009
337
- Chinstrap,Dream,45.6,19.4,194,3525,female,2009
338
- Chinstrap,Dream,51.9,19.5,206,3950,male,2009
339
- Chinstrap,Dream,46.8,16.5,189,3650,female,2009
340
- Chinstrap,Dream,45.7,17,195,3650,female,2009
341
- Chinstrap,Dream,55.8,19.8,207,4000,male,2009
342
- Chinstrap,Dream,43.5,18.1,202,3400,female,2009
343
- Chinstrap,Dream,49.6,18.2,193,3775,male,2009
344
- Chinstrap,Dream,50.8,19,210,4100,male,2009
345
- Chinstrap,Dream,50.2,18.7,198,3775,female,2009
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
www/SVL_logo.webp ADDED
www/favicon.png ADDED
www/globals.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ // highlight object on load using CSS animation
2
+ // window.addEventListener("load", function () {
3
+ // const elementToHighlight = document.querySelector(".rthelp"); // Replace with your element's CSS selector
4
+
5
+ // if (elementToHighlight) {
6
+ // elementToHighlight.style.borderColor = "transparent"; // Set initial transparent border
7
+ // elementToHighlight.classList.add("highlight-animation"); // Add animation class
8
+ // }
9
+ // });
www/rtemis_gray.png ADDED
www/rtemisbio_gray.png ADDED
www/rtemisbio_s.webp ADDED
www/rtemislive.scss ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* rtemislive.scss */
2
+
3
+ /* rthelp */
4
+ .rthelp {
5
+ position: fixed !important;
6
+ top: 33% !important;
7
+ left: 50% !important;
8
+ transform: translate(-50%, -50%);
9
+ color: $info !important;
10
+ margin: 11px;
11
+ border: 0.5px solid transparent;
12
+ border-radius: 10px;
13
+ padding: 11px;
14
+ }
15
+
16
+ .rthelp-inline {
17
+ display: inline-block;
18
+ color: $info !important;
19
+ margin: 11px;
20
+ border: 0.5px solid transparent;
21
+ border-radius: 10px;
22
+ padding: 11px;
23
+ text-align: left;
24
+ }
25
+
26
+ // modify bs link color only for body links
27
+ // card-body a {
28
+ // color: $primary !important;
29
+ // }
30
+
31
+ .rt-tooltip {
32
+ background-color: #282828aa;
33
+ color: orange;
34
+ border-radius: 10px;
35
+ }
36
+
37
+ // Border animation
38
+ .rthelp,
39
+ .rthelp-inline {
40
+ // animation: highlight-border 1s ease-in-out forwards;
41
+ animation-name: highlight-border;
42
+ animation-duration: 6s;
43
+ animation-timing-function: ease-in-out;
44
+ // animation-fill-mode: forwards;
45
+ animation-iteration-count: infinite;
46
+ }
47
+
48
+ @keyframes highlight-border {
49
+ 0% {
50
+ border-color: transparent;
51
+ }
52
+
53
+ 50% {
54
+ border-color: $info;
55
+ }
56
+
57
+ 100% {
58
+ border-color: transparent;
59
+ }
60
+ }
61
+
62
+ // theme switch
63
+ #lightson {
64
+ margin-top: auto;
65
+ margin-bottom: auto;
66
+ }
www/rtemislive_gray.png ADDED
www/svl.webp ADDED