@@ -311,7 +311,9 @@ def _run_trial(
311
311
lc_name = SupportedLiquid .from_string (trial .cfg .liquid ).name_with_dilution (
312
312
trial .cfg .dilution
313
313
)
314
- liquid_class_root = trial .ctx .define_liquid_class (lc_name .lower ().replace ("-" , "_" ))
314
+ liquid_class_root = trial .ctx .define_liquid_class (
315
+ lc_name .lower ().replace ("-" , "_" )
316
+ )
315
317
pip_load_name = (
316
318
f"flex_{ trial .pipette .channels } channel_{ int (trial .pipette .max_volume )} "
317
319
)
@@ -402,19 +404,22 @@ def _record_measurement_and_store(m_type: MeasurementType) -> MeasurementData:
402
404
# so for now we are still using the custom liquid-height code here, and
403
405
# tell the API's liquid-class to move the correct submerge depth (relative to well-bottom)
404
406
def _calculate_meniscus_relative_offsets (is_aspirate : bool ) -> None :
407
+ _attr_name = "aspirate" if is_aspirate else "dispense"
408
+ _asp_or_disp = getattr (liquid_class , _attr_name )
409
+ _retract_mm = max (
410
+ 0.0 , _asp_or_disp .submerge .offset .z , _asp_or_disp .retract .offset .z
411
+ )
405
412
approach , submerge , retract = _get_approach_submerge_retract_heights (
406
413
trial .well ,
407
414
trial .liquid_tracker ,
408
- submerge_mm = - 1.5 , # FIXME: use variable
409
- retract_mm = 3.0 , # FIXME: use variable
415
+ submerge_mm = - 1.5 , # NOTE: this will continue to be set here in script until LLD is available
416
+ retract_mm = _retract_mm , # FIXME: use value from liquid-class definition
410
417
mix = None ,
411
418
aspirate = trial .volume if is_aspirate else None ,
412
419
dispense = trial .volume if not is_aspirate else None ,
413
420
blank = trial .blank ,
414
421
channel_count = trial .channel_count ,
415
422
)
416
- _attr_name = "aspirate" if is_aspirate else "dispense"
417
- _asp_or_disp = getattr (liquid_class , _attr_name )
418
423
# NOTE: setting all position references to BOTTOM
419
424
_asp_or_disp .submerge .position_reference = PositionReference .WELL_BOTTOM
420
425
_asp_or_disp .position_reference = PositionReference .WELL_BOTTOM
@@ -445,16 +450,19 @@ def _calculate_meniscus_relative_offsets(is_aspirate: bool) -> None:
445
450
else :
446
451
# FIXME: this should happen inside the `transfer_liquid` command
447
452
# so delete this `configure` call once that is added
453
+ # NOTE: required to remove air-gap before calling configure-for-volume
454
+ trial .pipette .dispense (trial .pipette .current_volume , push_out = 0 )
455
+ trial .pipette .prepare_to_aspirate ()
448
456
if trial .mode == "default" :
449
457
trial .pipette .configure_for_volume (volume = trial .pipette .max_volume )
450
458
elif trial .mode == "lowVolumeDefault" :
451
459
assert trial .pipette .max_volume == 50
452
460
trial .pipette .configure_for_volume (volume = trial .pipette .min_volume )
453
461
else :
454
462
trial .pipette .configure_for_volume (volume = trial .volume )
463
+ _calculate_meniscus_relative_offsets (is_aspirate = True )
455
464
# FIXME: This assumes whatever is in the pipette from last trial is air (not liquid),
456
465
# and so this would break any sort of multi-dispense testing
457
- _calculate_meniscus_relative_offsets (is_aspirate = True )
458
466
assumed_air_gap = trial .pipette .current_volume
459
467
tip_contents = trial .pipette ._core .aspirate_liquid_class (
460
468
volume = trial .volume ,
0 commit comments