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)
Exemple #8
0
    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)