#!/usr/bin/env python
from functools import partial
import renderapi
from six.moves import urllib
from asap.module.render_module import StackTransitionModule
from asap.dataimport.schemas import (
AddMipMapsToStackParameters, AddMipMapsToStackOutput)
from asap.utilities import uri_utils
if __name__ == "__main__" and __package__ is None:
__package__ = "asap.dataimport.apply_mipmaps_to_render"
example = {
"render": {
"host": "em-131fs",
"port": 8998,
"owner": "gayathri",
"project": "MM2",
"client_scripts": "/allen/programs/celltypes/workgroups/em-connectomics/gayathrim/nc-em2/Janelia_Pipeline/render_20170613/render-ws-java-client/src/main/scripts"
},
"input_stack": "mm2_acquire_8bit",
"output_stack": "mm2_mipmap_test",
"mipmap_dir": "/net/aidc-isi1-prd/scratch/aibs/scratch",
"imgformat": "tif",
"levels": 6,
"zstart": 1015,
"zend": 1015
}
[docs]def addMipMapsToRender(
render, input_stack, mipmap_prefix, imgformat, levels, z):
resolvedtiles = render.run(
renderapi.resolvedtiles.get_resolved_tiles_from_z,
input_stack, z)
for ts in resolvedtiles.tilespecs:
mm1 = ts.ip[0]
oldUrl = mm1.imageUrl
filepath = urllib.parse.urlparse(oldUrl).path
# assumes that the mipmaps are stored in the way
# generated by the render's mipmap client which adds the
# file extension in addition to the existing file extension
# from mipmap level 0
if imgformat == "png":
imgf = ".png"
elif imgformat == "jpg":
imgf = ".jpg"
else:
imgf = ".tif"
for i in range(1, levels + 1):
scUrl = uri_utils.uri_join(
mipmap_prefix, str(i), "{}{}".format(
filepath.lstrip('/'), imgf))
mm1 = renderapi.image_pyramid.MipMap(imageUrl=scUrl)
ts.ip[i] = mm1
return resolvedtiles
[docs]class AddMipMapsToStack(StackTransitionModule):
default_schema = AddMipMapsToStackParameters
default_output_schema = AddMipMapsToStackOutput
[docs] def run(self):
self.logger.debug('Applying mipmaps to stack')
zvalues = self.get_overlapping_inputstack_zvalues()
if len(zvalues) == 0:
self.logger.error('No sections found for stack {}'.format(
self.args['input_stack']))
self.logger.debug("{}".format(zvalues))
mypartial = partial(
addMipMapsToRender, self.render, self.args['input_stack'],
self.args['mipmap_prefix'], self.args['imgformat'],
self.args['levels'])
with renderapi.client.WithPool(self.args['pool_size']) as pool:
allresolved = pool.map(mypartial, zvalues)
tilespecs = [ts for ts_l in (
resolvedtiles.tilespecs for resolvedtiles in allresolved)
for ts in ts_l]
identified_tforms = list({tform.transformId: tform for tform in (
tf for tf_l in (
resolvedtiles.transforms for resolvedtiles in allresolved)
for tf in tf_l)}.values())
output_stack = (self.args['input_stack'] if
self.args['output_stack'] is None
else self.args['output_stack'])
self.output_tilespecs_to_stack(tilespecs, output_stack,
sharedTransforms=identified_tforms)
missing_ts_zs = []
for z in zvalues:
job_success = self.validate_tilespecs(
self.args['input_stack'], self.args['output_stack'], z)
if not job_success:
missing_ts_zs.append(z)
self.output(
{
"output_stack": output_stack,
"missing_tilespecs_zs": missing_ts_zs
})
if __name__ == "__main__":
mod = AddMipMapsToStack()
mod.run()