Skip to content

Commit

Permalink
pushing plate acquisition wrapper to omero.gateway, refactoring getNu…
Browse files Browse the repository at this point in the history
…mberOfFields, close #7111
  • Loading branch information
atarkowska committed Oct 29, 2011
1 parent ec83e9e commit 3653406
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 110 deletions.
93 changes: 67 additions & 26 deletions components/tools/OmeroPy/src/omero/gateway/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,7 @@ def __getattr__ (self, attr):
@return: The named attribute.
@rtype: method, value (string, long etc)
"""

# handle lookup of 'get' methods, using '_attrs' dict to define how we wrap returned objects.
if attr != 'get' and attr.startswith('get') and hasattr(self, '_attrs'):
tattr = attr[3].lower() + attr[4:] # 'getName' -> 'name'
Expand Down Expand Up @@ -4085,18 +4085,6 @@ def __bstrap__ (self):
self.CHILD_WRAPPER_CLASS = 'PlateWrapper'
self.PARENT_WRAPPER_CLASS = None

@timeit
def getNumberOfFields (self):
"""
Iterates all wells on all plates for this screen and returns highest well sample count
"""
q = self._conn.getQueryService()
query = "select p.id, maxindex(p.wells.wellSamples)+1"
query += " from ScreenPlateLink spl join spl.parent s join spl.child p"
query += " where s.id=%d group by p.id" % self.getId()
return dict(unwrap(q.projection(query, None)))


ScreenWrapper = _ScreenWrapper

def _letterGridLabel (i):
Expand Down Expand Up @@ -4130,6 +4118,52 @@ def __reset__ (self):
self._childcache = None
self._gridSize = None

def _loadPlateAcquisitions(self):
p = omero.sys.Parameters()
p.map = {}
p.map["pid"] = self._obj.id
sql = "select pa from PlateAcquisition as pa join fetch pa.plate as p where p.id=:pid"
self._obj._plateAcquisitionsSeq = self._conn.getQueryService().findAllByQuery(sql, p)
self._obj._plateAcquisitionsLoaded = True

def countPlateAcquisitions(self):
if self._obj.sizeOfPlateAcquisitions() < 0:
self._loadPlateAcquisitions()
return self._obj.sizeOfPlateAcquisitions()

def listPlateAcquisitions(self):
if not self._obj._plateAcquisitionsLoaded:
self._loadPlateAcquisitions()
for pa in self._obj.copyPlateAcquisitions():
yield PlateAcquisitionWrapper(self._conn, pa)

@timeit
def getNumberOfFields (self, pid=None):
"""
Returns tuple of min and max of indexed collection of well samples
per plate acquisition if exists
"""

q = self._conn.getQueryService()
sql = "select minIndex(ws), maxIndex(ws) from Well w " \
"join w.wellSamples ws where w.plate.id=:oid"

p = omero.sys.Parameters()
p.map = {}
p.map["oid"] = self._obj.id
if pid is not None:
sql += " and ws.plateAcquisition.id=:pid"
p.map["pid"] = rlong(pid)

fields = None
try:
res = [r for r in unwrap(q.projection(sql, p))[0] if r != None]
if len(res) == 2:
fields = tuple(res)
except:
pass
return fields

def _listChildren (self, **kwargs):
"""
Lists Wells in this plate, not sorted. Saves wells to _childcache map, where key is (row, column).
Expand Down Expand Up @@ -4218,18 +4252,7 @@ def getRowLabels (self):
else:
# this should simply be precalculated!
return [_letterGridLabel(x) for x in range(self.getGridSize()['rows'])]

@timeit
def getNumberOfFields (self):
"""
Iterates all wells on plate and returns highest well sample count
"""
q = self._conn.getQueryService()
query = "select maxindex(p.wells.wellSamples)+1"
query += " from Plate p"
query += " where p.id=%d group by p.id" % self.getId()
return unwrap(q.projection(query, None))[0][0]


# if self._childcache is None:
# q = self._conn.getQueryService()
# params = omero.sys.Parameters()
Expand Down Expand Up @@ -4264,9 +4287,26 @@ def _getQueryString(self):
"left outer join fetch spl.parent sc"
return query


PlateWrapper = _PlateWrapper

class _PlateAcquisitionWrapper (BlitzObjectWrapper):

def __bstrap__ (self):
self.OMERO_CLASS = 'PlateAcquisition'

def getName (self):
name = super(_PlateAcquisitionWrapper, self).getName()
if name is None:
if self.startTime is not None and self.endTime is not None:
name = "%s - %s" % (datetime.fromtimestamp(self.startTime/1000), datetime.fromtimestamp(self.endTime/1000))
else:
name = "Plate %i" % self.id
return name
name = property(getName)


PlateAcquisitionWrapper = _PlateAcquisitionWrapper

class _WellWrapper (BlitzObjectWrapper):
"""
omero_model_WellI class wrapper extends BlitzObjectWrapper.
Expand Down Expand Up @@ -7247,6 +7287,7 @@ def refreshWrappers ():
"image":ImageWrapper,
"screen":ScreenWrapper,
"plate":PlateWrapper,
"plateacquisition": PlateAcquisitionWrapper,
"well":WellWrapper,
"experimenter":ExperimenterWrapper,
"experimentergroup":ExperimenterGroupWrapper,
Expand Down
7 changes: 3 additions & 4 deletions components/tools/OmeroWeb/omeroweb/webclient/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ def load_data(request, o1_type=None, o1_id=None, o2_type=None, o2_id=None, o3_ty
else:
template = "webclient/data/container_subtree.html"
elif kw.has_key('plate'):
fields = manager.plate.getFields(kw.get('acquisition', None))
fields = manager.plate.getNumberOfFields(kw.get('acquisition', None))
if fields is not None:
form_well_index = WellIndexForm(initial={'index':index, 'range':fields})
if index == 0:
Expand Down Expand Up @@ -2906,16 +2906,15 @@ def plateGrid_json (request, pid, field=0, server_id=None, _conn=None, **kwargs)
""" This view is responsible for showing well data within plate """

conn = None
kwargs['viewport_server'] = '/webclient'
try:
conn = kwargs["conn"]
except:
logger.error(traceback.format_exc())
return handlerInternalError("Connection is not available. Please contact your administrator.")

if conn is None:
raise Exception("Connection not available")

return webgateway_views.plateGrid_json(request, pid, field=field, server_id=None, _conn=None, **kwargs)

@isUserConnected
Expand Down
83 changes: 3 additions & 80 deletions components/tools/OmeroWeb/omeroweb/webclient/webclient_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -1799,51 +1799,6 @@ def __prepare__ (self, **kwargs):
self.annotation_counter = kwargs['annotation_counter']
if kwargs.has_key('link'):
self.link = kwargs.has_key('link') and kwargs['link'] or None

def _loadPlateAcquisitions(self):
p = omero.sys.Parameters()
p.map = {}
p.map["pid"] = self._obj.id
sql = "select pa from PlateAcquisition as pa join fetch pa.plate as p where p.id=:pid"
self._obj._plateAcquisitionsSeq = self._conn.getQueryService().findAllByQuery(sql, p)
self._obj._plateAcquisitionsLoaded = True

def countPlateAcquisitions(self):
if self._obj.sizeOfPlateAcquisitions() < 0:
self._loadPlateAcquisitions()
return self._obj.sizeOfPlateAcquisitions()

def listPlateAcquisitions(self):
if not self._obj._plateAcquisitionsLoaded:
self._loadPlateAcquisitions()
for pa in self._obj.copyPlateAcquisitions():
yield PlateAcquisitionWrapper(self._conn, pa)

def getFields (self, pid=None):
"""
Returns tuple of min and max of indexed collection of well samples
per plate acquisition if exists
"""

q = self._conn.getQueryService()
sql = "select minIndex(ws), maxIndex(ws) from Well w " \
"join w.wellSamples ws where w.plate.id=:oid"

p = omero.sys.Parameters()
p.map = {}
p.map["oid"] = self._obj.id
if pid is not None:
sql += " and ws.plateAcquisition.id=:pid"
p.map["pid"] = rlong(pid)

fields = None
try:
res = [r for r in unwrap(q.projection(sql, p))[0] if r != None]
if len(res) == 2:
fields = tuple(res)
except:
pass
return fields

omero.gateway.PlateWrapper = PlateWrapper

Expand All @@ -1864,7 +1819,7 @@ def __prepare__ (self, **kwargs):

omero.gateway.WellWrapper = WellWrapper

class PlateAcquisitionWrapper (OmeroWebObjectWrapper, omero.gateway.BlitzObjectWrapper):
class PlateAcquisitionWrapper (OmeroWebObjectWrapper, omero.gateway.PlateAcquisitionWrapper):

"""
omero_model_PlateI class wrapper overwrite omero.gateway.PlateWrapper
Expand All @@ -1873,42 +1828,12 @@ class PlateAcquisitionWrapper (OmeroWebObjectWrapper, omero.gateway.BlitzObjectW

annotation_counter = None

def __bstrap__ (self):
self.OMERO_CLASS = 'PlateAcquisition'

def __prepare__ (self, **kwargs):
super(PlateAcquisitionWrapper, self).__prepare__(**kwargs)
if kwargs.has_key('annotation_counter'):
self.annotation_counter = kwargs['annotation_counter']

def getName (self):
name = super(PlateAcquisitionWrapper, self).getName()
if name is None:
if self.startTime is not None and self.endTime is not None:
name = "%s - %s" % (datetime.fromtimestamp(self.startTime/1000), datetime.fromtimestamp(self.endTime/1000))
else:
name = "Plate %i" % self.id
return name
name = property(getName)

def getFields (self):
"""
Returns max of indexed collection of well samples
"""

p = omero.sys.Parameters()
p.map = {}
p.map["oid"] = self._obj.id

q = self._conn.getQueryService()
sql = "select maxIndex(pa.wellSamples)+1 from PlateAcquisition as pa "\
"where pa.id=:oid"
try:
index = unwrap(q.projection(sql, p))[0][0]
except:
index = -1
return index

omero.gateway.PlateAcquisitionWrapper = PlateAcquisitionWrapper

class ScreenWrapper (OmeroWebObjectWrapper, omero.gateway.ScreenWrapper):
"""
Expand Down Expand Up @@ -2031,6 +1956,4 @@ def getOwner(self):

return omero.gateway.ExperimenterWrapper(self, self.owner)

# IMPORTANT to update the map of wrappers 'project', 'dataset', 'image' etc. returned by getObjects()
omero.gateway.refreshWrappers()
omero.gateway.KNOWN_WRAPPERS.update({"plateacquisition":PlateAcquisitionWrapper})
omero.gateway.refreshWrappers()

0 comments on commit 3653406

Please sign in to comment.