Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Include Libraries
- library(shiny)
- library(dplyr)
- library(stringr)
- library(tidyverse)
- library(ggplot2)
- library(readr)
- library(gridExtra)
- library(plotly)
- #Define constants and parameters
- z.quartz <- 8800000
- area.effective <- 0.0025^2*pi
- amplitude.factor <- 1.4 #pm/V
- d26 <- 3.1*0.000000000001
- U.star = 1
- F.elas.star = 1
- F.k = 1
- K = 1
- G.star = 14
- a = K/(8*G.star)
- # Define UI
- ui <- fluidPage(
- titlePanel(
- h1("Multiple Range Analysis", align = "left")
- ),
- #Page will be in row format
- fluidRow(column(width=4,offset=0,
- div(style = "height:50px;", "by: Griffin Rauber"))),
- #File input
- fluidRow(column(width=4,
- fileInput("upload", NULL, buttonLabel = "Choose File:", multiple = FALSE))),
- #Helper text
- fluidRow(column(width=6,
- h6("Use the sliders below to select the ranges you would like to analyze")
- )),
- fluidRow(
- column(width = 6,
- sliderInput(width = 600, inputId = "sliderRange1", label = h5("Range 1"),
- min = 0, max = 2000, value = c(10, 1000))),
- column(width = 6,
- sliderInput(width = 600, inputId = "sliderRange2", label = h5("Range 2"),
- min = 0, max = 2000, value = c(10, 1000)))),
- #Row 1 - L1
- fluidRow(
- column(width = 6,
- plotOutput("L1_1")),
- column(width = 6,
- plotOutput("L1_2"))),
- #Row 2 - R1
- fluidRow(
- column(width = 6,
- plotOutput("R1_1")),
- column(width = 6,
- plotOutput("R1_2"))),
- #Row 3 - fs
- fluidRow(
- column(width = 6,
- plotOutput("fs_1")),
- column(width = 6,
- plotOutput("fs_2"))),
- #Row 4 - Ch1
- fluidRow(
- column(width = 6,
- plotOutput("Ch1_1")),
- column(width = 6,
- plotOutput("Ch1_2"))),
- #Row 5 - Ch2
- fluidRow(
- column(width = 6,
- plotOutput("Ch2_1")),
- column(width = 6,
- plotOutput("Ch2_2"))),
- #Helper text
- fluidRow(column(width=6,offset=6,
- h6("Use the slider below to select the linear range of Energy Lost per Cycle")
- )),
- #Output normal load and COF linear model details
- fluidRow(
- column(width = 3, offset = 6,
- verbatimTextOutput("Load"))),
- #File name input for results file
- fluidRow(
- column(width=4,
- textInput("filename", "Results file name:"))),
- #Helper text
- fluidRow(actionButton("show", "Ready to Download? \nClick This Button")),
- #Download buttons at bottom of page
- fluidRow(
- column(width=6,
- downloadButton("downloadData", "Download results file"))),
- column(width=6,
- downloadButton("reorderData", "Download reordered data"))
- )
- # Define server logic required to make the plots
- server <- function(input, output) {
- #Warning message to make sure users did everything correctly
- observeEvent(input$show, {
- showModal(modalDialog(
- title = "Important message",
- HTML("Before downloading the results, ensure that:<br>
- 1) The correct stiffness intercept has been selected<br>
- 2) The correct points have been highlighted for the maximum elastic force<br>
- 3) The linear range of energy lost per cycle is accurate")
- ))
- })
- #Code for file input
- test.tbl <- reactive({
- req(input$upload)
- inFile <- input$upload
- tbl <- read.delim(inFile$datapath, header=FALSE)
- return(tbl)
- })
- #Extract the testing conditions and units of measurement from input data
- testing.conditions <- reactive ({ test.tbl()[1,c(2:11)] })
- units.of.measurement <- reactive ({ test.tbl()[c(2,3),c(3:20)] })
- #print(testing.conditions)
- #print(units.of.measurement)
- normal.load <- reactive ({ as.numeric(gsub(" uN", "", testing.conditions()[7])) })
- output$Load <- reactive ({ paste("Normal Load:",normal.load(),"uN") })
- #Code for tidying the input dataset
- #Remove empty columns and remove testing condition rows
- tidy.tbl <- reactive({ new.tbl <- test.tbl()[-c(1,3),c(3:20)]
- #Set column names to first row
- colnames(new.tbl) <- new.tbl[1,]
- #Remove first row (which is now the column names)
- new.tbl[-1,]
- })
- #Add gamma and RMS delta V columns to full dataset
- #remove and parse time column for later
- Time.vec <- reactive({ parse_time(tidy.tbl()$Time) })
- segType <- reactive ({ tidy.tbl()$Seg })
- segID <- reactive ({ tidy.tbl()$`ID Tag` })
- tidy.tbl2 <- reactive ({ tidy.tbl()[,c(3,5:18)]%>%
- #Change data type of all columns from character to numeric
- mutate_if(is.character,as.numeric)%>%
- #Compute gamma
- mutate(Gamma = R1/(4*pi*L1))%>%
- mutate(Ch1 =`Ch1 (RMS)`)%>%
- mutate(Ch2 =`Ch2 (RMS)`)%>%
- mutate(RMS.deltaV = `Ch1 (RMS)` - `Ch2 (RMS)`)%>%
- mutate(Time = Time.vec())%>%
- mutate(segType=segType())%>%
- mutate(segID=segID())
- })
- #Check for number of segments
- #Create separate datasets for segments 1,2,3
- seg1 <- reactive({ tidy.tbl2()%>%
- filter(segID=="s1")%>%
- select(segType, Number, Power, C0, C1, L1, R1, fs, Gamma)%>%
- arrange(Power)
- })
- seg2 <- reactive({ tidy.tbl2()%>%
- # filter(segID!="s1")%>%
- # filter(segID!="s3")%>% #I Could not figure out why /// filter(segID!="s1" || "s3")%>% /// does not work!
- select(segType, Number, Power, C0, C1, L1, R1, fs, Gamma, RMS.deltaV, Ch1, Ch2)%>%
- arrange(Power)
- })
- seg3 <- reactive({ tidy.tbl2()%>%
- filter(segID=="s3")%>%
- select(segType, Number, Power, C0, C1, L1, R1, fs, Gamma)%>%
- arrange(Power)
- })
- #Create final summary dataset with calculated metrics
- final.data <- reactive({ data.tbl <- data.frame(RMS.deltaV = seg2()$RMS.deltaV)
- #delta fs and gamma
- #this part of the code detects which segment is the baseline
- #and calculates gamma and frequency shifts accordingly
- data.tbl <-
- if(seg1()$segType[1] == "B" & seg3()$segType[1] != "B"){
- mutate(data.tbl,
- deltaFs = seg2()$fs - seg1()$fs,
- deltaGamma = seg2()$Gamma - seg1()$Gamma)
- } else if(seg3()$segType[1] == "B" & seg1()$segType[1] != "B"){
- mutate(data.tbl,
- deltaFs = seg2()$fs - seg3()$fs,
- deltaGamma = seg2()$Gamma - seg3()$Gamma)
- } else if(seg1()$segType[1] == "B" & seg3()$segType[1] == "B"){
- mutate(data.tbl,
- deltaFs = seg2()$fs - (seg1()$fs+seg3()$fs)/2,
- deltaGamma = seg2()$Gamma - (seg1()$Gamma+seg3()$Gamma)/2)
- }
- data.tbl <- data.tbl%>%
- #quality factor
- mutate(Q = 2*pi*seg2()$fs*(seg2()$L1/seg2()$R1))%>%
- #absolutes
- #amplitude
- mutate(Amp = amplitude.factor*Q*sqrt(2)*RMS.deltaV/1000)%>%
- #Ki elastic
- mutate(Ki.elas = 2*(pi^2)*z.quartz*area.effective*deltaFs/1000)%>%
- #2pi fb
- mutate(TwoPi.fb = 2*(pi^2)*z.quartz*area.effective*deltaGamma/1000)%>%
- #Elastic Force
- mutate(F.elas = Ki.elas*Amp)%>%
- #Damping Force
- mutate(F.damp = TwoPi.fb*Amp)%>%
- #deltaE Elastic
- mutate(deltaE.elas = F.elas*Amp/2000)%>%
- #deltaE Damping
- mutate(deltaE.damp =
- 2*(pi^3)*z.quartz*area.effective*deltaGamma*(Amp*0.000000001)^2*1000000000000)%>%
- #deltaGamma/deltaFs
- mutate(delGamma.delFs = deltaGamma/deltaFs)%>%
- arrange(Amp)
- data.tbl
- })
- #extract slider min and max for output file linear ranges
- #Range 1
- sliderMin1 <- reactive ({ input$sliderRange1[1] })
- sliderMax1 <- reactive ({ input$sliderRange1[2] })
- #Range 2
- sliderMin2 <- reactive ({ input$sliderRange2[1] })
- sliderMax2 <- reactive ({ input$sliderRange2[2] })
- #Filter data
- filtered1.data <- reactive({ #reactive object updates every time the user changes the slider
- req(input$sliderRange1)
- filter(final.data(), seg2()$Number>input$sliderRange1[1] & seg2()$Number<input$sliderRange1[2])
- })
- filtered2.data <- reactive({ #reactive object updates every time the user changes the slider
- req(input$sliderRange2)
- filter(final.data(), seg2()$Number>input$sliderRange2[1] & seg2()$Number<input$sliderRange2[2])
- })
- #Code for L1_1 plot
- output$L1_1 <- renderPlot({
- ggplot(filtered1.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$L1), color = "blue")+
- geom_smooth(aes(x = seg2()$Number, y = seg2()$L1), method = "lm", se=FALSE, color="black", formula =y ~ x)+
- labs(title = "L1 vs. Number for region 1",
- x = "Number",
- y = "L1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for L1_2 plot
- output$L1_2 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$L1), color = "blue")+
- labs(title = "L1 vs. Number for region 2",
- x = "Number",
- y = "L1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for R1_1 plot
- output$R1_1 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$R1), color = "blue")+
- labs(title = "L1 vs. Number for region 1",
- x = "Number",
- y = "R1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for R1_2 plot
- output$R1_2 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$R1), color = "blue")+
- labs(title = "L1 vs. Number for region 2",
- x = "Number",
- y = "R1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for fs_1 plot
- output$fs_1 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$fs), color = "blue")+
- labs(title = "L1 vs. Number for region 1",
- x = "Number",
- y = "fs")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for fs_2 plot
- output$fs_2 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$fs), color = "blue")+
- labs(title = "L1 vs. Number for region 2",
- x = "Number",
- y = "fs")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for Ch1_1 plot
- output$Ch1_1 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$Ch1), color = "blue")+
- labs(title = "L1 vs. Number for region 1",
- x = "Number",
- y = "Ch1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for Ch1_2 plot
- output$Ch1_2 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$Ch1), color = "blue")+
- labs(title = "L1 vs. Number for region 2",
- x = "Number",
- y = "Ch1")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for Ch2_1 plot
- output$Ch2_1 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$Ch2), color = "blue")+
- labs(title = "L1 vs. Number for region 1",
- x = "Number",
- y = "Ch2")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- #Code for Ch2_2 plot
- output$Ch2_2 <- renderPlot({
- ggplot(final.data())+
- geom_point(aes(x = seg2()$Number, y = seg2()$Ch2), color = "blue")+
- labs(title = "L1 vs. Number for region 2",
- x = "Number",
- y = "Ch2")+
- #edit text sizes for title and axes labels
- theme(plot.title = element_text(size=24,face="bold"),
- axis.title.x = element_text(size=14),
- axis.title.y = element_text(size=14))
- })
- output$range1 <- renderPrint({input$sliderRange1})
- output$range2 <- renderPrint({input$sliderRange2})
- #Code for making reordered dataset
- reordered.data <- reactive({
- cbind(seg1(),seg2(),seg3())
- })
- #Code for dowmloading reordered data
- output$reorderData <- downloadHandler(
- filename = function() {paste("Reordered ", input$upload$name, ".csv", sep = "")
- },
- content = function(file){
- write.csv(reordered.data(), file, row.names = FALSE)
- }
- )
- #Code for dowmloading results table
- output$downloadData <- downloadHandler(
- filename = function() {paste(input$filename, ".csv", sep = "")
- },
- content = function(file){
- write.csv(results.data(), file, row.names = FALSE)
- #capture.output(results.data(), file = "my_list.txt")
- }
- )
- }
- # Run the application
- shinyApp(ui = ui, server = server)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement