Getting started with the OMERO Python API
Description
We will show:
Connect to a server.
Load images.
Run a simple FRAP analysis measuring the intensity within a pre-existing ellipse ROI in a named Channel.
Save the generated mean intensities and link them to the image(s).
Save the generated plot on the server.
Setup
We recommend to use a Conda environment to install the OMERO Python bindings. Please read first Install omero-py.
For the FRAP analysis you need a fluorescence time-lapse image, available at https://downloads.openmicroscopy.org/images/DV/will/FRAP/.
The bleached spot has to be marked with an ellipse. Make sure that the ellipse ROI spans the whole timelapse.
Step-by-Step
In this section, we go through the steps required to analyze the data.
The script used in this document is simple_frap.py
.
It is also available as the ‘SimpleFRAP’ Jupyter notebook in the notebooks section.
Modules and methods which need to be imported:
from omero.gateway import BlitzGateway, MapAnnotationWrapper
from omero.model import EllipseI
from PIL import Image
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from getpass import getpass
Connect to the server. It is also important to close the connection again
to clear up potential resources held on the server. This is done in the
`disconnect
method.
def connect(hostname, username, password):
"""
Connect to an OMERO server
:param hostname: Host name
:param username: User
:param password: Password
:return: Connected BlitzGateway
"""
conn = BlitzGateway(username, password,
host=hostname, secure=True)
conn.connect()
conn.c.enableKeepAlive(60)
return conn
def disconnect(conn):
"""
Disconnect from an OMERO server
:param conn: The BlitzGateway
"""
conn.close()
Load the image:
img = conn.getObject("Image", image_id)
Get relevant channel index:
def get_channel_index(image, label):
"""
Get the channel index of a specific channel
:param image: The image
:param label: The channel name
:return: The channel index (None if not found)
"""
labels = image.getChannelLabels()
if label in labels:
idx = labels.index(label)
return idx
return None
Get Ellipse ROI:
def get_ellipse_roi(conn, image):
"""
Get the first ellipse ROI found in the image
:param conn: The BlitzGateway
:param image: The Image
:return: The shape ID of the first ellipse ROI found
"""
roi_service = conn.getRoiService()
result = roi_service.findByImage(image.getId(), None)
shape_id = None
for roi in result.rois:
for s in roi.copyShapes():
if type(s) == EllipseI:
shape_id = s.id.val
return shape_id
Get intensity values:
def get_mean_intensities(conn, image, the_c, shape_id):
"""
Get the mean pixel intensities of an roi in a time series image
:param conn: The BlitzGateway
:param image: The image
:param the_c: The channel index
:param shape_id: The ROI shape id
:return: List of mean intensity values (one for each timepoint)
"""
roi_service = conn.getRoiService()
the_z = 0
size_t = image.getSizeT()
meanvalues = []
for t in range(size_t):
stats = roi_service.getShapeStatsRestricted([shape_id],
the_z, t, [the_c])
meanvalues.append(stats[0].mean[0])
return meanvalues
Plot the data using matplotlib
:
def plot(values, plot_filename):
"""
Create a simple plot of the given values
and saves it.
:param values: The values
:param plot_filename: The file name
:return: Nothing
"""
matplotlib.use('Agg')
fig = plt.figure()
plt.subplot(111)
plt.plot(values)
fig.canvas.draw()
fig.savefig(plot_filename)
pil_img = Image.open(plot_filename)
pil_img.show()
Save the results as Map annotation:
def save_values(conn, image, values):
"""
Attach the values as map annotation to the image
:param conn: The BlitzGateway
:param image: The image
:param values: The values
:return: Nothing
"""
namespace = "demo.simple_frap_data"
key_value_data = [[str(t), str(value)] for t, value in enumerate(values)]
map_ann = MapAnnotationWrapper(conn)
map_ann.setNs(namespace)
map_ann.setValue(key_value_data)
map_ann.save()
image.linkAnnotation(map_ann)
Save the plot:
def save_plot(conn, image, plot_filename):
"""
Save the plot to OMERO
:param conn: The BlitzGateway
:param image: The image
:param plot_filename: The path to the plot image
:return: Nothing
"""
pil_img = Image.open(plot_filename)
np_array = np.asarray(pil_img)
red = np_array[::, ::, 0]
green = np_array[::, ::, 1]
blue = np_array[::, ::, 2]
plane_gen = iter([red, green, blue])
conn.createImageFromNumpySeq(plane_gen, plot_filename, sizeC=3,
dataset=image.getParent())
In order the use the methods implemented above in a proper standalone script:
Wrap it all up in an analyse
method and call it from main
:
def analyse(conn, image_id, channel_name):
# Step 2 - Load iamge
img = conn.getObject("Image", image_id)
# -
ci = get_channel_index(img, channel_name)
shape_id = get_ellipse_roi(conn, img)
values = get_mean_intensities(conn, img, ci, shape_id)
plot(values, 'plot.png')
save_values(conn, img, values)
save_plot(conn, img, 'plot.png')
def main():
try:
hostname = input("Host [wss://workshop.openmicroscopy.org/omero-ws]: \
") or "wss://workshop.openmicroscopy.org/omero-ws"
username = input("Username [trainer-1]: ") or "trainer-1"
password = getpass("Password: ")
image_id = int(input("Image ID [28662]: ") or 28662)
channel = input("Channel name [528.0]: ") or "528.0"
conn = connect(hostname, username, password)
analyse(conn, image_id, channel)
finally:
if conn:
disconnect(conn)
if __name__ == "__main__":
main()
Further Reading
How to turn a script into an OMERO script which runs on the server and can be directly launched via the web interface, see How to convert a client-side script into a server-side script.
This simple_frap.py
example as server-side OMERO.script:
simple_frap_server.py
.