diff --git a/README.md b/README.md
index 0d967b7..98e1b61 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ A Graphical User Interface for MSI in Julia: https://github.com/CINVESTAV-LABI/j
```
julia --project=. start_MSI_GUI.jl
```
-3. After the script has finished loading, it should open a page (http://127.0.0.1:1481/) in your browser with the web app running.
+3. After the script has finished loading, You can open a page (http://127.0.0.1:1481/) in your browser with the web app running.
Additional notes:
After the first boot initializes the packages in your computer, subsequent uses of the app should not take longer to load.
diff --git a/app.jl b/app.jl
index 47fe52c..190fac0 100644
--- a/app.jl
+++ b/app.jl
@@ -13,6 +13,7 @@ using Images
using LinearAlgebra
using NativeFileDialog # Opens the file explorer depending on the OS
using StipplePlotly
+include("./julia_imzML_visual.jl")
@genietools
# == Code import ==
@@ -54,13 +55,13 @@ function loadImgPlot(interfaceImg::String)
cleaned_img=lstrip(cleaned_img, '/')
var=joinpath("./public", cleaned_img)
img=load(var)
- println("type of img: $(typeof(img))")
+ #println("type of img: $(typeof(img))")
# Convert to grayscale
img_gray=Gray.(img)
img_array=Array(img_gray)
#println(typeof(img_array))
elevation=Float32.(Array(img_array)) ./ 255.0
- println("type of elevation: $(typeof(elevation))")
+ #println("type of elevation: $(typeof(elevation))")
# Get the X, Y coordinates of the image
height, width=size(img_array)
#println("height: $(height), width: $(width)")
@@ -120,7 +121,8 @@ function loadContourPlot(interfaceImg::String)
img=load(var)
img_gray=Gray.(img)
img_array=Array(img_gray)
- elevation=Float32.(Array(img_gray)) ./ 255.0 # Normalize between 0 and 1
+ # parse matrix to int32 to closely resemble similarity to original bitmap
+ elevation=Float32.(Array(img_array))./ 255.0 # Normalize between 0 and 1
# Smooth the image
sigma=3.0
@@ -171,7 +173,7 @@ function loadSurfacePlot(interfaceImg::String)
img_gray=Gray.(img) # Convert to grayscale
#println("Grayscale image type:", typeof(img_gray))
img_array=Array(img_gray)
- elevation=Float32.(Array(img_gray)) ./ 255.0 # Normalize between 0 and 1
+ elevation=Float32.(Array(img_array)) ./ 255.0 # Normalize between 0 and 1
#println("Elevation size:", size(elevation))
# Smooth the image
sigma=3.0
@@ -203,10 +205,12 @@ function loadSurfacePlot(interfaceImg::String)
aspectratio=aspect_ratio
)
)
+ # Transpose the elevation_smoothed array if Y axis is longer than X axis to fix chopping
+ elevation_smoothed=transpose(elevation_smoothed)
if size(elevation_smoothed, 1) < size(elevation_smoothed, 2)
- # Transpose the elevation_smoothed array if Y axis is longer than X axis to fix chopping
- elevation_smoothed=transpose(elevation_smoothed)
Y=-Y
+ else
+ X=-X
end
trace3D=PlotlyBase.surface(
@@ -243,8 +247,42 @@ function crossLinesPlot(x, y, maxwidth, maxheight)
return trace1, trace2
end
+function log_tick_formatter(values::Vector{Float64})
+ #println("values: $(values) + type: $(typeof(values))")
+ # Initialize exponents dictionary
+ exponents=zeros(Int, length(values))
+ formValues=zeros(Float64, length(values))
+ for i in 1:length(values)
+ value = values[i]
+ #println("value: $(value)")
+ if value >= 1000 # positive formatting for notation
+ while value >= 1000
+ value /= 10
+ exponents[i] += 1
+ end
+ #println("value: $(value) x10^$(exponents[i])")
+ elseif value > 0 && value < 1 # negative formatting for notation
+ while value < 1
+ value *= 10
+ exponents[i] -= 1
+ end
+ #values[i] = round(values[i], digits=2)
+ #println("value: $(value) x10^$(exponents[i])")
+ end
+ #formatted_values[i] = values[i] != 0 ? "$(round(values[i], digits=2))x10" * Makie.UnicodeFun.to_superscript(exponents[i]) : "0"
+ formValues[i]=value
+ end
+ #return formatted_values
+ #return map(v -> values * "x10" * Makie.UnicodeFun.to_superscript(round(Int64, v)), exponents)
+ #println("formated values: $(formValues) + type: $(typeof(formValues))")
+ #println("exponents: $(exponents) + type: $(typeof(exponents))")
+ #return map((v, e) -> "$(round(v, digits=2))x10" * Makie.UnicodeFun.to_superscript(e), formValues, exponents)
+ return map((v, e) -> e == 0 ? "$(round(v, sigdigits=2))" : "$(round(v, sigdigits=2))x10" * Makie.UnicodeFun.to_superscript(e), formValues, exponents)
+
+end
+
# == Reactive code ==
-# reactive code to make the UI interactive
+# Reactive code to make the UI interactive
@app begin
# == Reactive variables ==
# reactive variables exist in both the Julia backend and the browser with two-way synchronization
@@ -476,6 +514,7 @@ end
end
@onbutton mainProcess begin
+ #@onchange Nmass begin
progress=true # Start progress button animation
btnStartDisable=true # We disable the button to avoid multiple requests
btnPlotDisable=true
@@ -483,44 +522,46 @@ end
text_nmass=replace(string(Nmass), "." => "_")
sTime=time()
#full_route=joinpath(file_route, file_name)
- if isfile(full_route) && Nmass > 0 && Tol > 0 && Tol <=1
+ if isfile(full_route) && Nmass > 0 && Tol > 0 && Tol <=1 && colorLevel > 1 && colorLevel < 257
msg="File exists, Nmass=$(Nmass) Tol=$(Tol). Loading file will begin, please be patient."
try
spectra=LoadImzml(full_route)
msg="File loaded. Creating Spectra with the specific mass and tolerance, please be patient."
- slice=GetSlice(spectra, Nmass, Tol)
- fig=CairoMakie.Figure(size=(140, 440)) # Container
+ #slice=GetSlice(spectra, Nmass, Tol)
+ slice=GetMzSliceJl(spectra,Nmass,Tol)
+ fig=CairoMakie.Figure(size=(150, 250)) # Container
# Append a query string to force the image to refresh
timestamp=string(time_ns())
if triqEnabled # If we have TrIQ
- if colorLevel < 4 || colorLevel > 256 || triqProb < 0.8 || triqProb > 1
+ if triqProb < 0.8 || triqProb > 1
msg="Incorrect TrIQ values, please adjust accordingly and try again."
warning_msg=true
else
image_path=joinpath("./public", "TrIQ_$(text_nmass).bmp")
- SaveBitmap(joinpath("public", "TrIQ_$(text_nmass).bmp"),TrIQ(slice, Int(colorLevel), triqProb),ViridisPalette)
- # Flip te image vertically then save it again
- img=load(image_path)
- if size(img, 1) > size(img, 2) # fix to taller images
- img=reverse(permutedims(img, (2, 1)), dims=1)
- end
- flipped_img=reverse(img, dims=1)
- imgWidth=size(flipped_img, 2)
- imgHeight=size(flipped_img, 1)
- save(image_path, flipped_img)
+ sliceTriq=TrIQ(slice, colorLevel, triqProb)
+ #println("slice raw: $(typeof(slice))")
+ #println("TriQ matrix: $(typeof(sliceTriq))")
+ sliceTriq=reverse(sliceTriq, dims=2)
+ ##SaveBitmap(joinpath("public", "TrIQ_$(text_nmass).bmp"),sliceTriq,ViridisPalette)
+ SaveBitmapCl(joinpath("public", "TrIQ_$(text_nmass).bmp"),sliceTriq,ViridisPalette)
# Use timestamp to refresh image interface container
imgIntT="/TrIQ_$(text_nmass).bmp?t=$(timestamp)"
plotdataImgT, plotlayoutImgT, imgWidth, imgHeight=loadImgPlot(imgIntT)
# Get current image
current_triq="TrIQ_$(text_nmass).bmp"
msgtriq="TrIQ image with the Nmass of $(replace(text_nmass, "_" => "."))"
- # Create colorbar
- #ticks=round.(range(0, stop=maximum(TrIQ(slice, Int(colorLevel), triqProb)), length=10), sigdigits=3)
- #println("ticks: $(round.(range(0, stop=maximum(TrIQ(slice, Int(colorLevel), triqProb)), length=10), sigdigits=3))")
- ticks=round.(range(0, (stop=maximum(slice)*triqProb), length=15), sigdigits=3)
- #println("ticks 2: $(round.(range(0, (stop=maximum(slice)*triqProb), length=15), sigdigits=3))")
- #Colorbar(fig[1, 1], colormap=rgb_ViridisPalette, limits=(0, maximum(TrIQ(slice, Int(colorLevel), triqProb))),ticks=ticks, label="Intensity")
- Colorbar(fig[1, 1], colormap=cgrad(:viridis, colorLevel, categorical=true), limits=(0, maximum(slice)*triqProb),ticks=ticks, label="Intensity", size = 25)
+ # Create colorbar
+ bound = julia_mzML_imzML.GetOutlierThres(slice, triqProb)
+ levels = range(bound[1],stop=bound[2], length=8)
+ #println("range of the levels 1: $(levels)")
+ levels = vcat(levels, 2*levels[end]-levels[end-1])
+ #println("range of the levels 2: $(levels) + $(length(levels))")
+ #ticks=round.(range(0, (stop=maximum(slice)*triqProb), length=10), sigdigits=3)
+ #ticks=range(0, (stop=maximum(slice)*triqProb), length=5)
+ #println("ticks: $(typeof(ticks))")
+ Colorbar(fig[1, 1], colormap=cgrad(:viridis, colorLevel, categorical=true), limits=(0, bound[2]),ticks=levels,tickformat=log_tick_formatter, label="Intensity", size = 25)
+ #Colorbar(fig[1, 1], colormap=cgrad(:viridis, colorLevel, categorical=true), limits=(0, maximum(slice)*triqProb),ticks=ticks, label="Intensity", size = 25)
+ #println("Colorbar: $(typeof(fig))")
save("public/colorbar_TrIQ_$(text_nmass).png", fig)
colorbarT="/colorbar_TrIQ_$(text_nmass).png?t=$(timestamp)"
# Get current colorbar
@@ -537,16 +578,13 @@ end
end
else # If we don't use TrIQ
image_path=joinpath("./public", "MSI_$(text_nmass).bmp")
- SaveBitmap(joinpath("public", "MSI_$(text_nmass).bmp"),IntQuant(slice),ViridisPalette)
- # Flip te image vertically then save it again
- img=load(image_path)
- if size(img, 1) > size(img, 2) # fix to taller images
- img=reverse(permutedims(img, (2, 1)), dims=1)
- end
- flipped_img=reverse(img, dims=1)
- imgWidth=size(flipped_img, 2)
- imgHeight=size(flipped_img, 1)
- save(image_path, flipped_img)
+ ##sliceQuant=IntQuant(slice)
+ sliceQuant=IntQuantCl(slice,Int(colorLevel-1))
+ #println("slice raw: $(typeof(slice))")
+ #println("slice in intQuant: $(typeof(sliceQuant))")
+ sliceQuant=reverse(sliceQuant, dims=2)
+ ##SaveBitmap(joinpath("public", "MSI_$(text_nmass).bmp"),sliceQuant,ViridisPalette)
+ SaveBitmapCl(joinpath("public", "MSI_$(text_nmass).bmp"),sliceQuant,ViridisPalette)
# Use timestamp to refresh image interface container
imgInt="/MSI_$(text_nmass).bmp?t=$(timestamp)"
plotdataImg, plotlayoutImg, imgWidth, imgHeight=loadImgPlot(imgInt)
@@ -554,10 +592,11 @@ end
current_msi="MSI_$(text_nmass).bmp"
msgimg="Image with the Nmass of $(replace(text_nmass, "_" => "."))"
# Create colorbar
+ levels=range(0,maximum(slice),length=8)
#ticks=round.(range(0, stop=maximum(slice), length=10), sigdigits=3)
- ticks=round.(range(0, stop=maximum(slice), length=15), sigdigits=3)
- #Colorbar(fig[1, 1], colormap=rgb_ViridisPalette, limits=(0, maximum(slice)),ticks=ticks, label="Intensity")
- Colorbar(fig[1, 1], colormap=cgrad(:viridis, 256, categorical=true), limits=(0, maximum(slice)),ticks=ticks, label="Intensity", size = 25)
+ #ticks=range(0, stop=maximum(slice), length=5)
+ #Colorbar(fig[1, 1], colormap=cgrad(:viridis, colorLevel, categorical=true), limits=(0, maximum(slice)),ticks=ticks, label="Intensity", size = 25)
+ Colorbar(fig[1, 1], colormap=cgrad(:viridis, colorLevel, categorical=true), limits=(0, maximum(slice)),ticks=levels,tickformat=log_tick_formatter, label="Intensity", size = 25)
save("public/colorbar_MSI_$(text_nmass).png", fig)
colorbar="/colorbar_MSI_$(text_nmass).png?t=$(timestamp)"
# Get current colorbar
diff --git a/app.jl.html b/app.jl.html
index 34c3478..256c7f3 100644
--- a/app.jl.html
+++ b/app.jl.html
@@ -57,21 +57,27 @@
full route: {{full_route}}