server.R 119 KB
Newer Older
stevenn's avatar
stevenn committed
1
shinyServer(function(input, output,session) {
svolant's avatar
svolant committed
2
3
4

  hide(id = "loading-content", anim = TRUE, animType = "fade",time=1.5)
  hide(id = "loading-content-bar", anim = TRUE, animType = "fade",time=1.5)
5
6
7
8
9
  #####################################################
  ##
  ##                    LOAD FILES
  ##
  #####################################################
stevenn's avatar
stevenn committed
10
  
11
12
  
  
stevenn's avatar
stevenn committed
13
14
  ## Create base for contrast
  rand = floor(runif(1,0,1e9))
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
15
  namesfile = tempfile(pattern = "BaseContrast", tmpdir = tempdir(), fileext = "")
stevenn's avatar
stevenn committed
16
  file.create(namesfile,showWarnings=FALSE)
17
  target = NULL
18
  
svolant's avatar
svolant committed
19
20
21
22
  
  ## JSON name for masque
  curdir  = getwd()
  json_name = tempfile(pattern = "file", tmpdir = paste(curdir,"www","masque","todo",sep= .Platform$file.sep),  fileext = ".json")
svolant's avatar
svolant committed
23

svolant's avatar
svolant committed
24
25
26
  ## Pass for MASQUE
  pass = gsub("file","",basename(file_path_sans_ext(json_name)))
  
svolant's avatar
svolant committed
27
  ## Popup messages
svolant's avatar
svolant committed
28
  observe(if(input$AddRegScatter) info("By adding the regression line, you will lose interactivity."))
29
  
30
  ## Reactive target
svolant's avatar
svolant committed
31
32
  values <- reactiveValues(TargetWorking = target,labeled=NULL,fastq_names_only=NULL,R1fastQ=NULL,R2fastQ=NULL,
                           json_name=json_name,num=0,pass=pass,login_email = NULL,is.valid =NULL,
svolant's avatar
svolant committed
33
                           biom_masque = NULL,tree_masque=NULL,masque_key = NULL,paths_fastq_tmp=NULL,curdir=curdir)
34
  
stevenn's avatar
stevenn committed
35
  ## Counts file
stevenn's avatar
stevenn committed
36
  dataInputCounts <-reactive({ 
37
    
svolant's avatar
svolant committed
38
    data = NULL
stevenn's avatar
stevenn committed
39
    inFile <- input$fileCounts
40
    
stevenn's avatar
stevenn committed
41
    if (is.null(inFile)) return(NULL)
42
43
    
    
svolant's avatar
svolant committed
44
45
46
47
    tryCatch(read.csv(inFile$datapath,sep=input$sepcount,header=TRUE,check.names=FALSE)->data,
             error=function(e) sendSweetAlert(messageId="ErrorCounts",
                                              title = "Oops",
                                              text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
svolant's avatar
svolant committed
48
49
50
51
52

    if(!is.null(data)){
      colnames(data) = gsub("-",".",colnames(data))
      ## Rownames
      if(!TRUE%in%duplicated(data[,1])) rownames(data)=data[,1];data=data[,-1]
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
53
      try(round(data, 0)->data, silent=T)
svolant's avatar
svolant committed
54
    }
stevenn's avatar
stevenn committed
55
56
57
    return(as.data.frame(data))
  })
  
58
59
  
  
stevenn's avatar
stevenn committed
60
61
  ## Taxo File
  dataInputTaxo <-reactive({ 
stevenn's avatar
stevenn committed
62
    
stevenn's avatar
stevenn committed
63
    inFile <- input$fileTaxo
stevenn's avatar
stevenn committed
64
    
stevenn's avatar
stevenn committed
65
    if (is.null(inFile)) return(NULL)
66
    
Stevenn Volant's avatar
Stevenn Volant committed
67
68
    if(input$TypeTaxo=="Table") 
    {
svolant's avatar
svolant committed
69
70
71
72
      tryCatch(read.csv(inFile$datapath,sep=input$septaxo,header=TRUE)->data,
               error=function(e) sendSweetAlert(messageId="ErrorTaxo",
                                                title = "Oops",
                                                text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
svolant's avatar
svolant committed
73
    
Stevenn Volant's avatar
Stevenn Volant committed
74
      ## Rownames
svolant's avatar
svolant committed
75
76
77
78
79
80
81
82
83
      if(!is.null(data))
      {
        if(!TRUE%in%duplicated(data[,1])){ 
          DataNames=data[,1]
          colNames=colnames(data)[-1]
          data=as.matrix(data[,-1])
          rownames(data)=DataNames
          colnames(data) = colNames
        }
84
      }
Stevenn Volant's avatar
Stevenn Volant committed
85
    }
stevenn's avatar
stevenn committed
86
    
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
87
88
    if(input$TypeTaxo=="RDP") 
    {
svolant's avatar
svolant committed
89
90
91
92
93
      tryCatch(read_rdp(inFile$datapath,input$RDP_th)->data,
               error=function(e) sendSweetAlert(messageId="ErrorRDP",
                                                title = "Oops",
                                                text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
      
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
94
    }
stevenn's avatar
stevenn committed
95
96
97
    
    ## Add NA
    data=as.matrix(data)
Stevenn Volant's avatar
Stevenn Volant committed
98
    indNa = which(data=="")
stevenn's avatar
stevenn committed
99
100
    data[indNa]=NA
    
stevenn's avatar
stevenn committed
101
    return(as.data.frame(data))
stevenn's avatar
stevenn committed
102
  })
103
104
  
  
stevenn's avatar
stevenn committed
105
106
  ## BIOM File
  dataInputBiom <-reactive({ 
stevenn's avatar
stevenn committed
107
    
svolant's avatar
svolant committed
108
    data = NULL
stevenn's avatar
stevenn committed
109
    inFile <- input$fileBiom
svolant's avatar
svolant committed
110
111

    if (!is.null(inFile) && is.null(values$biom_masque)) {
svolant's avatar
svolant committed
112
113
114
115
      tryCatch(read_biom(inFile$datapath)->data,
               error=function(e) sendSweetAlert(messageId="ErrorBiom1",
                                                title = "Oops",
                                                text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
stevenn's avatar
stevenn committed
116
    
svolant's avatar
svolant committed
117
118
119
120
121
122
123
      }
    if (!is.null(values$biom_masque) && file.exists(values$biom_masque)){ 
      tryCatch(read_biom(values$biom_masque)->data,
               error=function(e) sendSweetAlert(messageId="ErrorBiom2",
                                                title = "Oops",
                                                text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
    }
stevenn's avatar
stevenn committed
124
    return(data)
stevenn's avatar
stevenn committed
125
  })
126
  
svolant's avatar
svolant committed
127
128
129
130
  
  observeEvent(input$fileBiom,{
    values$biom_masque=NULL;
  })
svolant's avatar
svolant committed
131

132
  
svolant's avatar
svolant committed
133
134
135
136
137
138
  ## Unifrac File (tree)
  dataInputTree <-reactive({ 
    
    data = NULL
    inFile <- input$fileTree
    
svolant's avatar
svolant committed
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    if (!is.null(inFile) && is.null(values$tree_masque)) {
      try(read.tree(inFile$datapath)->data, silent=T)
      CheckTree = CheckTreeFile(data)
      data = CheckTree$tree
      try(readLines(inFile$datapath)->treeseq, silent=T)
      return(list(data=data, Error=CheckTree$Error, Warning=CheckTree$Warning, treeseq=treeseq))
    }
    
    if (!is.null(values$tree_masque) && file.exists(values$tree_masque)) {
      try(read.tree(values$tree_masque)->data, silent=T)
      CheckTree = CheckTreeFile(data)
      data = CheckTree$tree
      try(readLines(values$tree_masque)->treeseq, silent=T)
      return(list(data=data, Error=CheckTree$Error, Warning=CheckTree$Warning, treeseq=treeseq))
    }

  })
  
  
  observeEvent(input$fileTree,{
    values$tree_masque=NULL;
svolant's avatar
svolant committed
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  })
  
  
  # Infobox Tree (Unifrac)
  output$InfoTreePhylo_box <- renderInfoBox({
    input$fileTree
    tree_tmp = isolate(dataInputTree())
    tree = tree_tmp$data
    
    res = infoBox(h6(strong("Phylogenetic tree")), subtitle = h6(strong("Load the phylogenetic tree (optional)")) ,color = "light-blue",width=NULL,fill=TRUE, icon = icon("upload"))
    if(!is.null(tree)){
      if(!is.null(isolate(input$fileTree))){
        res = infoBox(h6(strong("Phylogenetic tree")), subtitle = h6("The phylogenetic has been loaded") ,color = "green",width=NULL,fill=TRUE, icon = icon("thumbs-o-up"))
        if(!is.null(tree_tmp$Warning)){      
          res = infoBox(h6(strong("Phylogenetic tree")), subtitle = h6(tree_tmp$Warning) ,color = "orange",width=NULL,fill=TRUE, icon = icon("warning"))
        }
        if(!is.null(tree_tmp$Error)){      
          res = infoBox(h6(strong("Phylogenetic tree")), subtitle = h6(tree_tmp$Error),color = "red",width=NULL,fill=TRUE, icon = icon("thumbs-o-down"))
        }
      }
    } 
    return(res)
  })
183

184
  
stevenn's avatar
stevenn committed
185
186
  ## Input data
  dataInput <-reactive({ 
stevenn's avatar
stevenn committed
187
    
stevenn's avatar
stevenn committed
188
    data = NULL
Stevenn Volant's avatar
Stevenn Volant committed
189
190
    check = NULL
    percent = NULL
svolant's avatar
svolant committed
191
192
    Taxo = NULL
    Counts = NULL
svolant's avatar
svolant committed
193
194
    inputData = NULL
    
stevenn's avatar
stevenn committed
195
    if(input$FileFormat=="fileCounts")
stevenn's avatar
stevenn committed
196
    {
stevenn's avatar
stevenn committed
197
      Counts = dataInputCounts()
svolant's avatar
svolant committed
198
199
200
      if(!input$NoTaxoFile) Taxo = dataInputTaxo()
      if(!is.null(Counts) && input$NoTaxoFile) {Taxo = data.frame(rownames(Counts),row.names = rownames(Counts));names(Taxo)=NA}
      
Stevenn Volant's avatar
Stevenn Volant committed
201
202
      if(!is.null(Counts) && !is.null(Taxo))
      { 
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
203
        tmp = GetDataFromCT(Counts,Taxo, ifelse(input$TypeTable=="MGS" && input$FileFormat!="fileBiom", TRUE, FALSE))
Stevenn Volant's avatar
Stevenn Volant committed
204
        data = list(counts=tmp$counts,taxo=tmp$taxo)
svolant's avatar
svolant committed
205
206
207
        ## Remove row with only O
        # data[["counts"]] = data[["counts"]][rowSums(data[["counts"]])>1,]
        
Stevenn Volant's avatar
Stevenn Volant committed
208
209
210
        check = list(CheckCounts=tmp$CheckCounts,CheckTaxo=tmp$CheckTaxo,CheckPercent=tmp$CheckPercent)
        percent = tmp$Percent
      }    
stevenn's avatar
stevenn committed
211
212
    }
    
stevenn's avatar
stevenn committed
213
    if(input$FileFormat=="fileBiom")
stevenn's avatar
stevenn committed
214
    {
stevenn's avatar
stevenn committed
215
      tmpBIOM = dataInputBiom()
Stevenn Volant's avatar
Stevenn Volant committed
216
217
218
219
      if(!is.null(tmpBIOM))
      {
        tmp = GetDataFromBIOM(tmpBIOM)
        data = list(counts=tmp$counts,taxo=tmp$taxo)
svolant's avatar
svolant committed
220
221
222
        ## Remove row with only O
        # data[["counts"]] = data[["counts"]][rowSums(data[["counts"]])>1,]
        
Stevenn Volant's avatar
Stevenn Volant committed
223
224
225
        check = list(CheckCounts=tmp$CheckCounts,CheckTaxo=tmp$CheckTaxo,CheckPercent=tmp$CheckPercent)
        percent = tmp$Percent
      }
stevenn's avatar
stevenn committed
226
227
    }
    
svolant's avatar
svolant committed
228
229
    

svolant's avatar
svolant committed
230
231
232
233
234
235
236
237
238
239
240
#     if(input$FileFormat=="fileRData")
#     {
#       inFile <- input$fileRData
#       load(inFile)
#       if(!is.null(inputData)){
#         data = inputData$data
#         check = inputData$check
#         percent = inputData$percent
#       }
#     }
    
Stevenn Volant's avatar
Stevenn Volant committed
241
    return(list(data=data,check=check,percent=percent))
stevenn's avatar
stevenn committed
242
243
244
  })
  
  
245
246
247
248
249
250
251
  ## Size factor file (optional)
  dataSizeFactors <-reactive({ 
    
    inFile <- input$fileSizeFactors
    
    if (is.null(inFile)) return(NULL)
    
svolant's avatar
svolant committed
252
253
254
255
    tryCatch(read.csv(inFile$datapath,sep=input$sepsize,header=TRUE)->data,
             error=function(e) sendSweetAlert(messageId="ErrorSizeFactor",
                                              title = "Oops",
                                              text=paste("Your file can not be read in SHAMAN.\n \n",e),type ="error"))
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
    return(as.data.frame(data))
  })
  
  
  ## Size factor file (optional)
  SizeFactors_fromFile <-reactive({ 
    
    Error = NULL
    Check = TRUE
    
    data = dataSizeFactors()
    normFactors = dataMergeCounts()$normFactors
    
    if(!is.null(data)){
      ## Check the format
      
      tmp = as.numeric(data)
      names(tmp) = colnames(data)
      
      if(length(tmp)!=length(normFactors)){Error = "The number of samples is not the same than in the target file, size factors will be estimated"; Check = FALSE}
      if(!identical(names(tmp),names(normFactors))){Error = "The names are not the same or in the same order than in the target file, size factors will be estimated"; Check = FALSE}
277
      
278
279
280
281
282
283
284
285
286
287
288
      if(Check) normFactors = tmp
    }
    
    return(list(Check = Check,Error = Error,normFactors=normFactors))
  })
  
  
  
  
  
  
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
289
  ## Merge counts data
290
  dataMergeCounts <-reactive({
Stevenn Volant's avatar
Stevenn Volant committed
291
    input$RunDESeq
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
292
293
294
    
    counts = NULL
    CheckTarget = FALSE
295
    normFactors = NULL
Stevenn Volant's avatar
Stevenn Volant committed
296
    CT_noNorm = NULL
297
    CT_Norm = NULL
298
    ChTM = NULL
299
    data = isolate(dataInput()$data)
300
301
    target = isolate(values$TargetWorking)
    labeled= isolate(values$labeled)
302
    taxo = isolate(input$TaxoSelect)
303
    withProgress(
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
304
305
    if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0 && !is.null(taxo) && taxo!="..." && !is.null(target)) 
    {
svolant's avatar
svolant committed
306
      design = GetDesign(isolate(input),target)
307
308
      ChTM = CheckTargetModel(input,target,labeled,data$counts)$Error
      if(!is.null(design) && is.null(ChTM))
309
      {
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
        tmp = isolate(GetCountsMerge(input,data,taxo,target,design))
        counts = tmp$counts
        ## Filtering the counts
        if(isolate(input$AddFilter) && !is.null(isolate(input$SliderThSamp)) && !is.null(isolate(input$SliderThAb)))
        {
          ind.filter =Filtered_feature(counts,isolate(input$SliderThSamp),isolate(input$SliderThAb))$ind
          counts = counts[-ind.filter,]
        }
        CheckTarget = tmp$CheckTarget
        #target = tmp$target
        #labeled = tmp$labeled
        normFactors = tmp$normFactors
        ## OTU table, norm and no norm
        CT_noNorm = tmp$CT_noNorm
        CT_Norm = tmp$CT_Norm
325
      }
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
326
    }
327
    ,message="Merging the counts ...")
328
    return(list(counts=counts,CheckTarget=CheckTarget,normFactors=normFactors,CT_noNorm=CT_noNorm, CT_Norm=CT_Norm))
329
    #return(list(counts=counts,target=target,labeled=labeled,normFactors=normFactors,CT_noNorm=CT_noNorm))
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
330
  })
331
332
  
  
Stevenn Volant's avatar
Stevenn Volant committed
333
334
335
336
337
338
339
  # Infobox Error counts
  output$InfoErrorCounts <- renderInfoBox({
    
    tmp = dataInput()
    data = tmp$data
    check = tmp$check
    cond = (!is.null(data$counts) && nrow(data$counts)>0)
340
    res =infoBox(h6(strong("Count table")), subtitle = h6("Load the count table") ,color = "light-blue",width=NULL,fill=TRUE, icon = icon("upload"))
Stevenn Volant's avatar
Stevenn Volant committed
341
342
343
    
    if(cond)
    {
344
345
346
      if(!is.null(check$CheckCounts$Warning)) res = infoBox(h6(strong("Count table")), subtitle = h6(check$CheckCounts$Warning), icon = icon("warning"),color = "orange",width=NULL,fill=TRUE)
      if(!is.null(check$CheckCounts$Error)) res = infoBox(h6(strong("Count table")), subtitle = h6(check$CheckCounts$Error), icon = icon("thumbs-o-down"),color = "red",width=NULL,fill=TRUE)
      if(is.null(check$CheckCounts$Error) && is.null(check$CheckCounts$Warning)) res = infoBox(h6(strong("Count table")), subtitle = h6(paste("Format of the count table seems to be OK")), icon = icon("thumbs-o-up"),color = "green",width=NULL,fill=TRUE)
Stevenn Volant's avatar
Stevenn Volant committed
347
348
349
350
    }
    
    return(res)
  })
351
  
Stevenn Volant's avatar
Stevenn Volant committed
352
353
354
355
356
357
358
  # Infobox Error counts
  output$InfoErrorTaxo <- renderInfoBox({
    
    tmp = dataInput()
    data = tmp$data
    check = tmp$check
    cond = (!is.null(data$taxo) && nrow(data$taxo)>0)
svolant's avatar
svolant committed
359
    res = infoBox(h6(strong("Taxonomy table")), subtitle = h6("Load the taxonomy table") ,color = "light-blue",width=NULL,fill=TRUE, icon = icon("upload"))
Stevenn Volant's avatar
Stevenn Volant committed
360
361
362
363
364
365
366
367
    
    if(cond)
    {
      if(!is.null(check$CheckTaxo$Warning)) res = infoBox(h6(strong("Taxonomy table")), subtitle = h6(check$CheckTaxo$Warning), icon = icon("warning"),color = "orange",width=NULL,fill=TRUE)
      if(!is.null(check$CheckTaxo$Error)) res = infoBox(h6(strong("Taxonomy table")), subtitle = h6(check$CheckTaxo$Error), icon = icon("thumbs-o-down"),color = "red",width=NULL,fill=TRUE)
      if(is.null(check$CheckTaxo$Error) && is.null(check$CheckTaxo$Warning)) res = infoBox(h6(strong("Taxonomy table")), subtitle = h6(paste("Format of the taxonomy table seems to be OK")), icon = icon("thumbs-o-up"),color = "green",width=NULL,fill=TRUE)
    }
    
svolant's avatar
svolant committed
368
    if(input$NoTaxoFile && input$FileFormat=="fileCounts") res = infoBox(h6(strong("Taxonomy table")), subtitle = h6("No taxonomy table has been uploaded, the analysis can only be done at the OTU/gene level"), icon = icon("warning"),color = "orange",width=NULL,fill=TRUE)
Stevenn Volant's avatar
Stevenn Volant committed
369
370
    return(res)
  })
371
372
  
  
Stevenn Volant's avatar
Stevenn Volant committed
373
374
375
376
377
378
379
  # Infobox Error counts
  output$valueErrorPercent <- renderInfoBox({
    
    tmp = dataInput()
    data = tmp$data
    check = tmp$check
    cond = (!is.null(data$counts) && nrow(data$counts)>0 && !is.null(data$taxo) && nrow(data$taxo)>0)
380
    res = shinydashboard::valueBox(paste0(0, "%"),h6(strong("Annotated features")), color = "light-blue",width=NULL,icon = icon("list"))
svolant's avatar
svolant committed
381

Stevenn Volant's avatar
Stevenn Volant committed
382
383
384
    if(cond)
    {
      percent = round(100*tmp$percent,2)
385
386
      if(percent==0) res = shinydashboard::valueBox(paste0(percent, "%"),h6(strong("Annotated features")), color = "red",width=NULL,icon = icon("list"))  
      if(percent!=0) res = shinydashboard::valueBox(paste0(percent, "%"),h6(strong("Annotated features")), color = "green",width=NULL,icon = icon("list"))  
Stevenn Volant's avatar
Stevenn Volant committed
387
388
389
390
391
      
    }
    
    return(res)
  })
stevenn's avatar
stevenn committed
392
  
393
  
394
395
396
397
398
399
400
401
  ####### Filtering the counts (sliders)
  
  output$ThAb <- renderUI({
    input$AddFilter
    
    res = NULL
    counts = isolate(dataMergeCounts()$counts)
    tot = rowSums(counts)
402
    #save(counts,tot,file="testFilter.RData")
403
    withProgress({tmp = SelectThreshAb(counts,lambda=max(round(sum(counts)/nrow(counts)*0.05),min(tot)+1),graph=FALSE)},message="Loading...")
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
    
    res = sliderInput("SliderThAb","Threshold on the total abundance (in log)",min=0,max=round(max(log(tot+1)),1),value = log(tmp+1))
    return(res)
  })
  
  
  output$ThSamp <- renderUI({
    input$AddFilter
    
    res = NULL
    counts = isolate(dataMergeCounts()$counts)
    counts.bin = as.matrix(counts)
    counts.bin[which(counts>0)] = 1
    nbSampByFeat = rowSums(counts.bin)
    
    ## Default value
    val = round(max(nbSampByFeat)*0.2)
    
    res = sliderInput("SliderThSamp","Threshold on the minimal number of samples",min=0,max=max(nbSampByFeat),value = val)
    return(res)
  })
  
  
  ## Plot for the filtering step$
  
  # plot_filter(counts,th.samp,th.abund,type="Scatter")
  
431
  output$Plot_ThAb <- renderPlot({
432
433
434
435
436
437
    counts = dataMergeCounts()$counts
    ## output of plot_filter is ggplot class
    plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Abundance")
    
  })
    
438
  output$Plot_ThSamp <- renderPlot({
439
440
441
442
    counts = dataMergeCounts()$counts
    ## output of plot_filter is ggplot class
    plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Samples")
  })
443
  
444
445
446
447
448
  output$Plot_Scatter_Filter <- renderScatterD3({
    counts = dataMergeCounts()$counts
    ## output of plot_filter is ggplot class
    plot_filter(counts,input$SliderThSamp,input$SliderThAb,type="Scatter")
  })
449
450
451
452
453
  #####################################################
  ##
  ##                DYNAMIC MENU
  ##
  #####################################################
stevenn's avatar
stevenn committed
454
455
456
457
458
  
  
  
  output$dymMenu <- renderMenu({
    
Stevenn Volant's avatar
Stevenn Volant committed
459
460
461
    tmp = dataInput()
    data = tmp$data
    check = tmp$check
stevenn's avatar
stevenn committed
462
    
Stevenn Volant's avatar
Stevenn Volant committed
463
464
465
    ## Check error in the counts and taxonomy table 
    CheckOK = (is.null(check$CheckCounts$Error) && is.null(check$CheckTaxo$Error)  && is.null(check$CheckPercent))
    if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0 && CheckOK)
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
466
    {
svolant's avatar
svolant committed
467

svolant's avatar
svolant committed
468
      sidebarMenu(id = "side",
stevenn's avatar
stevenn committed
469
470
        menuItem("Statistical analysis",
                 menuSubItem("Run differential analysis",tabName="RunDiff"),
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
471
                 menuSubItem("Diagnostic plots",tabName="DiagPlotTab"),
stevenn's avatar
stevenn committed
472
                 menuSubItem("Tables",tabName="TableDiff"),
473
474
                 icon = icon("bar-chart-o"), tabName = "AnaStat"
        ),
475
476
477
        menuItem("Visualization",icon = icon("area-chart"),
                 menuSubItem("Global views",tabName="GlobVisu"),
                 menuSubItem("Comparison plots",tabName="CompPlot"),
Amine  GHOZLANE's avatar
Amine GHOZLANE committed
478
479
                 tabName = "Visu")
        #menuItem("Perspective plots", icon = icon("pie-chart"), tabName = "Krona")
stevenn's avatar
stevenn committed
480
      )
svolant's avatar
svolant committed
481
    } else{ sidebarMenu(id = "side",NULL)}
svolant's avatar
svolant committed
482

stevenn's avatar
stevenn committed
483
484
485
  })
  
  
486
  
stevenn's avatar
stevenn committed
487
488
489
490
491
492
493
  #####################################################
  ##
  ##                DATA TABLE
  ##
  #####################################################
  
  ## Counts Table
494
  output$DataCounts <- DT::renderDataTable(
Stevenn Volant's avatar
Stevenn Volant committed
495
    dataInput()$data$counts, 
stevenn's avatar
stevenn committed
496
    options = list(lengthMenu = list(c(10, 50, -1), c('10', '50', 'All')),
497
                   pageLength = 10,scrollX=TRUE, processing=FALSE
stevenn's avatar
stevenn committed
498
499
    ))
  
500
  ## Counts Table
501
502
503
504
505
506
507
  output$DataVenn<- DT::renderDataTable(#{
    #SelContrast = input$ContrastList_table_FC
    #resDiff = ResDiffAnal()
    #BaseContrast = read.table(namesfile,header=TRUE)
    GetData_venn(input,input$ContrastList_table_FC,read.table(namesfile,header=TRUE),ResDiffAnal())$df.tot,
  #}
   options = list(lengthMenu = list(c(10, 50, -1), c('10', '50', 'All')),
508
                    pageLength = 10,scrollX=TRUE, processing=FALSE
509
  ))
510
511
  
  
stevenn's avatar
stevenn committed
512
  ## Taxonomy table
513
  output$DataTaxo <- DT::renderDataTable(
Stevenn Volant's avatar
Stevenn Volant committed
514
    dataInput()$data$taxo, 
stevenn's avatar
stevenn committed
515
    options = list(lengthMenu = list(c(10, 50, -1), c('10', '50', 'All')),
svolant's avatar
svolant committed
516
                   pageLength = 10,scrollX=TRUE, processing=FALSE
stevenn's avatar
stevenn committed
517
    ))
518
  
stevenn's avatar
stevenn committed
519
  
stevenn's avatar
stevenn committed
520
  ## Tab box for data visualisation
stevenn's avatar
stevenn committed
521
  output$TabBoxData <- renderUI({
522
    tree = dataInputTree()$data
Stevenn Volant's avatar
Stevenn Volant committed
523
    data=dataInput()$data
svolant's avatar
svolant committed
524
525
    res=NULL
    if(!is.null(tree))
526
    {
527
     res = tabBox(width = NULL, selected = "Count table",
528
529
530
531
532
             tabPanel("Count table",DT::dataTableOutput("DataCounts")),
             tabPanel("Taxonomy",DT::dataTableOutput("DataTaxo")),
             tabPanel("Summary",h5(strong("Percentage of annotation")),htmlOutput("SummaryView"),
                      br(),h5(strong("Number of features by level:")),plotOutput("SummaryViewBarplot",width = 1200,height=500)),
             tabPanel("Phylogeny", PhyloTreeMetaROutput('PhyloTreeMetaR'))
svolant's avatar
svolant committed
533
534
     )
            
535
    }
svolant's avatar
svolant committed
536
    else if(is.null(tree))
stevenn's avatar
stevenn committed
537
    {
538
     res = tabBox(width = NULL,selected = "Count table",
539
540
             tabPanel("Count table",DT::dataTableOutput("DataCounts")),
             tabPanel("Taxonomy",DT::dataTableOutput("DataTaxo")),
svolant's avatar
svolant committed
541
542
             tabPanel("Summary",h5(strong("Percentage of annotation")),htmlOutput("SummaryView"),
                      br(),h5(strong("Number of features by level:")),plotOutput("SummaryViewBarplot",width = 1200,height=500))
svolant's avatar
svolant committed
543
544
             )
      
stevenn's avatar
stevenn committed
545
    }
svolant's avatar
svolant committed
546
547
548
549
550
551
552
553
554
    return(res)
  })
  
  observe({
    data=dataInput()$data
    if(!is.null(data$counts) && !is.null(data$taxo) && nrow(data$counts)>0 && nrow(data$taxo)>0)
    {
        showElement("tabboxdata_col",anim=TRUE)
    } else hideElement("tabboxdata_col",anim=TRUE)
stevenn's avatar
stevenn committed
555
    
stevenn's avatar
stevenn committed
556
  })
557
  
558
559
560
561
  output$PhyloTreeMetaR <- renderPhyloTreeMetaR({
    PhyloTreeMetaR(dataInputTree()$treeseq,NULL)
  })
  
svolant's avatar
svolant committed
562
  output$SummaryView <- renderGvis({
svolant's avatar
svolant committed
563
564
    tmp = dataInput()
    data = tmp$data
svolant's avatar
svolant committed
565
566
    taxo = data$taxo
    counts = data$counts
svolant's avatar
svolant committed
567
568
569
    check = tmp$check
    cond = (!is.null(data$counts) && nrow(data$counts)>0 && !is.null(data$taxo) && nrow(data$taxo)>0 && is.null(check$CheckTaxo$Error) && is.null(check$CheckCounts$Error))
  
svolant's avatar
svolant committed
570
    res = NULL
svolant's avatar
svolant committed
571
    if(cond)
svolant's avatar
svolant committed
572
    {
svolant's avatar
svolant committed
573
      taxo = rbind(taxo,rep(NA,ncol(taxo)))
574
575
576
577
578
579
580
581
582
583
584
585
586
587
      #tmpPercent = round(apply(is.na(taxo),2,table)["FALSE",]/(nrow(taxo)-1)*100,2)
      
      tmp = apply(is.na(taxo),2,table)
      
      if (class(tmp) == "list") {
        tmp2 = sapply(tmp, function (x) {if (! "FALSE" %in% names(x)) {x["FALSE"] = 0} ; return(x["FALSE"])})
      }
      else
      {
        tmp2 = tmp["FALSE",]
      }
      
      tmpPercent = round(tmp2/(nrow(taxo)-1)*100,2)
      
588
      
svolant's avatar
svolant committed
589
      df <- data.frame(Label = colnames(taxo),Value = tmpPercent)
590
      
svolant's avatar
svolant committed
591
      res = gvisGauge(df,options=list(min=0, max=100, greenFrom=80,
592
593
                                      greenTo=100, yellowFrom=60, yellowTo=80,
                                      redFrom=0, redTo=60, width=1200, height=300))
svolant's avatar
svolant committed
594
595
596
597
598
599
    }
    return(res)
  })
  
  
  output$SummaryViewBarplot <- renderPlot({
svolant's avatar
svolant committed
600
601
    tmp = dataInput()
    data = tmp$data
svolant's avatar
svolant committed
602
603
    taxo = data$taxo
    counts = data$counts
svolant's avatar
svolant committed
604
605
606
    check = tmp$check
    cond = (!is.null(data$counts) && nrow(data$counts)>0 && !is.null(data$taxo) && nrow(data$taxo)>0 && is.null(check$CheckTaxo$Error) && is.null(check$CheckCounts$Error))

svolant's avatar
svolant committed
607
    res = NULL
svolant's avatar
svolant committed
608
    if(cond)
svolant's avatar
svolant committed
609
610
611
612
613
614
615
616
617
618
619
620
621
    {
      colors=rep(c("#1f77b4","#aec7e8","#ff7f0e","#ffbb78", "#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b",
                   "#c49c94","#e377c2","#f7b6d2","#7f7f7f", "#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"),ceiling(ncol(taxo)/20))
      tmp = apply(taxo,2,unique)
      nbfeatures = as.numeric(lapply(tmp,length)) -as.numeric(lapply(lapply(tmp,is.na),any))
      df <- data.frame(Label = colnames(taxo),Count = nbfeatures)
      df$Label = factor(df$Label,levels =colnames(taxo) )
      res = ggplot(df,aes(x=Label,y=Count,fill=Label))+geom_bar(stat="identity")
      res = res + theme_bw() + xlab("Taxonomy") + scale_fill_manual(values=colors) + guides(fill=FALSE)
    }
    return(res)
  })
  
stevenn's avatar
stevenn committed
622
623
624
625
626
  #####################################################
  ##
  ##                TARGET FILE
  ##
  #####################################################
stevenn's avatar
stevenn committed
627
  
628
  
stevenn's avatar
stevenn committed
629
  ## Load target file
630
  observe({ 
stevenn's avatar
stevenn committed
631
632
    
    inFile <- input$fileTarget
Stevenn Volant's avatar
Stevenn Volant committed
633
    counts = dataInput()$data$counts
svolant's avatar
svolant committed
634
    labeled = 0
svolant's avatar
svolant committed
635
    data = NULL
636
    
stevenn's avatar
stevenn committed
637
638
    if (is.null(inFile)) return(NULL)
    
svolant's avatar
svolant committed
639
640
    ## Read the data
    try(read.csv(inFile$datapath,sep=input$septarget,header=TRUE)->data,silent=TRUE)
stevenn's avatar
stevenn committed
641
    
svolant's avatar
svolant committed
642
643
644
645
646
647
    if(!is.null(data))
    {
      data = as.data.frame(data)
      names = colnames(data)
      
      ## Change the rownames
svolant's avatar
svolant committed
648
      if(!TRUE%in%duplicated(data[,1])) rownames(data)=gsub(pattern = "-",replacement = ".",as.character(data[,1]))
svolant's avatar
svolant committed
649
650
651
652
653
      
      ## Keep only the row which are in the count table
      ind = which(rownames(data)%in%colnames(counts))
      data = as.data.frame(data[ind,])
      colnames(data) = names
svolant's avatar
svolant committed
654
655
      
      
svolant's avatar
svolant committed
656
657
658
659
660
661
662
663
664
      ## Replace "-" by "."
      if(ncol(data)>1 && nrow(data)>1){
        ind_num = which(sapply(as.data.frame(data[,-1]),is.numeric)) + 1
        if(length(ind_num)>0){
          data_tmp =cbind( as.data.frame(apply(as.data.frame(data[,-ind_num]),2,gsub,pattern = "-",replacement = ".")),data[,ind_num])
          colnames(data_tmp) = c(colnames(data)[-ind_num],colnames(data)[ind_num])
          data = data_tmp
        }
        if(length(ind_num)==0){data = as.data.frame(apply(data,2,gsub,pattern = "-",replacement = "."))}
665
      }
svolant's avatar
svolant committed
666
      
667
668
669
      values$TargetWorking = as.data.frame(data)
#       ind_sel = Target_selection()
#       if(length(ind))
svolant's avatar
svolant committed
670
671
672
673
674
675
676
677
678
679
680
      # target = as.data.frame(apply(target,2,gsub,pattern = "-",replacement = "."))
      
      #ord = order(rownames(data))
      #data = data[ord,]
      ### A SUPPRIMER 
      #rownames(data) <- colnames(counts)
      
      # Percent annotated
      #     print(ind)
      #     print(colnames(counts))
      #     print(rownames(data))
681
      values$labeled = length(ind)/length(colnames(counts))*100.0
svolant's avatar
svolant committed
682
    }
683
    
684
685
686
    # return(list(target = target, labeled=labeled))
  })
  
svolant's avatar
svolant committed
687

svolant's avatar
svolant committed
688
689
690
691
692
693
694
695
696
  
  
  #############################################################
  ##
  ##                        MASQUE
  ##
  #############################################################
  
  
svolant's avatar
svolant committed
697
  
svolant's avatar
svolant committed
698
699
700
  observeEvent(input$dir,{
    
    inFiles <- input$dir
svolant's avatar
svolant committed
701
    
svolant's avatar
svolant committed
702
703
704
705
706
    if (!is.null(inFiles)){
    # values$fastq_names_only = unique(paste(values$fastq_names_only,inFiles$name))
    values$paths_fastq_tmp = rbind(isolate(values$paths_fastq_tmp),inFiles)
    values$fastq_names_only = isolate(unique(values$paths_fastq_tmp[,"name"]))
    }
svolant's avatar
svolant committed
707
708
  })
  
svolant's avatar
svolant committed
709

svolant's avatar
svolant committed
710
  
svolant's avatar
svolant committed
711
  ## Create a fasta file containing the contaminant
svolant's avatar
svolant committed
712
713
714
715
716
717
718
719
720
721
722
  CreateFasta <- reactive({
    seq = NULL
    tmp = tempdir()
    fastaName = paste(tmp,paste(basename(file_path_sans_ext(json_name)),"_contaminant.fasta",sep=""),sep = .Platform$file.sep)
    
    if(!file.exists(fastaName)) file.create(fastaName,showWarnings=FALSE)
    if(input$PairedOrNot=="y"){seq =paste("#Seq1\n",input$R1primer,"\n \n","#Seq2\n",input$R2primer,sep="")}
    if(input$PairedOrNot=="n"){seq =input$primerSingle}
    if(!is.null(seq))  write(seq, file=fastaName)
    
  })
svolant's avatar
svolant committed
723
  
svolant's avatar
svolant committed
724
725
726
  
  ## Action with submit button
  MasqueSubmit <- eventReactive(input$submit,{
svolant's avatar
svolant committed
727
728
    CMP = CheckMasque(input, values)
    Error = CMP$Error
svolant's avatar
svolant committed
729

svolant's avatar
svolant committed
730
    isJSONalreadyExist = file.exists(paste(values$curdir,"www","masque","doing",basename(json_name),sep= .Platform$file.sep))
svolant's avatar
svolant committed
731

svolant's avatar
json    
svolant committed
732
    if(is.null(Error) && !isJSONalreadyExist)
svolant's avatar
svolant committed
733
    {
svolant's avatar
svolant committed
734
735
      CreateFasta()
      values$num = 1
svolant's avatar
svolant committed
736
      tmp = tempdir()
svolant's avatar
svolant committed
737
      # home <- normalizePath("~")
svolant's avatar
svolant committed
738
      home <- ""
svolant's avatar
svolant committed
739
      # path_glob = file.path(home, paste(unlist(dir()$path[-1]), collapse = .Platform$file.sep))
svolant's avatar
svolant committed
740
741
742
743
744
745
746
747
748
749
750
751
752
    
    
      ## Paired-end
      if(input$PairedOrNot=="y"){
        cmp = 0
        nfiles = length(values$R1fastQ)+length(values$R2fastQ)
        
        withProgress(message = 'Uploading files...', value = 0, {
          pathToR1 = paste(tmp,"Masque_files_R1",sep=.Platform$file.sep)
          pathToR2 = paste(tmp,"Masque_files_R2",sep=.Platform$file.sep)
          
          if(dir.exists(pathToR1)){file.remove(list.files(pathToR1,full.names =TRUE))} else dir.create(pathToR1)
          if(dir.exists(pathToR2)){file.remove(list.files(pathToR2,full.names =TRUE))} else dir.create(pathToR2)
svolant's avatar
svolant committed
753
754
755
756
757
758
759
760
761
762
763
764
        for(i in values$R1fastQ){
          ind=which(i==values$paths_fastq_tmp[,"name"])[1]
          file.copy(from=values$paths_fastq_tmp[,"datapath"][ind], to=paste(tmp,"Masque_files_R1",i,sep= .Platform$file.sep))
          cmp = cmp +1
          incProgress(cmp/nfiles, detail = "Forward fastq files...")
        }
          for(i in values$R2fastQ){
            ind=which(i==values$paths_fastq_tmp[,"name"])[1]
            file.copy(from=values$paths_fastq_tmp[,"datapath"][ind], to=paste(tmp,"Masque_files_R2",i,sep= .Platform$file.sep))
            cmp = cmp +1
            incProgress(cmp/nfiles, detail = "Reverse fastq files...")
          }
svolant's avatar
svolant committed
765
        })
766
        
svolant's avatar
svolant committed
767
      } else{
768
        
svolant's avatar
svolant committed
769
770
771
772
773
774
775
776
777
        cmp = 0
        nfiles = length(values$fastq_names_only)
        
        withProgress(message = 'Uploading files...', value = 0, {
            
          pathTo = paste(tmp,"Masque_files",sep=.Platform$file.sep)
          
          if(dir.exists(pathTo)){file.remove(list.files(pathTo,full.names =TRUE))} else dir.create(pathTo)
          
svolant's avatar
svolant committed
778
779
780
          for(i in values$fastq_names_only){
            ind=which(i==values$paths_fastq_tmp[,"name"])[1]
            file.copy(from=values$paths_fastq_tmp[,"datapath"][ind], to=paste(tmp,"Masque_files",i,sep= .Platform$file.sep));cmp = cmp +1;incProgress(cmp/nfiles)}
svolant's avatar
svolant committed
781
        })
782
      }
svolant's avatar
svolant committed
783
784
      
      ## Create JSON file
svolant's avatar
svolant committed
785
786
      withProgress(message = 'Creating JSON file...',{CreateJSON(input,values)})
      if(file.exists(values$json_name)) values$num = 1
svolant's avatar
svolant committed
787
788
789
790
791
792
793
794
795
796
      sendSweetAlert(messageId="SuccessMasque",
                     title = "Success",
                     text = paste("Your data have been submitted. You will receive an e-mail once the computation over. <br /> This can take few hours.
                                  <br /> 
                                  <br /> 
                                  <br /> 
                                  <em> Remind: You can close shaman and use your key to check the progression and get your results: </em>",values$pass),
                     type = "success",
                     html=TRUE
                     )
svolant's avatar
svolant committed
797
798
    }
    
svolant's avatar
svolant committed
799
800
801
802
803
804
805
806
807
808
809
  })
  
  
  observeEvent(input$submit,{  
    
    tryCatch(MasqueSubmit(),
             error=function(e) sendSweetAlert(messageId="ErrorMasque",
                                              title = "Oops",
                                              text=paste("Something wrong when submitting.\n \n",e),type ="error"))
    
    
svolant's avatar
svolant committed
810
  },priority = 1)
svolant's avatar
svolant committed
811
  
svolant's avatar
svolant committed
812
  
svolant's avatar
svolant committed
813
814
  ## FastQ list
  output$FastQList_out <- renderUI({
svolant's avatar
svolant committed
815
816
817
818
819
820
821
822
823
824
825
    res = NULL
    if(!is.null(input$dir)){
      NullBox = h3(strong("0 FastQ file detected"),style="color:red;  text-align: center")
      res = NullBox
      
      if(length(values$fastq_names_only)>0)
      {
        res =list(selectInput("FastQList",label = "List of the fastq files in the selected directory",isolate(values$fastq_names_only),multiple =TRUE,selectize=FALSE,size = 6),
                  actionButton("RemoveFastQbut",'Remove file(s)',icon=icon("remove")))
      } else res = NullBox
    }
svolant's avatar
svolant committed
826
827
828
    return(res)
  })
  
svolant's avatar
svolant committed
829

svolant's avatar
svolant committed
830
831
832
833
834
835
836
837
838


  ## Remove FastQ function
  RemoveFastQ <-eventReactive(input$RemoveFastQbut,{
    
    if(length(input$FastQList)>0)
    {
      ind = which(values$fastq_names_only%in% input$FastQList)
      values$fastq_names_only = values$fastq_names_only[-ind]
svolant's avatar
svolant committed
839
      values$paths_fastq_tmp = values$paths_fastq_tmp[-ind,]
svolant's avatar
svolant committed
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
      updateSelectInput(session, "FastQList","List of the fastq files in the selected directory",values$fastq_names_only)
    }
  })
  
  
  
  
  
  ## Remove FastQ
  observeEvent(input$RemoveFastQbut,{  
    
    RemoveFastQ()
    if(input$MatchFiles_button>=1) MatchFiles()
    
  },priority=1)
  
  
  
  ## Update R1 and R2 lists
  MatchFiles <-reactive({
    
    if(length(values$fastq_names_only)>0 && input$PairedOrNot=='y')
    {
      indR1 = grep(input$R1files,values$fastq_names_only)
      indR2 = grep(input$R2files,values$fastq_names_only)
      
      ## If some are R1 and R2, removed from both list
      b12 = intersect(indR1,indR2)
      if(length(b12)>0) {indR1 = indR1[-which(indR1%in%b12)]; indR2 = indR2[-which(indR2%in%b12)]}
      
      
      if(length(indR1)>0 && length(indR2)>0){
        
        values$R1fastQ = values$fastq_names_only[indR1]
        values$R2fastQ = values$fastq_names_only[indR2]
        
        ## If some are only R1 or R2
        tmpR1 = gsub(input$R1files,x=values$R1fastQ,""); tmpR2 = gsub(input$R2files,x=values$R2fastQ,"")
        values$R1fastQ = values$R1fastQ[tmpR1%in%tmpR2];values$R2fastQ = values$R2fastQ[tmpR2%in%tmpR1]

        ## Update the files lists
        updateSelectInput(session, "R1filesList","",values$R1fastQ); updateSelectInput(session, "R2filesList","",values$R2fastQ)
      } else{updateSelectInput(session, "R1filesList","","");updateSelectInput(session, "R2filesList","","")}
    } else{updateSelectInput(session, "R1filesList","","");updateSelectInput(session, "R2filesList","","")}
  })
  
  
  observeEvent(input$MatchFiles_button,{  
    
    MatchFiles()
    
  },priority=1)
  
  
  
  ## Remove FastQ function directly from R1, R2
  RemoveFastQ_R1R2 <-eventReactive(input$RemoveFastQbut_R1R2,{
    
    if(length(input$R1filesList)>0)
    {
      ind = which(values$R1fastQ%in% input$R1filesList)
      values$R1fastQ = values$R1fastQ[-ind]
      updateSelectInput(session, "R1filesList","",values$R1fastQ)
    }
    
    if(length(input$R2filesList)>0)
    {
      ind = which(values$R2fastQ%in% input$R2filesList)
      values$R2fastQ = values$R2fastQ[-ind]
      updateSelectInput(session, "R2filesList","",values$R2fastQ)
910
    }
svolant's avatar
svolant committed
911
912
913
914
    
    
  })
  
svolant's avatar
svolant committed
915
916
917
918
919
920
921
922
923
924
925
  
  
  RemoveFastQ_R1R2_all <-eventReactive(input$LoadFiles,{
    
      values$R1fastQ = NULL
      updateSelectInput(session, "R1filesList","","")
      values$R2fastQ = NULL
      updateSelectInput(session, "R2filesList","","")
    
  })
  
svolant's avatar
svolant committed
926
927
928
929
930
931
932
933
  ## Remove FastQ from R1, R2
  observeEvent(input$RemoveFastQbut_R1R2,{  
    
    RemoveFastQ_R1R2()
    
  },priority=1)
  
  
svolant's avatar
svolant committed
934
935
936
937
938
939
940
941
942
  ## Remove FastQ from R1, R2 (load button)
  observeEvent(input$LoadFiles,{  
    
    RemoveFastQ_R1R2_all()
    
  },priority=1)
  
  
  
svolant's avatar
svolant committed
943
944
945
946
947
948
949
950
951
952
953
954
  # observe({
  #   CMP = CheckMasque(input, values)
  #   toggleState("submit",condition = is.null(CMP$Error))
  # })
  
  observe({
    toggleState("box-match",condition = (input$PairedOrNot=="y"))
  })
  

  output$InfoMasque<- renderUI({
    input$submit
svolant's avatar
svolant committed
955

svolant's avatar
svolant committed
956
    CMP = isolate(CheckMasque(input, values))
svolant's avatar
svolant committed
957
    
svolant's avatar
svolant committed
958
    if(!is.null(CMP$Error) && input$submit>0) {
svolant's avatar
svolant committed
959
960
961
      toastr_error(title="Error",message=HTML(CMP$Error),closeButton = TRUE,position ="bottom-right",preventDuplicates = TRUE,newestOnTop = TRUE,
                   progressBar = FALSE,showDuration = 300,showMethod="show",timeOut = 10000)
    }
svolant's avatar
svolant committed
962
963

  })
svolant's avatar
svolant committed
964
965


svolant's avatar
svolant committed
966
967
  output$InfoMasqueHowTo<- renderUI({
    input$submit
svolant's avatar
svolant committed
968

svolant's avatar
svolant committed
969
    CMP = isolate(CheckMasque(input, values))
svolant's avatar
svolant committed
970

svolant's avatar
svolant committed
971
    if(!is.null(CMP$HowTo) && input$submit>0) {
svolant's avatar
svolant committed
972
973
974
975
      toastr_success(title="How to",message=HTML(CMP$HowTo),closeButton = TRUE,position ="bottom-right",preventDuplicates = TRUE,newestOnTop = TRUE,
                     progressBar = FALSE,showDuration = 300,showMethod="show",timeOut = 10000)
    }

svolant's avatar
svolant committed
976
  })
svolant's avatar
svolant committed
977

svolant's avatar
svolant committed
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050

  
  # observeEvent(input$submit,{
  #   
  #   CMP = isolate(CheckMasque(input, values))
  #   if(!is.null(CMP$HowTo)) { 
  #     toastr_success(title="How to",message=HTML(CMP$HowTo),closeButton = TRUE,position ="bottom-right",preventDuplicates = TRUE,newestOnTop = TRUE,
  #                  progressBar = FALSE,showDuration = 300,showMethod="show",timeOut = 10000)
  #   }
  #   
  # })
  # 
  # 
  # observeEvent(input$submit,{
  #   
  #   CMP = isolate(CheckMasque(input, values))
  #   if(!is.null(CMP$Error)) { 
  #     toastr_error(title="Error",message=HTML(CMP$Error),closeButton = TRUE,position ="bottom-right",preventDuplicates = TRUE,newestOnTop = TRUE,
  #                  progressBar = FALSE,showDuration = 300,showMethod="show",timeOut = 10000)
  #   }
  #   
  # })
  
 #########    ICONS   ################ 
  
  
  output$spinner_anim <- renderUI(
    htmltools::HTML('<i class="fa fa-spinner fa-pulse fa-fw" style="color:white" ></i><span class="sr-only">Loading...</span>')
  )
  
  
  output$spinner_icon <- renderUI(
    htmltools::HTML('<i class="fa fa-spinner" aria-hidden="true" style="color:white" ></i><span class="sr-only">Loading...</span>')
  )
  
  output$pause_icon <- renderUI(
    htmltools::HTML('<i class="fa fa-pause" aria-hidden="true" style="color:white" ></i><span class="sr-only">Loading...</span>')
  )
  
  output$check_icon <- renderUI(
    htmltools::HTML('<i class="fa fa-check" style="color:white" ></i><span class="sr-only">Loading...</span>')
  )
  
  
  output$key_icon <- renderUI(
    htmltools::HTML('<i class="fa fa-key" style="color:white" ></i><span class="sr-only">Loading...</span>')
  )
  
  output$test_icon <- renderUI(
    htmltools::HTML('<img src="icon.png" alt="dna" style="width:80px;height:80px;">')
  )
  
  output$amplicon_icon <- renderUI(
    htmltools::HTML('<img src="icons/amplicon.png" alt="dna" style="width:80px;height:80px;">')
  )
  output$dereplication_icon <- renderUI(
    htmltools::HTML('<img src="icons/dereplication.png" alt="dna" style="width:80px;height:80px;">')
  )
  
  output$singleton_icon <- renderUI(
    htmltools::HTML('<img src="icons/singleton.png" alt="dna" style="width:80px;height:80px;">')
  )
  output$chimera_icon <- renderUI(
    htmltools::HTML('<img src="icons/chimera.png" alt="dna" style="width:80px;height:80px;">')
  )
  
  
  #####################################
  
  
  
  output$progressBoxMasque <- renderValueBox({
    res = NULL
svolant's avatar
json    
svolant committed
1051
    num = round(as.numeric(values$num),1)
1052
    res = shinydashboard::valueBox("0 %",h6(strong("Waiting for the data...")), color = "light-blue",width=NULL,icon = uiOutput("spinner_icon"))  
svolant's avatar
svolant committed
1053
1054
1055
    
    CMP = isolate(CheckMasque(input, values))
    Error = CMP$Error
svolant's avatar
svolant committed
1056
    
1057
1058
    if(is.null(Error) || num>=1) res = shinydashboard::valueBox(paste(values$num,"%"),h6(strong("Analysis in progress...")), color = "green",width=NULL,icon = uiOutput("spinner_anim"))  
    if(num>=100) res = shinydashboard::valueBox(paste("100 %"),h6(strong("Analysis completed ! Check your mail.")), color = "green",width=NULL,icon =  uiOutput("check_icon"))
svolant's avatar
svolant committed
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
    return(res)
  })
  
  
  # output$infoBoxPass <- renderInfoBox({
  #   
  #   res = NULL
  #   # pass = toupper(gsub(" ","",input$password))
  #   # passOK = identical(pass,toupper(values$pass))
  #   # 
  #   if(input$password =="") res = infoBox("Get a key","Require a valid email address", color = "light-blue",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
  #   
  #   if(passOK)  res = infoBox("Key created !",paste("Your key is ",values$pass), color = "green",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
  #   if(!passOK && input$password !="")  res = infoBox("Invalid key","Use the key that you have received by mail", color = "red",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
  #   return(res)
  # })
  
  
  
  output$infoBoxPass <- renderInfoBox({
    
    res = NULL
    # pass = toupper(gsub(" ","",input$password))
    # passOK = identical(pass,toupper(values$pass))
    # 
    res = infoBox("Get a key","Require a valid email address", color = "light-blue",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
    
    if(input$checkMail>=1 && isValidEmail(input$to))  res = infoBox("Key created !",paste("Your key is ",values$pass), color = "green",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
    if(input$checkMail>=1 && !isValidEmail(input$to))  res = infoBox("Invalid emial","Enter a valid email address to get your key", color = "red",width=NULL,icon = uiOutput("key_icon"),fill = TRUE)
    return(res)
  })
  
  
  
  output$infoBoxFastQ <- renderInfoBox({
svolant's avatar
svolant committed
1094
    # FastqLoad()
svolant's avatar
svolant committed
1095
1096
    res = NULL
    res = infoBox("Fastq files","Load the fastq files ", color = "light-blue",width=NULL,icon = icon("play"),fill = TRUE)
svolant's avatar
svolant committed
1097

svolant's avatar
svolant committed
1098
1099
    if(!is.null(input$dir)){
      if(length(unique(values$fastq_names_only))==0) res = infoBox("Fastq files","Select at least one fastq file", color = "red",width=NULL,icon = icon("play"),fill = TRUE)
svolant's avatar
svolant committed
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
      if(length(unique(values$fastq_names_only))>0) res = infoBox("Fastq files",paste(length(unique(values$fastq_names_only)), "files are loaded"), color = "green",width=NULL,icon = icon("play"),fill = TRUE)
    }
     return(res)
  })
  
  
  output$infoBoxFastQ_match <- renderInfoBox({
    
    res = NULL
    SM = SamplesMasque(input,values)
    if(input$PairedOrNot=="n"){  res = infoBox("Match the pairs","Only for paired-end sequencing", color = "black",width=NULL,icon = icon("exchange"),fill = TRUE)}
    
    if(input$PairedOrNot=='y'){
      if(input$MatchFiles_button==0) res = infoBox("Match the pairs","Identify forward and reverse files and then click the match button", color = "light-blue",width=NULL,icon = icon("exchange"),fill = TRUE)
      if(input$MatchFiles_button>0 && length(SM$samples)>=1){res = infoBox("Pairs are matched",paste(length(SM$samples), "samples are detected"), color = "green",width=NULL,icon = icon("exchange"),fill = TRUE)}
      if(input$MatchFiles_button>0 && length(SM$samples)<1){res = infoBox("Match the pairs","Failed. 0 samples detected", color = "red",width=NULL,icon = icon("exchange"),fill = TRUE)}
    }
    
svolant's avatar
svolant committed
1118
1119
1120