def _load_well_object_from_db(db, well_data): container_name, location, x, y, z, \ depth, volume, diameter, length, width = well_data props = zip( ['depth', 'total-liquid-volume', 'diameter', 'length', 'width'], [depth, volume, diameter, length, width]) property_dict = {k: v for k, v in props if v} well = Well(properties=property_dict) # subtract half the size, because # Placeable assigns X-Y to bottom-left corner, # but db assigns X-Y to well center x -= (well.x_size() / 2) y -= (well.y_size() / 2) well_coordinates = (x, y, z) return (well, location, well_coordinates)
def create_container_obj_from_dict(container_data: dict) -> Container: """ Example input: container data for a "24-plate": { "origin-offset":{ "x":13.3, "y":17.5 }, "locations":{ "A1":{ "x":0.0, "total-liquid-volume":3400, "y":0.0, "depth":16.2, "z":0, "diameter":15.62 }, "A2":{ "x":0.0, "total-liquid-volume":3400, "y":19.3, "depth":16.2, "z":0, "diameter":15.62 } Exampl input #2: "trough-12row": { "locations":{ "A1":{ "x":0, "y":0, "z":0, "depth":40, "length":8, "width":70, "total-liquid-volume":22000 }, "A2":{ "x":0, "y":9, "z":0, "depth":40, "length":8, "width":70, "total-liquid-volume":22000 }, "A3":{ "x":0, "y":18, "z":0, "depth":40, "length":8, "width":70, "total-liquid-volume":22000 } """ container_data = copy.deepcopy(container_data) origin_offset_x = container_data.get('origin-offset', {}).get('x') or 0 origin_offset_y = container_data.get('origin-offset', {}).get('y') or 0 container = Container() locations = container_data.get('locations') for well_name, well_properties in locations.items(): x = well_properties.pop('x') y = well_properties.pop('y') z = well_properties.pop('z') # assert 'depth' in well_properties # assert 'diameter' in well_properties # assert 'length' in well_properties # assert 'width' in well_properties # assert 'total-liquid-volume' in well_properties assert isinstance(x, numbers.Number) assert isinstance(y, numbers.Number) assert isinstance(z, numbers.Number) well = Well(properties=well_properties) # subtract half the size, because # Placeable assigns X-Y to bottom-left corner, but # persisted container files assign X-Y to center of each Well x -= (well.x_size() / 2) y -= (well.y_size() / 2) well_coordinates = (x + origin_offset_x, y + origin_offset_y, z) container.add(well, well_name, well_coordinates) return container