fix: Consider well re-usage when calculating volume
Gitea Scan/plate-tool/pipeline/head This commit looks good Details

This commit is contained in:
Emilia Allison 2024-08-10 04:49:10 -04:00
parent a1d4cc74c5
commit 51093f5efd
Signed by: emilia
GPG Key ID: 7A3F8997BFE894E0
2 changed files with 20 additions and 6 deletions

View File

@ -157,13 +157,13 @@ To turn them back on, do the exact same thing.
This can be used to verify that all of the wells in a plate will have the same volume This can be used to verify that all of the wells in a plate will have the same volume
transferred at a glance. transferred at a glance.
Wells will be colored based on the sum of all transfers using that plate. Wells will be colored based on the sum of all transfers using that plate.
In version `0.5.0`, this is best suited for use with CSV imports.
To toggle this feature, mouse over "Options", then "Styles", then click "Toggle volume heatmap". To toggle this feature, mouse over "Options", then "Styles", then click "Toggle volume heatmap".
_NOTE:_ In version `<=0.5.0`, if a source well is used multiple times it's volume will _NOTE_: The scale for the colors is spaced linearly; if you have a well that is being used
be representative of the total usage. significantly more than some others, it may be difficult to see the difference between other wells
with more similar volumes.
If you have a use case that would benefit from a logarithmic scale here, please let me know.
## Installation ## Installation

View File

@ -2,6 +2,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::ops::Deref; use std::ops::Deref;
use plate_tool_lib::transfer_region::TransferRegion;
use plate_tool_lib::transfer_volume::TransferVolume; use plate_tool_lib::transfer_volume::TransferVolume;
use yew::prelude::*; use yew::prelude::*;
use yewdux::prelude::*; use yewdux::prelude::*;
@ -75,11 +76,15 @@ pub fn Plate(props: &PlateProps) -> Html {
}, },
_ => unreachable!(), _ => unreachable!(),
}; };
// Usage to be used as a volume multiplier; should be in [1, U32_MAX]
// First convert to f64 (u32 can not fit in f32 directly) and then cast
// to round into the closest f32.
let usage: f32 = Into::<f64>::into(count_plate_usage(transfer, &well).unwrap_or(1u32).max(1u32)) as f32;
if let Some(val) = volume_map_temp.get_mut(&well) { if let Some(val) = volume_map_temp.get_mut(&well) {
*val += temp_volume *val += temp_volume * usage;
} else { } else {
volume_map_temp.insert(well, temp_volume); volume_map_temp.insert(well, temp_volume * usage);
} }
volume_max_temp = f32::max(volume_max_temp, *volume_map_temp.get(&well).expect("Just added")); volume_max_temp = f32::max(volume_max_temp, *volume_map_temp.get(&well).expect("Just added"));
} }
@ -270,6 +275,15 @@ pub fn in_rect(corner1: Option<(u8, u8)>, corner2: Option<(u8, u8)>, pt: (u8, u8
} }
} }
fn count_plate_usage(transfer: &Transfer, well: &Well) -> Option<u32> {
if let Region::Custom(_) = transfer.transfer_region.source_region {
return None;
}
let map = transfer.transfer_region.calculate_map();
map(*well).and_then(|list| Some(list.len() as u32))
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use wasm_bindgen_test::*; use wasm_bindgen_test::*;