def test_create_render_resource_wrong_channel(self): owner = "Forrest" project = "M247514_Rorb_1" stack = "Site3Align2_LENS_Session1" channel = "notAchannel" with pytest.raises(AssertionError): renderResource( owner, project, stack, self.baseURL, self.datatype, channel=channel, scale=self.scale, )
def test_create_render_resource(self): render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, self.datatype, scale=self.scale, ) assert render_obj.x_rng == self.x_rng assert render_obj.y_rng == self.y_rng assert render_obj.z_rng == self.z_rng assert render_obj.datatype == "uint8"
def test_create_render_resource_half_scale(self): self.scale = 0.5 render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, self.datatype, scale=self.scale, ) assert render_obj.scale == self.scale assert render_obj.x_rng == [round(x * self.scale) for x in self.x_rng] assert render_obj.y_rng == [round(x * self.scale) for x in self.y_rng] assert render_obj.z_rng == self.z_rng
def test_get_render_tile_channel_scale(self): self.setup_render_channel() self.scale = 0.125 render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, self.datatype, channel=self.channel, scale=self.scale, ) x = 4200 y = 6500 z = 24 x_width = 1024 y_width = 1024 window = [0, 5000] # GET /v1/owner/{owner}/project/{project}/stack/{stack}/z/{z}/box/{x},{y},{width},{height},{scale}/png-image tile_url = "{}owner/{}/project/{}/stack/{}/z/{}/box/{},{},{},{},{}/png-image?channels={}&minIntensity={}&maxIntensity={}".format( self.baseURL, self.owner, self.project, self.stack, z, x, y, x_width, y_width, self.scale, self.channel, window[0], window[1], ) r = requests.get(tile_url) test_img = Image.open(BytesIO(r.content)) # dim 3 is RGBA (A=alpha), for grayscale, RGB values are all the same test_data = np.asarray(test_img)[:, :, 0] # getting tile from render resource data = render_obj.get_render_tile(z, x, y, x_width, y_width, window) assert data.shape == (y_width * self.scale, x_width * self.scale) assert np.array_equal(data, test_data)
def test_create_render_resource_channel(self): # metadata: # http://render-dev-eric.neurodata.io/render-ws/v1/owner/Forrest/project/M247514_Rorb_1/stack/Site3Align2_LENS_Session1 self.setup_render_channel() render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, self.datatype, channel=self.channel, scale=self.scale, ) assert render_obj.x_rng == [-27814, 63397] assert render_obj.y_rng == [-67750, 69699] assert render_obj.z_rng == [0, 50]
def test_get_render_tile(self): x = 1024 y = 512 z = 17 x_width = 512 y_width = 1024 window = [0, 10000] # GET /v1/owner/{owner}/project/{project}/stack/{stack}/z/{z}/box/{x},{y},{width},{height},{scale}/png-image tile_url = "{}owner/{}/project/{}/stack/{}/z/{}/box/{},{},{},{},{}/png-image?minIntensity={}&maxIntensity={}".format( self.baseURL, self.owner, self.project, self.stack, z, x, y, x_width, y_width, self.scale, window[0], window[1], ) r = requests.get(tile_url) test_img = Image.open(BytesIO(r.content)) # dim 3 is RGBA (A=alpha), for grayscale, RGB values are all the same test_data = np.asarray(test_img)[:, :, 0] render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, self.datatype, scale=self.scale, ) data = render_obj.get_render_tile(z, x, y, x_width, y_width, window) assert data.shape == (y_width, x_width) assert np.array_equal(data, test_data)
def test_get_render_tile_no_window_uint16(self): x = 50 y = 512 z = 17 x_width = 512 y_width = 1024 datatype = "uint16" # GET /v1/owner/{owner}/project/{project}/stack/{stack}/z/{z}/box/{x},{y},{width},{height},{scale}/tiff16-image tile_url = "{}owner/{}/project/{}/stack/{}/z/{}/box/{},{},{},{},{}/tiff16-image".format( self.baseURL, self.owner, self.project, self.stack, z, x, y, x_width, y_width, self.scale, ) print(tile_url) r = requests.get(tile_url) test_img = Image.open(BytesIO(r.content)) # dim 3 is RGBA (A=alpha), for grayscale, RGB values are all the same test_data = np.asarray(test_img) render_obj = renderResource( self.owner, self.project, self.stack, self.baseURL, datatype, scale=self.scale, ) data = render_obj.get_render_tile(z, x, y, x_width, y_width) assert data.shape == (y_width, x_width) assert np.array_equal(data, test_data)
def __init__(self, args_namespace): # args is a Namespace (argparse) # convert to dict in order to use the get method (returns None if not present in dict) args = vars(args_namespace) self.datasource = args.get('datasource') self.slack_usr = args.get('slack_usr') self.s3_bucket_name = args.get('s3_bucket_name') self.create_resources = args.get('create_resources') self.coll_name = args.get('collection') self.exp_name = args.get('experiment') self.ch_name = args.get('channel') self.datatype = args.get('datatype') self.warn_missing_files = args.get('warn_missing_files') self.z_range = args.get('z_range') self.limit_x = args.get('limit_x') self.limit_y = args.get('limit_y') self.limit_z = args.get('limit_z') self.voxel_size = args.get('voxel_size') self.voxel_unit = args.get('voxel_unit') self.res = args.get('res') self.source_channel = args.get('source_channel') if self.source_channel is not None: self.boss_datatype = 'uint64' # force boss datatype to uint64 for annotations self.ch_type = 'annotation' else: # image channels don't have a source try: assert self.datatype == 'uint8' or self.datatype == 'uint16' or self.datatype is None except AssertionError: raise ValueError( 'image channels in the BOSS only support uint8 or uint16') self.boss_datatype = self.datatype self.ch_type = 'image' if self.datasource == 'render': # create a render resource which will populate some of the variables render_owner = args.get('render_owner') render_project = args.get('render_project') render_stack = args.get('render_stack') render_channel = args.get('render_channel') render_baseURL = args.get('render_baseURL') render_scale = args.get('render_scale') self.render_window = args.get('render_window') # create the render object in order to get the xyz extents self.render_obj = renderResource(render_owner, render_project, render_stack, render_baseURL, self.datatype, channel=render_channel, scale=render_scale, limit_x=self.limit_x, limit_y=self.limit_y, limit_z=self.limit_z) self.x_extent = self.render_obj.x_rng self.y_extent = self.render_obj.y_rng self.z_extent = self.render_obj.z_rng self.z_step = 1 # render resource is set to return PNGs self.extension = 'png' if self.z_range is None: # if the user isn't specifying the z range for ingest, we just get the entire extent self.z_range = self.z_extent # otherwise it's image data elif self.datasource == 's3' or self.datasource == 'local': self.base_fname = args.get('base_filename') self.base_path = args.get('base_path') self.extension = args.get('extension') self.x_extent = args.get('x_extent') self.y_extent = args.get('y_extent') self.z_extent = args.get('z_extent') self.validate_xyz_limits() self.apply_limits() self.z_step = args.get('z_step') # initialize offset to zero (x,y,z) self.offsets = [0, 0, 0] self.forced_offsets = args.get('forced_offsets') # if user specified, we calculate the offset if args.get('offset_extents') or self.forced_offsets is not None: # calculate and store offsets self.offsets = self.calc_offsets() # create new extents self.offset_extents() self.set_img_size() self.coord_frame_x_extent = args.get('coord_frame_x_extent') self.coord_frame_y_extent = args.get('coord_frame_y_extent') self.coord_frame_z_extent = args.get('coord_frame_z_extent') self.set_coord_frame_extents() self.get_extents = args.get('get_extents') self.validate_coord_frames() # creating the slack session self.slack_obj = self.create_slack_session( args.get('slack_token_file')) if self.datasource == 's3': self.s3_res = self.create_s3_res( aws_profile=args.get('aws_profile')) else: self.s3_res = None self.boss_config_file = args.get('boss_config_file') self.num_READ_failures = 0 self.num_POST_failures = 0 # Document the arguments passed self.send_msg('{} Command parameters used: {}'.format( get_formatted_datetime(), args))
def test_wrong_stack(self): owner = "6_ribbon_experiments" project = "M321160_Ai139_smallvol" stack = "DOES_NOT_EXIST" with pytest.raises(ConnectionError): renderResource(owner, project, stack, self.baseURL, self.datatype)