import logging
import matplotlib.pyplot as plt
import fibsem
log = logging.getLogger(__name__)
[docs]class Sample:
"""Abstract base class for FIB-SEM samples. NOT FOR DIRECT USE"""
def __init__(self):
self.image = None
self.mask = None
self.milling_rois = None
self.pixel_size = None
self.stage_position = None
[docs] def set_image(self, microscope):
microscope.imaging.set_active_view(2) # ion beam view
self.image = microscope.imaging.get_image()
try:
self.set_pixel_size()
except AttributeError:
pass
return self.image
[docs] def set_pixel_size(self):
if self.image is not None:
self.pixel_size = self.image.metadata.binary_result.pixel_size
return self.image.metadata.binary_result.pixel_size
[docs] def set_stage_position(self, microscope):
self.stage_position = microscope.specimen.stage.current_position
return self.stage_position
[docs] def set_mask(self):
while self.mask is None:
self.mask = fibsem.segmentation.manual_segmentation(self.image)
while not (self.mask == True).any():
log.info('No mask region selected! Must right click to finalize!')
self.mask = fibsem.segmentation.manual_segmentation(self.image)
return self.mask
[docs] def move_to_stage_position(self, microscope):
target_position = self.stage_position
microscope.specimen.stage.absolute_move(target_position)
[docs] def print_vars(self):
print(vars(self))
[docs] def save_vars(self, output_filename):
with open(output_filename, 'w') as f:
f.write(str(vars(self)))
[docs]class Embryo(Sample):
"""Class for FIB-SEM embryos."""
def __init__(self, microscope=None):
super(Embryo, self).__init__()
self.major_axis = None
self.minor_axis = None
self.head_position = None
self.axes_for_milling = None
if microscope:
self.image = self.set_image(microscope)
self.pixel_size = self.set_pixel_size()
self.stage_position = self.set_stage_position(microscope)
else:
self.image = fibsem.data.embryo_adorned()
self.mask = fibsem.data.embryo_mask()
self.pixel_size = fibsem.mocktypes.MockPixelSize(x=1e-6, y=1e-6)
[docs] def display_crosshairs(self):
if self.major_axis is None or self.minor_axis is None:
self.orientation()
fig, ax = fibsem.display.draw_crosshairs(
self.image, self.major_axis, self.minor_axis)
plt.show()
[docs] def display_milling_axes(self):
if not self.axes_for_milling:
raise ValueError('Must call set_axes_for_milling() method first!')
else:
fig, ax = fibsem.display.draw_object_axes(
self.image, self.axes_for_milling)
plt.show()
[docs] def display_milling_rois(self):
fig, ax = fibsem.display.draw_rotated_rects(
self.milling_rois, image=self.image)
plt.show()
[docs] def display_milling_rois_mask(self):
mask_adorned = fibsem.conversions.convert_to_adornedimage(
self.mask, self.pixel_size.x, self.pixel_size.y)
fig, ax = fibsem.display.draw_rotated_rects(
self.milling_rois, image=mask_adorned)
plt.show()
[docs] def set_axes_for_milling(self, settings):
head2tail_axis, tail2head_axis = fibsem.milling._milling_directions(
self.major_axis, settings)
self.axes_for_milling = [head2tail_axis, tail2head_axis]
[docs] def set_head_position(self):
self.head_position = fibsem.segmentation.select_point(self.image)
return self.head_position
[docs] def set_milling_rois(self, settings):
if self.major_axis is None or self.minor_axis is None:
self.orientation()
self.milling_rois = fibsem.milling.all_roi_coordinates(self, settings)
return self.milling_rois
[docs] def orientation(self):
major_axis, minor_axis = fibsem.orientation.major_minor_axes_realspace(
self.mask, self.pixel_size, reference_coord=self.head_position)
self.major_axis = major_axis
self.minor_axis = minor_axis
return self.major_axis, self.minor_axis
[docs]def add_samples(microscope, settings):
"""Interactive function to add samples to list.
Parameters
----------
microscope : Autoscript microscope object.
settings : User input argument settings.
Returns
-------
samples
List of FIB-SEM sample objects.
"""
from fibsem.user_input import response_yes, response_no, response_cancel
samples = []
user_response = ''
while user_response.lower() not in response_no:
message = 'Do you want to select another sample for milling? y/n'
user_response = fibsem.user_input.response(message)
if user_response.lower() in response_yes:
my_sample = Embryo(microscope)
my_sample.set_mask()
if isinstance(my_sample, Embryo):
my_sample.set_head_position()
my_sample.set_milling_rois(settings)
samples.append(my_sample)
return samples