diff --git a/Project.toml b/Project.toml index d3f21fb460d4a1ac99e49e5f583a5c75706235de..7ba527de8bf87ef1122fe8dd34428c3538840d23 100644 --- a/Project.toml +++ b/Project.toml @@ -9,6 +9,7 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Formatting = "59287772-0a20-5a39-b81b-1366585eb4c0" JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" JSServe = "824d6782-a2ef-11e9-3a09-e5662e0c26f9" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" Meshes = "eacbb407-ea5a-433e-ab97-5258b1ca43fa" @@ -16,6 +17,7 @@ Observables = "510215fc-4207-5dde-b226-833fc4488ee2" ObservationPolicies = "6317928a-6b1a-42e8-b853-b8e2fc3e9ca3" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" PlanarLarvae = "c2615984-ef14-4d40-b148-916c85b43307" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" TidyObservables = "c8131bbd-73a8-4254-a42d-d5d4c5febb31" diff --git a/src/LarvaTagger.jl b/src/LarvaTagger.jl index a2423378dda39adb91f4edfa0bd6e302ef334bf4..d605d979f4cf84a1b976c17e915ce11f5ebe0f85 100644 --- a/src/LarvaTagger.jl +++ b/src/LarvaTagger.jl @@ -16,6 +16,8 @@ using Meshes using Logging import Dates using OrderedCollections +using Random +using LinearAlgebra export larvaviewer, larvaeditor diff --git a/src/controllers.jl b/src/controllers.jl index 489616d2f222b6ab10a66db05d8bc006917285c7..1f2671f96bb57443bb159ffb8c050d9608bc55bd 100644 --- a/src/controllers.jl +++ b/src/controllers.jl @@ -173,6 +173,7 @@ struct LarvaController player::AbstractAnimator # could make LarvaController mutable instead... boundingbox::Ref{<:NTuple{4, <:AbstractFloat}} + medianlarvasize::AbstractFloat end function LarvaController(main::ControllerHub, @@ -181,7 +182,8 @@ function LarvaController(main::ControllerHub, player::AbstractAnimator) activelarva = Observable{ActiveLarva}(nothing) boundingbox = Ref((0.0, 10.0, 0.0, 10.0)) - LarvaController(main, model, tag_lut, activelarva, player, boundingbox) + mediansize = medianlarvasize(model) + LarvaController(main, model, tag_lut, activelarva, player, boundingbox, mediansize) end function LarvaController(main::ControllerHub, @@ -211,6 +213,9 @@ getlarva(c, id) = getlarvae(c)[id] setboundingbox!(c, bb) = setboundingbox!(gethub(c)[:larva], bb) setboundingbox!(c::LarvaController, bb) = (c.boundingbox[] = bb) +getmedianlarvasize(c) = getmedianlarvasize(gethub(c)[:larva]) +getmedianlarvasize(c::LarvaController) = c.medianlarvasize + getplayer(c::LarvaController) = c.player getplayer(c) = getplayer(gethub(c)) getplayer(hub::ControllerHub) = haskey(hub, :player) ? hub[:player] : getplayer(hub[:larva]) @@ -327,7 +332,8 @@ function slave(master::LarvaController, tag_lut, master.activelarva, player, - master.boundingbox) + master.boundingbox, + master.medianlarvasize) end stop!(controller::LarvaController) = stop!(controller.player) diff --git a/src/models.jl b/src/models.jl index fc0f7e3daf1d96a3257a0ca938e8dada2fba9b26..065687ff37d728c25623c86c124e89c4c00c0b1e 100644 --- a/src/models.jl +++ b/src/models.jl @@ -254,3 +254,19 @@ function downsample(timestamps::Vector{Int}, path::PathOrOutline; step::Int=20) start = mod1(timestamps[1], step) (timestamps[start:step:end], path[start:step:end]) end + +medianlarvasize(larvae::Dict; n::Int=100) = medianlarvasize(collect(values(larvae)); n=n) + +function medianlarvasize(larvae::Vector{LarvaModel}; n::Int=100) + larvae = Random.shuffle(larvae) + sizes = Float64[] + sizehint!(sizes, n) + for k in 1:n + larva = larvae[mod1(k, length(larvae))] + _, state = larva.fullstates[rand(1:length(larva.fullstates))] + spine = state[:spine] + size = sum(norm.(diff(spine.vertices))) + push!(sizes, size) + end + return median(sizes) +end diff --git a/src/plots.jl b/src/plots.jl index c2233d8504fa86db01f6cc164a157b7fb803eb8a..a424f665cdc49a2c8e62fca334b9cc182bb21b14 100644 --- a/src/plots.jl +++ b/src/plots.jl @@ -299,8 +299,6 @@ function assign_tag_to_segment!(larvaview, firststep) flag_active_larva_as_edited(controller) end -const reference_larva_size = 2.25 - function setmouseevents!(scene, larva::SingleLarvaView; blocking=true, priority=Int8(10), kwargs...) # WGLMakie does not support addmouseevents! with plots as additional input args mouseevents = Makie.addmouseevents!(scene; priority=priority) @@ -311,6 +309,8 @@ function setmouseevents!(scene, larva::SingleLarvaView; blocking=true, priority= return Consume(false) end + reference_larva_size = getmedianlarvasize(larva.controller) + # dead code modifier_active() = ispressed(scene, Keyboard.left_shift)