Getting started with CellProfiler and OMERO
Description
We will use a Python script showing how to analyze data stored in an OMERO server using the CellProfiler API.
We will show:
How to connect to server.
How load images from a Plate using the OMERO API.
How to run CellProfiler using its Python API.
How to save the generated results and link them to the Plate.
Resources
We will use a CellProfiler example pipeline to analyse RNAi screening data from the Image Data Resource (IDR).
Example pipeline from the CellProfiler website: Cell/particle counting and scoring the percentage of stained objects.
Images from IDR idr0002.
For convenience, the IDR data have been imported into the training OMERO.server. This is only because we cannot save results back to IDR which is a read-only OMERO.server.
Setup
We recommend to use a Conda environment to install CellProfiler and the OMERO Python bindings. Please read first Install CellProfiler and OMERO Python bindings.
Step-by-Step
In this section, we go over the various steps required to analyse the data.
The script used in this document is idr0002_save.py
.
When running CellProfiler headless, it is important to set the following:
import cellprofiler_core.preferences as cpprefs
# Important to set when running headless
cpprefs.set_headless() # noqa
Connect to the server:
def connect(hostname, username, password):
conn = BlitzGateway(username, password,
host=hostname, secure=True)
conn.connect()
return conn
Load the plate:
def load_plate(conn, plate_id):
return conn.getObject("Plate", plate_id)
A CellProfiler pipeline usually expects the files to be analyzed to be available locally. This is not the case here. So we first need to remove some modules from the pipeline so we can then inject data retrieved from the OMERO server:
def load_pipeline(pipeline_path):
pipeline = cpp.Pipeline()
pipeline.load(pipeline_path)
# Remove first 4 modules: Images, Metadata, NamesAndTypes, Groups...
# (replaced by InjectImage module below)
for i in range(4):
print('Remove module: ', pipeline.modules()[0].module_name)
pipeline.remove_module(1)
print('Pipeline modules:')
for module in pipeline.modules():
print(module.module_num, module.module_name)
return pipeline
We are now ready to analyze the plate:
def analyze(plate, pipeline):
warnings.filterwarnings('ignore')
print("analyzing...")
# Set Cell Output Directory
new_output_directory = os.path.normcase(tempfile.mkdtemp())
cpprefs.set_default_output_directory(new_output_directory)
files = list()
wells = list(plate.listChildren())
wells = wells[0:5] # use the first 5 wells
for count, well in enumerate(wells):
# Load a single Image per Well
image = well.getImage(0)
print(image.getName())
pixels = image.getPrimaryPixels()
size_c = image.getSizeC()
# For each Image in OMERO, we copy pipeline and inject image modules
pipeline_copy = pipeline.copy()
# Inject image for each Channel (pipeline only handles 2 channels)
for c in range(0, size_c):
plane = pixels.getPlane(0, c, 0)
image_name = image.getName()
# Name of the channel expected in the pipeline
if c == 0:
image_name = 'OrigBlue'
if c == 1:
image_name = 'OrigGreen'
inject_image_module = InjectImage(image_name, plane)
inject_image_module.set_module_num(1)
pipeline_copy.add_module(inject_image_module)
pipeline_copy.run()
# Results obtained as CSV from Cell Profiler
path = new_output_directory + '/Nuclei.csv'
files.append(path)
print("analysis done")
return files
Let’s now save the generated CSV files and link them to the plate:
def save_results(conn, files, plate):
# Upload the CSV files
print("saving results...")
namespace = "cellprofiler.demo.namespace"
for f in files:
ann = conn.createFileAnnfromLocalFile(f, mimetype="text/csv",
ns=namespace, desc=None)
plate.linkAnnotation(ann)
When done, close the session:
def disconnect(conn):
conn.close()
In order to use the methods implemented above in a proper standalone script:
Wrap it all up in an analyze
method and call it from main
:
def main():
# Collect user credentials
host = 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: ")
plate_id = input("Plate ID [102]: ") or '102'
# Connect to the server
conn = connect(host, username, password)
# Read the pipeline
pipeline_path = "../notebooks/pipelines/ExamplePercentPositive.cppipe"
pipeline = load_pipeline(pipeline_path)
# Load the plate
plate = load_plate(conn, plate_id)
files = analyze(plate, pipeline)
save_results(conn, files, plate)
disconnect(conn)
print("done")
if __name__ == "__main__":
main()