Source code for asap.stack.consolidate_transforms

#!/usr/bin/env python
from functools import partial
import logging

import numpy as np
import renderapi
from renderapi.transform import (
    AffineModel, ReferenceTransform, Polynomial2DTransform, TransformList)

from asap.stack.schemas import (
    ConsolidateTransformsOutputParameters, ConsolidateTransformsParameters)
from asap.module.render_module import (
    RenderModule, RenderModuleException)

example_json = {
    "render": {
        "host": "http://ibs-forrestc-ux1",
        "port": 80,
        "owner": "Forrest",
        "project": "M247514_Rorb_1",
        "client_scripts": "/pipeline/render/render-ws-java-client/src/main/scripts"
    },
    "stack": "ROUGHALIGN_LENS_DAPI_1_deconvnew",
    "output_stack": "ROUGHALIGN_LENS_DAPI_1_deconvnew_CONS",
    "transforms_slice": ":",
    "pool_size": 10,
    "close_stack": True
}


[docs]def flatten_tforms(tforms): flat_tforms = [] for tf in tforms: if isinstance(tf, TransformList): flat_tforms += flatten_tforms(tf.tforms) else: flat_tforms.append(tf) return flat_tforms
[docs]def dereference_tforms(tforms, ref_tforms): deref_tforms = [] for tf in tforms: if isinstance(tf, ReferenceTransform): try: mtf = next( mt for mt in ref_tforms if mt.transformId == tf.refId) deref_tforms.append(mtf) except StopIteration: raise RenderModuleException( ("reference transform: {} not found in provided " "reference transforms {}".format(tf.refId, ref_tforms))) else: deref_tforms.append(tf) return deref_tforms
[docs]def flatten_and_dereference_tforms(tforms, ref_tforms): flat_tforms = flatten_tforms(tforms) deref_tforms = dereference_tforms(flat_tforms, ref_tforms) deref_tforms = flatten_tforms(deref_tforms) return deref_tforms
[docs]def consolidate_transforms(tforms, ref_tforms=[], logger=logging.getLogger(), makePolyDegree=0, keep_ref_tforms=False): # first flatten and dereference this transform list tforms = (flatten_and_dereference_tforms(tforms, ref_tforms) if not keep_ref_tforms else flatten_tforms(tforms)) tform_total = AffineModel() total_affines = 0 new_tform_list = [] for i, tform in enumerate(tforms): try: isaffine = 'AffineModel2D' in tform.className except AttributeError: isaffine = False if isaffine: total_affines += 1 tform_total = tform.concatenate(tform_total) else: logger.debug('consolidate_transforms: non affine {}'.format(tform)) if total_affines > 0: if makePolyDegree > 0: polyTform = Polynomial2DTransform().fromAffine(tform_total) polyTform = polyTform.asorder(makePolyDegree) new_tform_list.append(polyTform) else: new_tform_list.append(tform_total) tform_total = AffineModel() total_affines = 0 new_tform_list.append(tform) if total_affines > 0: if makePolyDegree > 0: polyTform = Polynomial2DTransform().fromAffine(tform_total) polyTform = polyTform.asorder(makePolyDegree) new_tform_list.append(polyTform) else: new_tform_list.append(tform_total) return new_tform_list
[docs]def process_z(render, stack, outstack, transform_slice, z): resolved_tiles = renderapi.resolvedtiles.get_resolved_tiles_from_z( stack, z, render=render) for ts in resolved_tiles.tilespecs: ts.tforms[transform_slice] = consolidate_transforms( ts.tforms[transform_slice], resolved_tiles.transforms) renderapi.client.import_tilespecs(outstack, resolved_tiles.tilespecs, resolved_tiles.transforms, render=render) return resolved_tiles
[docs]class ConsolidateTransforms(RenderModule): default_schema = ConsolidateTransformsParameters default_output_schema = ConsolidateTransformsOutputParameters
[docs] def run(self): stack = self.args['stack'] outstack = self.args.get('output_stack', None) if outstack is None: outstack = stack + self.args['postfix'] # get z values in z value range specified or dynamically # choose zvalues = np.array(self.render.run( renderapi.stack.get_z_values_for_stack, stack)) minZ = self.args.get('minZ', np.min(zvalues)) maxZ = self.args.get('maxZ', np.max(zvalues)) zvalues = zvalues[zvalues >= minZ] zvalues = zvalues[zvalues <= maxZ] self.render.run(renderapi.stack.create_stack, outstack) if self.args['overwrite_zlayer']: for z in zvalues: try: renderapi.stack.delete_section( outstack, z, render=self.render) except renderapi.errors.RenderError as e: self.logger.error(e) with renderapi.client.WithPool(self.args['pool_size']) as pool: mypartial = partial( process_z, self.render, stack, outstack, self.args['transforms_slice']) resolved_tiles_list = pool.map(mypartial, zvalues) if self.args['close_stack']: renderapi.stack.set_stack_state( outstack, 'COMPLETE', render=self.render) output_d = { "output_stack": outstack, "numZ": len(zvalues) } self.output(output_d)
if __name__ == "__main__": mod = ConsolidateTransforms() mod.run()