def index(request): conn = BlitzGateway(OMERO_USER,OMERO_PASSWORD,host=os.environ['OMEROHOST']) if not conn.connect(): return HttpResponseServerError("Could not connect to Omero server") projects = [] thumbnails = {} for project in conn.listProjects(): can_get_rois = False p = {'id':project.id, 'name':project.name, 'datasets':[] } for dataset in project.listChildren(): ds = {'id':dataset.id, 'name':dataset.name, 'images':[] } for image in dataset.listChildren(): #if image.getROICount() > 0: img_meta = image.simpleMarshal() if dataset.name != 'ROI_images' and len(img_from_roi.getRectangles(conn,image)) >0: img_meta['can_get_rois'] = True ds['images'].append(img_meta) size_x = image.getSizeX() size_y = image.getSizeY() if size_x*0.005 > 256: thumbnails[image.id] = image.getThumbnail(size=(size_x*0.005,size_y*0.005)) else: thumbnails[image.id] = image.getThumbnail(size=(size_x*0.1,size_y*0.1)) p['datasets'].append(ds) projects.append(p) conn.close() return render(request, 'exportml/index.html',{'projects':projects,'thumbnails':thumbnails})
class Omg(object): """ OMERO gateway that wraps Blitz gateway and CLI, intended for scripting and interactive work. Attributes ---------- conn : Blitz gateway connection """ def __init__(self, conn=None, user=None, passwd=None, server=SERVER, port=PORT, skey=None): """ Requires active Blitz connection OR username plus password or sesskey """ if conn is None and (user is None or (passwd is None and skey is None)): raise ValueError("Bad parameters," + self.__init__.__doc__) if conn is not None: if conn.isConnected(): self.conn = conn else: raise ValueError("Cannot initialize with closed connection!") else: if passwd is not None: self.conn = BlitzGateway(user, passwd, host=server, port=port) self.conn.connect() else: self.conn = BlitzGateway(user, host=server, port=port) self.conn.connect(skey) if self.conn.isConnected(): self._server = self.conn.host self._port = self.conn.port self._user = self.conn.getUser().getName() self._key = self.conn.getSession().getUuid().getValue() print("Connected to {0} (port {1}) as {2}, session key={3}".format( self._server, self._port, self._user, self._key)) else: print("Failed to open connection :-(") def ls(self): """ Print groups, then projects/datasets/images for current group. """ print("Groups for {0}:-".format(self.conn.getUser().getName())) for gid, gname in self._ls_groups(): print(" {0} ({1})".format(gname, str(gid))) curr_grp = self.conn.getGroupFromContext() gid, gname = curr_grp.getId(), curr_grp.getName() print("\nData for current group, {0} ({1}):-".format(gname, gid)) for pid, pname in self._ls_projects(): print(" Project: {0} ({1})".format(pname, str(pid))) for did, dname in self._ls_datasets(pid): print(" Dataset: {0} ({1})".format(dname, str(did))) for iid, iname in self._ls_images(did): print(" Image: {0} ({1})".format(iname, str(iid))) # TODO, list orphaned Datasets and Images def _ls_groups(self): """list groups (id, name) this session is a member of""" groups = self.conn.getGroupsMemberOf() return [(group.getId(), group.getName()) for group in groups] def _ls_projects(self): """list projects (id, name) in the current session group""" projs = self.conn.listProjects(self.conn.getUserId()) return [(proj.getId(), proj.getName()) for proj in projs] def _ls_datasets(self, proj_id): """list datasets (id, name) within the project id given""" dsets = self.conn.getObject("Project", proj_id).listChildren() return [(dset.getId(), dset.getName()) for dset in dsets] def _ls_images(self, dset_id): """list images (id, name) within the dataset id given""" imgs = self.conn.getObject("Dataset", dset_id).listChildren() return [(img.getId(), img.getName()) for img in imgs] def chgrp(self, group_id): """ Change group for this session to the group_id given. """ self.conn.setGroupForSession(group_id) def get(self, im_id, get_att=True): """ Download the specified image as an OME-TIFF to current directory, with attachments also downloaded to folder: img_path + '_attachments' Return : path to downloaded image """ img = self.conn.getObject("Image", oid=im_id) img_name = self._unique_name(img.getName(), im_id) img_path = os.path.join(os.getcwd(), img_name) img_file = open(str(img_path + ".ome.tiff"), "wb") fsize, blockgen = img.exportOmeTiff(bufsize=65536) for block in blockgen: img_file.write(block) img_file.close() fa_type = omero.model.FileAnnotationI attachments = [ann for ann in img.listAnnotations() if ann.OMERO_TYPE == fa_type] if get_att and len(attachments) > 0: att_dir = img_path + "_attachments" os.mkdir(att_dir) def download_attachment(att, att_dir): """download OMERO file annotation to att_dir""" att_file = open(os.path.join(att_dir, att.getFileName()), "wb") for att_chunk in att.getFileInChunks(): att_file.write(att_chunk) att_file.close() for att in attachments: download_attachment(att, att_dir) return img_path def _unique_name(self, img_name, im_id): """Make unique name combining a file basename & OMERO Image id""" path_and_base, ext = os.path.splitext(img_name) base = os.path.basename(path_and_base) # name in OMERO can has path return "{0}_{1}".format(base, str(im_id)) def dget(self, dataset_id): """ Download an entire OMERO Dataset to the current directory. """ downloads = [] wdir = os.getcwd() dset_name = self.conn.getObject("Dataset", dataset_id).getName() dset_path = os.path.join(wdir, dset_name + "_D" + str(dataset_id)) os.mkdir(dset_path) os.chdir(dset_path) for img_id, img_name in self._ls_images(dataset_id): downloads.append(self.get(img_id)) os.chdir(wdir) return downloads def pget(self, project_id): """ Download an entire OMERO Project to the current directory. """ downloads = [] wdir = os.getcwd() proj_name = self.conn.getObject("Project", project_id).getName() proj_path = os.path.join(wdir, proj_name + "_P" + str(project_id)) os.mkdir(proj_path) os.chdir(proj_path) for dset_id, dset_name in self._ls_datasets(project_id): downloads.extend(self.dget(dset_id)) os.chdir(wdir) return downloads def put(self, filename, name=None, dataset=None): """ Import filename using OMERO CLI, optionally with a specified name to a specified dataset (dataset_id). Return : OMERO image Id """ cli = omero.cli.CLI() cli.loadplugins() import_args = ["import"] import_args.extend(["-s", str(self._server)]) import_args.extend(["-k", str(self._key)]) if dataset is not None: import_args.extend(["-d", str(dataset)]) if name is not None: import_args.extend(["-n", str(name)]) clio = "cli.out" clie = "cli.err" import_args.extend(["---errs=" + clie, "---file=" + clio, "--"]) import_args.append(filename) cli.invoke(import_args, strict=True) pix_id = int(open(clio, 'r').read().rstrip()) im_id = self.conn.getQueryService().get("Pixels", pix_id).image.id.val os.remove(clio) os.remove(clie) return im_id def describe(self, im_id, description): """ Append to image description. """ img = self.conn.getObject("Image", oid=im_id) old_description = img.getDescription() or "" img.setDescription(old_description + "\n" + description) img.save() def attach(self, im_id, attachments): """ Attach a list of files to an image. """ img = self.conn.getObject("Image", oid=im_id) for attachment in attachments.split(): fann = self.conn.createFileAnnfromLocalFile(attachment) img.linkAnnotation(fann) img.save() # TODO: ls_tags() and tag() methods? def mkp(self, project_name, description=None): """ Make new OMERO project in current group, returning the new project Id. """ # see: omero/lib/python/omeroweb/webclient/controller/container.py proj = omero.model.ProjectI() proj.name = omero.rtypes.rstring(str(project_name)) if description is not None and description != "": proj.description = omero.rtypes.rstring(str(description)) return self._save_and_return_id(proj) def mkd(self, dataset_name, project_id=None, description=None): """ Make new OMERO dataset, returning the new dataset Id. """ dset = omero.model.DatasetI() dset.name = omero.rtypes.rstring(str(dataset_name)) if description is not None and description != "": dset.description = omero.rtypes.rstring(str(description)) if project_id is not None: l_proj_dset = omero.model.ProjectDatasetLinkI() proj = self.conn.getObject("Project", project_id) l_proj_dset.setParent(proj._obj) l_proj_dset.setChild(dset) dset.addProjectDatasetLink(l_proj_dset) return self._save_and_return_id(dset) def _save_and_return_id(self, obj): """Save new omero object and return id assgined to it""" # see: OmeroWebGateway.saveAndReturnId # in: lib/python/omeroweb/webclient/webclient_gateway.py u_s = self.conn.getUpdateService() res = u_s.saveAndReturnObject(obj, self.conn.SERVICE_OPTS) res.unload() return res.id.val def im(self, im_id): """ Return an Im object for the image id specified. """ img = self.conn.getObject("Image", im_id) # build pixel np.ndarray nx, ny = img.getSizeX(), img.getSizeY() nz, nt, nc = img.getSizeZ(), img.getSizeT(), img.getSizeC() planes = [(z, c, t) for c in range(nc) for t in range(nt) for z in range(nz)] pix_gen = img.getPrimaryPixels().getPlanes(planes) pix = np.array([i for i in pix_gen]).reshape((nc, nt, nz, ny, nx)) # initialize Im using pix and extracted metadata meta = self._extract_meta(img, im_id) return Im(pix=pix, meta=meta) def _extract_meta(self, img, im_id): """Extract metadata attributes from OMERO Blitz gateway Image""" meta = {} meta['name'] = self._unique_name(img.getName(), im_id) meta['description'] = img.getDescription() def _extract_ch_info(ch): """extract core metadata for for channel, return as dict""" ch_info = {'label': ch.getLabel()} ch_info['ex_wave'] = ch.getExcitationWave() ch_info['em_wave'] = ch.getEmissionWave() ch_info['color'] = ch.getColor().getRGB() return ch_info meta['channels'] = [_extract_ch_info(ch) for ch in img.getChannels()] meta['pixel_size'] = {'x': img.getPixelSizeX(), 'y': img.getPixelSizeY(), 'z': img.getPixelSizeZ(), 'units': "um"} tag_type = omero.model.TagAnnotationI tags = [ann for ann in img.listAnnotations() if ann.OMERO_TYPE == tag_type] meta['tags'] = {tag.getValue() + " (" + str(tag.getId()) + ")": tag.getDescription() for tag in tags} fa_type = omero.model.FileAnnotationI attachments = [ann for ann in img.listAnnotations() if ann.OMERO_TYPE == fa_type] meta['attachments'] = [att.getFileName() + " (" + str(att.getId()) + ")" for att in attachments] user_id = self.conn.getUser().getName() + " (" + \ str(self.conn.getUser().getId()) + ") @" + self.conn.host meta_ext = {} meta_ext['user_id'] = user_id meta['meta_ext'] = meta_ext # TODO: ROIs, display settings? # objective: Image.loadOriginalMetadata()[1][find 'Lens ID Number'][1], return meta def imput(self, im, dataset_id=None): """ Create a new OMERO Image using an Im object, returning new image id. """ # see: omero/lib/python/omero/util/script_utils.py # see: omero/lib/python/omeroweb/webclient/webclient_gateway.py # see: https://gist.github.com/will-moore/4141708 if not isinstance(im, Im): raise TypeError("first imput argument must be of type Im") nc, nt, nz, ny, nx = im.shape ch_nums = range(nc) q_s = self.conn.getQueryService() p_s = self.conn.getPixelsService() c_s = self.conn.getContainerService() u_s = self.conn.getUpdateService() pu_s = self.conn.c.sf.createRawPixelsStore() q_ptype = "from PixelsType as p where p.value='{0}'".format( str(im.dtype)) pixelsType = q_s.findByQuery(q_ptype, None) im_id = p_s.createImage(nx, ny, nz, nt, ch_nums, pixelsType, im.name, im.description) img_i = c_s.getImages("Image", [im_id.getValue()], None)[0] img = self.conn.getObject("Image", im_id.getValue()) pix_id = img_i.getPrimaryPixels().getId().getValue() pu_s.setPixelsId(pix_id, True) for c in range(nc): for t in range(nt): for z in range(nz): plane = im.pix[c, t, z, :, :] script_utils.uploadPlaneByRow(pu_s, plane, z, c, t) l_dset_im = omero.model.DatasetImageLinkI() dset = self.conn.getObject("Dataset", dataset_id) l_dset_im.setParent(dset._obj) l_dset_im.setChild(img._obj) self._update_meta(im, im_id) u_s.saveObject(l_dset_im, self.conn.SERVICE_OPTS) return im_id.getValue() def _update_meta(self, im, im_id): """Set OMERO Image metadata using Im metadata"""
" " * indent, obj.OMERO_CLASS, obj.getId(), obj.getName(), obj.getOwnerOmeName()) # List all Projects available to the user currently logged in # =========================================================== # The only_owned=True parameter limits the Projects which are returned. # If the parameter is omitted or the value is False, then all Projects # visible in the current group are returned. print "\nList Projects:" print "=" * 50 my_expId = conn.getUser().getId() for project in conn.listProjects(my_expId): print_obj(project) for dataset in project.listChildren(): print_obj(dataset, 2) for image in dataset.listChildren(): print_obj(image, 4) # Retrieve the datasets owned by the user currently logged in # =========================================================== # Here we create an omero.sys.ParametersI instance which we # can use to filter the results that are returned. If we did # not pass the params argument to getObjects, then all Datasets # in the current group would be returned. print "\nList Datasets:" print "=" * 50
" " * indent, obj.OMERO_CLASS,\ obj.getId(),\ obj.getName(),\ obj.getOwnerOmeName()) # List all Projects available to me, and their Datasets and Images: # ================================================================= # The only_owned=True parameter limits the Projects which are returned. # If the parameter is omitted or the value is Fale, then all Projects # visible in the current group are returned. print "\nList Projects:" print "=" * 50 my_expId = conn.getUser().getId() for project in conn.listProjects(my_expId): print_obj(project) for dataset in project.listChildren(): print_obj(dataset, 2) for image in dataset.listChildren(): print_obj(image, 4) # Retrieve the datasets owned by the user currently logged in: # ================================================================= # Here we create an omero.sys.ParametersI instance which we # can use to filter the results that are returned. If we did # not pass the params argument to getObjects, then all Datasets # in the current group would be returned. print "\nList Datasets:" print "=" * 50
perm_string = str(group_perms) permission_names = { 'rw----': 'PRIVATE', 'rwr---': 'READ-ONLY', 'rwra--': 'READ-ANNOTATE', 'rwrw--': 'READ-WRITE'} # Not exposed in 4.4.0 clients print "Permissions: %s (%s)" % (permission_names[perm_string], perm_string) # By default, any query applies to ALL data that we can access in our Current # group. # This will be determined by group permissions e.g. in Read-Only or # Read-Annotate groups, this will include other users' data See # :doc:`/sysadmins/server-permissions`. projects = conn.listProjects() # may include other users' data for p in projects: print p.getName(), "Owner: ", p.getDetails().getOwner().getFullName() # Will return None if Image is not in current group image = conn.getObject("Image", imageId) print "Image: ", image # 'Cross-group' querying, use '-1' # =============================== conn.SERVICE_OPTS.setOmeroGroup('-1') image = conn.getObject("Image", imageId) # Will query across all my groups print "Image: ", image, if image is not None: print "Group: ", image.getDetails().getGroup().getName(), print image.details.group.id.val # access groupId without loading group
perm_string = str(group_perms) permission_names = { 'rw----': 'PRIVATE', 'rwr---': 'READ-ONLY', 'rwra--': 'READ-ANNOTATE', 'rwrw--': 'READ-WRITE' } # Not exposed in 4.4.0 clients print "Permissions: %s (%s)" % (permission_names[perm_string], perm_string) # By default, any query applies to ALL data that we can access in our Current # group. # This will be determined by group permissions e.g. in Read-Only or # Read-Annotate groups, this will include other users' data See # :doc:`/sysadmins/server-permissions`. projects = conn.listProjects() # may include other users' data for p in projects: print p.getName(), "Owner: ", p.getDetails().getOwner().getFullName() # Will return None if Image is not in current group image = conn.getObject("Image", imageId) print "Image: ", image # 'Cross-group' querying, use '-1' # =============================== conn.SERVICE_OPTS.setOmeroGroup('-1') image = conn.getObject("Image", imageId) # Will query across all my groups print "Image: ", image, if image is not None: print "Group: ", image.getDetails().getGroup().getName(), print image.details.group.id.val # access groupId without loading group
print """%s%s:%s Name:"%s" (owner=%s)""" % (\ " " * indent, obj.OMERO_CLASS,\ obj.getId(),\ obj.getName(),\ obj.getOwnerOmeName()) # List all Projects available to me, and their Datasets and Images: # ================================================================= # The only_owned=True parameter limits the Projects which are returned. # If the parameter is omitted or the value is Fale, then all Projects # visible in the current group are returned. print "\nList Projects:" print "=" * 50 for project in conn.listProjects(only_owned=True): print_obj(project) for dataset in project.listChildren(): print_obj(dataset, 2) for image in dataset.listChildren(): print_obj(image, 4) # Retrieve the datasets owned by the user currently logged in: # ================================================================= # Here we create an omero.sys.ParametersI instance which we # can use to filter the results that are returned. If we did # not pass the params argument to getObjects, then all Datasets # in the current group would be returned. print "\nList Datasets:" print "=" * 50
import sys import omero from omero.gateway import BlitzGateway conn = BlitzGateway('root', 'omero-root-password', host='192.168.1.22') if not conn.connect(): sys.exit(1) projects = [] for project in conn.listProjects(): has_images = False p = {'id': project.id, 'name': project.name, 'datasets': []} for dataset in project.listChildren(): ds = {'id': dataset.id, 'name': dataset.name, 'images': []} for image in dataset.listChildren(): if image.getROICount() > 0: ds['images'].append(image.simpleMarshal()) has_images = True p['datasets'].append(ds) if has_images: projects.append(p) for p in projects: print(p) '''roi_service = conn.getRoiService() result = roi_service.findByImage(image.getId(), None) for roi in result.rois: for s in roi.copyShapes(): #prints way too much info, would be good for ragged shapes #print roi_service.getPoints(s.getId().getValue()) #print s
class OMEROConnection(object): def __init__(self, args, configs): self.args = args self.configs = configs self.connect_with = self.configs['CONNECT_WITH'] self.host = self.configs['OMERO_{}_HOST'.format(self.connect_with)] self.user = self.configs['OMERO_{}_USER'.format(self.connect_with)] self.password = self.configs['OMERO_{}_PASSWORD'.format( self.connect_with)] self.port = self.configs['OMERO_{}_PORT'.format(self.connect_with)] def __enter__(self): from omero.gateway import BlitzGateway # @UnresolvedImport self.conn = BlitzGateway(host=self.host, username=self.user, passwd=self.password, port=self.port) self.connected = self.conn.connect() # failed to connect if not self.connected: print_date( "Unable to connect to host '{}' on port {} using user '{}'". format(self.host, self.port, self.user)) print_date("Check that server is up") sys.exit(1) # keepalive self.conn.c.enableKeepAlive(5) self.omero_user = self.conn.getUser() self.userId = self.omero_user.getId() self.updateService = self.conn.getUpdateService() self.roiService = self.conn.getRoiService() return self def __exit__(self, exc_type, exc_value, traceback): # @UnusedVariable self.conn._closeSession() if self.args.verbose: print_date('Connection closed.') self.connected = False def list(self): """List images or ROIs :return int count: the number of images/ROIs """ if self.args.images: print_date("Listing images...") images = self.images() if self.args.summary: pass else: print_date("Structuring output...") image_view = ImageView(images) print(image_view) return len(images) elif self.args.rois: print_date("Listing ROIs...") rois = self.rois() if self.args.summary: pass else: print_date("Structuring output...") roi_view = ROIView(rois) print(roi_view) return len(rois) @property def projects(self): if self.args.project is not None: projects = self.conn.searchObjects(["Project"], self.args.project) return projects else: return self.conn.listProjects(self.userId) def datasets(self, project=None): """List the datasets associated with the current user :param project: a project :param bool in_project: are these datasets contained within a project? """ datasets = list() if self.args.dataset is not None: datasets += self.conn.searchObjects(["Dataset"], self.args.dataset) else: if project is not None: projects = self.conn.searchObjects(["Project"], project) for p in projects: datasets += p.listChildren() else: params = omero.sys.ParametersI() # @UndefinedVariable params.exp(self.userId) datasets += self.conn.getObjects("Dataset", params=params) return datasets def images(self, project=None, dataset=None): """The list of images associated with the current user If the image ID is specified only the required image is returned. (The project and dataset are ignored.) Otherwise: - If a project object is provided all images in all datasets in the project are returned. (The dataset is ignored.) - If a project object and dataset object are provided then only those images in the project and dataset are return. - If no project object is provided but a dataset object is provided then only those images in the dataset are returned. :param str project: OMERO project name :param str dataset: OMERO dataset name :return list images: a list of OMERO ``Image`` objects """ # assertions images = list() print_date("Retrieving images...") if self.args.image_id is not None: try: assert isinstance(self.args.image_id, int) or isinstance( self.args.image_id, long) except AssertionError: print_date("Invalid type for image ID: {}".format( type(self.args.image_id))) sys.exit(1) image = self.getImage(self.args.image_id) if image is not None: images.append(image) elif self.args.image_name is not None: images = self.conn.searchObjects(["Image"], self.args.image_name) else: if project is not None: # project specified print_date( "Searching for images in project '{}'".format(project)) # get all projects matching projects = self.conn.searchObjects(["Project"], project) # get all datasets in projects matching datasets_in_projects = dict() for p in projects: for d in p.listChildren(): datasets_in_projects[d.getName()] = d print_date("Found {} datasets in project '{}'".format( len(datasets_in_projects), project)) # dataset specified if dataset is not None: print_date( "Searching for images in dataset '{}'".format(dataset)) if dataset in datasets_in_projects.keys(): images += datasets_in_projects[dataset].listChildren() else: # dataset not specified print_date( "Searching for images in all {} datasets".format( len(datasets_in_projects))) for dataset in datasets_in_projects.keys(): images += datasets_in_projects[dataset].listChildren() else: # project not specified # dataset specified if dataset is not None: print_date( "Searching for images in dataset '{}'".format(dataset)) datasets = self.conn.searchObjects(["Dataset"], dataset) for dataset in datasets: images += dataset.listChildren() else: datasets = self.datasets() print_date( "Searching for images in all {} datasets".format( len(datasets))) for dataset in datasets: images += dataset.listChildren() print_date("Found {} image(s).".format(len(images))) return images def getImage(self, image_id): """Get the image with the image ID specified on the command line :param int image_id: command line arguments :return image: an image :rtype image: ``OMEROImage`` """ return self.conn.getObject("Image", image_id) def rois(self, project=None, dataset=None): """Get an iterator over the ROIs associated with the specified image ID :param int image_id: image ID """ rois = list() print_date("Retrieving ROIs...") if self.args.image_id is not None: return self.getROIs(self.args.image_id) else: for image in self.images(project, dataset): if image.getROICount() > 0: rois.append((image, self.getROIs(image.getId()))) roi_count = sum(map(lambda r: len(r[1]), rois)) print_date("Found {:,} ROIs in {:,} images.".format( roi_count, len(rois))) return rois def getROIs(self, image_id): result = self.roiService.findByImage(image_id, None) return result.rois def attachRois(self, omero_rois): """Attach the rois from the iterable""" non_rois = filter(lambda r: not isinstance(r, OMEROROI), omero_rois) try: assert len(non_rois) == 0 except AssertionError: print_date("Found {:,} non-ROI objects".format(len(non_rois))) return 1 for roi in omero_rois: self.saveRoi(roi) return os.EX_OK # save def saveRoi(self, roi): """Save the given ROI :param roi: an ROI object :type roi: `omero.model.Roi` """ import Ice try: self.updateService.saveObject(roi) except Ice.MemoryLimitException as e: # @UndefinedVariable print_date(str(e)) sys.exit(1) # delete def deleteRoi(self, roi_id): """ Delete the given ROI :param roi: an ROI object :type roi: `omero.model.Roi` """ from omero.callbacks import CmdCallbackI # @UnresolvedImport handle = self.conn.deleteObjects("Roi", [roi_id], deleteAnns=True, deleteChildren=True) callback = CmdCallbackI(self.conn.c, handle) while not callback.block(500): if self.args.verbose: print_date(".", newline=False, incl_date=False) time.sleep(2) callback.close(True)