def update_table(self, columns): """Updates the OmeroTables instance backing our results.""" # Create a new OMERO table to store our measurement results sr = self.service_factory.sharedResources() name = self.get_name() self.table = sr.newTable(1, "/%s.r5" % name) if self.table is None: raise MeasurementError("Unable to create table: %s" % name) # Retrieve the original file corresponding to the table for the # measurement, link it to the file annotation representing the # umbrella measurement run, link the annotation to the plate from # which it belongs and save the file annotation. table_original_file = self.table.getOriginalFile() table_original_file_id = table_original_file.id.val log.info("Created new table: %d" % table_original_file_id) unloaded_o_file = OriginalFileI(table_original_file_id, False) self.file_annotation.file = unloaded_o_file unloaded_plate = PlateI(self.analysis_ctx.plate_id, False) plate_annotation_link = PlateAnnotationLinkI() plate_annotation_link.parent = unloaded_plate plate_annotation_link.child = self.file_annotation plate_annotation_link = self.update_service.saveAndReturnObject(plate_annotation_link) self.file_annotation = plate_annotation_link.child t0 = int(time.time() * 1000) self.table.initialize(columns) log.debug("Table init took %sms" % (int(time.time() * 1000) - t0)) t0 = int(time.time() * 1000) column_report = dict() for column in columns: column_report[column.name] = len(column.values) log.debug("Column report: %r" % column_report) self.table.addData(columns) log.info("Table update took %sms" % (int(time.time() * 1000) - t0))
def create_table(client, plate_id): '''Create a new OMERO table to store our measurement results.''' session = client.getSession() update_service = session.getUpdateService() sr = session.sharedResources() name = '/segmentation_simple.r5' table = sr.newTable(1, name) if table is None: raise Exception( 'Unable to create table: %s' % name) # Retrieve the original file corresponding to the table for the # measurement, link it to the file annotation representing the # umbrella measurement run, link the annotation to the plate from # which it belongs and save the file annotation. try: table_original_file = table.getOriginalFile() table_original_file_id = table_original_file.id.val log.info('Created new table: %d' % table_original_file_id) unloaded_o_file = OriginalFileI(table_original_file_id, False) file_annotation = create_file_annotation() file_annotation.file = unloaded_o_file unloaded_plate = PlateI(plate_id, False) plate_annotation_link = PlateAnnotationLinkI() plate_annotation_link.parent = unloaded_plate plate_annotation_link.child = file_annotation plate_annotation_link = \ update_service.saveAndReturnObject(plate_annotation_link) file_annotation = plate_annotation_link.child table.initialize(get_columns()) except: table.close() raise return (table, file_annotation)
def testPopulateRoisPlate(self): """ Create a small csv file, use populate_roi.py to parse and attach to Plate. Then query to check table has expected content. """ csvName = self.createCsv(colNames="Well,Field,X,Y,Type", rowData=("A1,0,15,15,Test", )) rowCount = 1 colCount = 1 plate = self.createPlate(rowCount, colCount) # As opposed to the ParsingContext, here we are expected # to link the file ourselves ofile = self.client.upload(csvName).proxy() ann = FileAnnotationI() ann.file = ofile link = PlateAnnotationLinkI() link.parent = plate.proxy() link.child = ann link = self.client.sf.getUpdateService()\ .saveAndReturnObject(link) # End linking factory = PlateAnalysisCtxFactory(self.client.sf) factory.implementations = (MockPlateAnalysisCtx, ) ctx = factory.get_analysis_ctx(plate.id.val) assert 1 == ctx.get_measurement_count() meas = ctx.get_measurement_ctx(0) meas.parse_and_populate() # Get file annotations query = """select p from Plate p left outer join fetch p.annotationLinks links left outer join fetch links.child as ann left outer join fetch ann.file as file where p.id=%s""" % plate.id.val qs = self.client.sf.getQueryService() plate = qs.findByQuery(query, None) anns = plate.linkedAnnotationList() # Only expect a single annotation which is a 'bulk annotation' # the other is the original CSV assert len(anns) == 2 files = dict([(a.ns.val, a.file.id.val) for a in anns if a.ns]) fileid = files[NSMEASUREMENT] # Open table to check contents r = self.client.sf.sharedResources() t = r.openTable(OriginalFileI(fileid), None) cols = t.getHeaders() rows = t.getNumberOfRows() assert rows == 1 data = t.read(range(len(cols)), 0, 1) imag = data.columns[0].values[0] rois = self.client.sf.getRoiService() anns = rois.getRoiMeasurements(imag, RoiOptions()) assert anns
def create_annotation_link(self): self.target_class = self.target_object.__class__ if ScreenI is self.target_class: return ScreenAnnotationLinkI() if PlateI is self.target_class: return PlateAnnotationLinkI() if DatasetI is self.target_class: return DatasetAnnotationLinkI() raise MetadataError('Unsupported target object class: %s' \ % target_class)
def plate_well_table(itest, well_grid_factory, update_service, conn): """ Returns a new OMERO Plate, linked Wells, linked WellSamples, and linked Images populated by an L{weblibrary.IWebTest} instance. """ plate = PlateI() plate.name = rstring(itest.uuid()) # Well A1 has one WellSample plate.addWell(well_grid_factory({(0, 0): 1})[0]) plate = update_service.saveAndReturnObject(plate) col1 = WellColumn('Well', '', []) col2 = StringColumn('TestColumn', '', 64, []) columns = [col1, col2] tablename = "plate_well_table_test:%s" % str(random()) table = conn.c.sf.sharedResources().newTable(1, tablename) table.initialize(columns) wellIds = [w.id.val for w in plate.copyWells()] print "WellIds", wellIds data1 = WellColumn('Well', '', wellIds) data2 = StringColumn('TestColumn', '', 64, ["foobar"]) data = [data1, data2] table.addData(data) table.close() orig_file = table.getOriginalFile() fileAnn = FileAnnotationI() fileAnn.ns = rstring('openmicroscopy.org/omero/bulk_annotations') fileAnn.setFile(OriginalFileI(orig_file.id.val, False)) fileAnn = conn.getUpdateService().saveAndReturnObject(fileAnn) link = PlateAnnotationLinkI() link.setParent(PlateI(plate.id.val, False)) link.setChild(FileAnnotationI(fileAnn.id.val, False)) update_service.saveAndReturnObject(link) return plate, wellIds
def update_table(self, columns): """Updates the OmeroTables instance backing our results.""" # Create a new OMERO table to store our measurement results sr = self.service_factory.sharedResources() name = self.get_name() self.table = sr.newTable(1, '/%s.r5' % name) if self.table is None: raise MeasurementError( "Unable to create table: %s" % name) # Retrieve the original file corresponding to the table for the # measurement, link it to the file annotation representing the # umbrella measurement run, link the annotation to the plate from # which it belongs and save the file annotation. table_original_file = self.table.getOriginalFile() table_original_file_id = table_original_file.id.val log.info("Created new table: %d" % table_original_file_id) unloaded_o_file = OriginalFileI(table_original_file_id, False) self.file_annotation.file = unloaded_o_file unloaded_plate = PlateI(self.analysis_ctx.plate_id, False) plate_annotation_link = PlateAnnotationLinkI() plate_annotation_link.parent = unloaded_plate plate_annotation_link.child = self.file_annotation plate_annotation_link = \ self.update_service.saveAndReturnObject(plate_annotation_link) self.file_annotation = plate_annotation_link.child t0 = int(time.time() * 1000) self.table.initialize(columns) log.debug("Table init took %sms" % (int(time.time() * 1000) - t0)) t0 = int(time.time() * 1000) column_report = dict() for column in columns: column_report[column.name] = len(column.values) log.debug("Column report: %r" % column_report) self.table.addData(columns) self.table.close() log.info("Table update took %sms" % (int(time.time() * 1000) - t0))
def plate_well_table(itest, well_grid_factory, update_service, conn): """ Returns a new OMERO Plate, linked Wells, linked WellSamples, and linked Images populated by an L{omeroweb.testlib.IWebTest} instance. """ plate = PlateI() plate.name = rstring(itest.uuid()) # Well A1 has one WellSample plate.addWell(well_grid_factory({(0, 0): 1})[0]) plate = update_service.saveAndReturnObject(plate) col1 = WellColumn('Well', '', []) col2 = StringColumn('TestColumn', '', 64, []) columns = [col1, col2] tablename = "plate_well_table_test:%s" % str(random()) table = conn.c.sf.sharedResources().newTable(1, tablename) table.initialize(columns) wellIds = [w.id.val for w in plate.copyWells()] print("WellIds", wellIds) data1 = WellColumn('Well', '', wellIds) data2 = StringColumn('TestColumn', '', 64, ["foobar"]) data = [data1, data2] table.addData(data) orig_file = table.getOriginalFile() table.close() fileAnn = FileAnnotationI() fileAnn.ns = rstring('openmicroscopy.org/omero/bulk_annotations') fileAnn.setFile(OriginalFileI(orig_file.id.val, False)) fileAnn = conn.getUpdateService().saveAndReturnObject(fileAnn) link = PlateAnnotationLinkI() link.setParent(PlateI(plate.id.val, False)) link.setChild(FileAnnotationI(fileAnn.id.val, False)) update_service.saveAndReturnObject(link) return plate, wellIds
def testPopulateRoisPlate(self): """ Create a small csv file, use populate_roi.py to parse and attach to Plate. Then query to check table has expected content. """ csvName = self.createCsv( colNames="Well,Field,X,Y,Type", rowData=("A1,0,15,15,Test",)) rowCount = 1 colCount = 1 plate = self.createPlate(rowCount, colCount) # As opposed to the ParsingContext, here we are expected # to link the file ourselves ofile = self.client.upload(csvName).proxy() ann = FileAnnotationI() ann.file = ofile link = PlateAnnotationLinkI() link.parent = plate.proxy() link.child = ann link = self.client.sf.getUpdateService()\ .saveAndReturnObject(link) # End linking factory = PlateAnalysisCtxFactory(self.client.sf) factory.implementations = (MockPlateAnalysisCtx,) ctx = factory.get_analysis_ctx(plate.id.val) assert 1 == ctx.get_measurement_count() meas = ctx.get_measurement_ctx(0) meas.parse_and_populate() # Get file annotations query = """select p from Plate p left outer join fetch p.annotationLinks links left outer join fetch links.child as ann left outer join fetch ann.file as file where p.id=%s""" % plate.id.val qs = self.client.sf.getQueryService() plate = qs.findByQuery(query, None) anns = plate.linkedAnnotationList() # Only expect a single annotation which is a 'bulk annotation' # the other is the original CSV assert len(anns) == 2 files = dict( [(a.ns.val, a.file.id.val) for a in anns if a.ns]) fileid = files[NSMEASUREMENT] # Open table to check contents r = self.client.sf.sharedResources() t = r.openTable(OriginalFileI(fileid), None) cols = t.getHeaders() rows = t.getNumberOfRows() assert rows == 1 data = t.read(range(len(cols)), 0, 1) imag = data.columns[0].values[0] rois = self.client.sf.getRoiService() anns = rois.getRoiMeasurements(imag, RoiOptions()) assert anns