Source plate interleaving
This commit is contained in:
parent
ed8a11e8c7
commit
6bafb0372b
|
@ -10,10 +10,34 @@ pub struct TransferRegion<'a> {
|
||||||
pub source_region: Region, // Even if it is just a point, we don't want corners.
|
pub source_region: Region, // Even if it is just a point, we don't want corners.
|
||||||
pub dest_plate: &'a Plate,
|
pub dest_plate: &'a Plate,
|
||||||
pub dest_region: Region,
|
pub dest_region: Region,
|
||||||
pub offset: Option<(i8,i8)>,
|
pub interleave_source: Option<(i8,i8)>,
|
||||||
|
pub interleave_dest: Option<(i8,i8)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TransferRegion<'_> {
|
impl TransferRegion<'_> {
|
||||||
|
pub fn get_source_wells(&self) -> Vec<(u8,u8)> {
|
||||||
|
if let Region::Rect(c1, c2) = self.source_region {
|
||||||
|
let mut wells = Vec::<(u8,u8)>::new();
|
||||||
|
let (ul, br) = standardize_rectangle(&c1, &c2);
|
||||||
|
let (interleave_i, interleave_j) = self.interleave_source.unwrap_or((1,1));
|
||||||
|
// NOTE: This will panic if either is 0!
|
||||||
|
// We'll reassign these values (still not mutable) just in case.
|
||||||
|
// This behaviour shouldn't be replicated for destination wells
|
||||||
|
// because a zero step permits pooling.
|
||||||
|
let (interleave_i, interleave_j) = (i8::max(interleave_i, 1), i8::max(interleave_j, 1));
|
||||||
|
|
||||||
|
for i in (ul.0..=br.0).step_by(i8::abs(interleave_i) as usize) {
|
||||||
|
for j in (ul.0..=br.0).step_by(i8::abs(interleave_j) as usize) {
|
||||||
|
// NOTE: It looks like we're ignoring negative interleaves,
|
||||||
|
// because it wouldn't make a difference here---the same
|
||||||
|
// wells will still be involved in the transfer.
|
||||||
|
wells.push((i,j))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wells;
|
||||||
|
} else { panic!("Source region is just a point!") }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn validate(&self) -> Result<(), String> {
|
pub fn validate(&self) -> Result<(), String> {
|
||||||
// Checks if the region does anything suspect
|
// Checks if the region does anything suspect
|
||||||
//
|
//
|
||||||
|
@ -87,6 +111,14 @@ fn in_region(pt: (u8,u8), r: &Region) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn standardize_rectangle(c1: &(u8,u8), c2: &(u8,u8)) -> ((u8,u8),(u8,u8)) {
|
||||||
|
let upper_left_i = u8::min(c1.0, c2.0);
|
||||||
|
let upper_left_j = u8::min(c1.1, c2.1);
|
||||||
|
let bottom_right_i = u8::max(c1.0, c2.0);
|
||||||
|
let bottom_right_j = u8::max(c1.1, c2.1);
|
||||||
|
return ((upper_left_i,upper_left_j),(bottom_right_i,bottom_right_j));
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
|
@ -95,10 +127,11 @@ impl fmt::Display for TransferRegion<'_> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
writeln!(f, "Source Plate:")?;
|
writeln!(f, "Source Plate:")?;
|
||||||
let source_dims = self.source_plate.size();
|
let source_dims = self.source_plate.size();
|
||||||
|
let source_wells = self.get_source_wells();
|
||||||
let mut source_string = String::new();
|
let mut source_string = String::new();
|
||||||
for i in 1..=source_dims.0 {
|
for i in 1..=source_dims.0 {
|
||||||
for j in 1..=source_dims.1 {
|
for j in 1..=source_dims.1 {
|
||||||
if in_region((i,j), &self.source_region) {
|
if source_wells.contains(&(i,j)) {
|
||||||
source_string.push_str("x")
|
source_string.push_str("x")
|
||||||
} else {
|
} else {
|
||||||
source_string.push_str("o")
|
source_string.push_str("o")
|
||||||
|
|
|
@ -29,7 +29,9 @@ pub fn plate_test() {
|
||||||
source_region: transfer_region::Region::Rect((1,1), (6,6)),
|
source_region: transfer_region::Region::Rect((1,1), (6,6)),
|
||||||
dest_plate: &destination,
|
dest_plate: &destination,
|
||||||
dest_region: transfer_region::Region::Rect((1,1), (6,6)),
|
dest_region: transfer_region::Region::Rect((1,1), (6,6)),
|
||||||
offset: None
|
interleave_source: Some((2,1)),
|
||||||
|
interleave_dest: None
|
||||||
};
|
};
|
||||||
println!("{}", transfer)
|
println!("{}", transfer);
|
||||||
|
println!("{:?}", transfer.get_source_wells());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue