Example #1
0
    def _create_images_result(self, *, interface):
        base_dir = Path(
            safe_join(self._output_directory, interface.relative_path))
        output_files = [f for f in base_dir.glob("*") if f.is_file()]

        if not output_files:
            raise ComponentException(f"{interface.relative_path} is empty")

        importer_result = import_images(
            input_directory=base_dir,
            builders=[image_builder_mhd, image_builder_tiff],
            recurse_subdirectories=False,
        )

        if len(importer_result.new_images) == 0:
            raise ComponentException(
                f"No images imported from {interface.relative_path}")
        elif len(importer_result.new_images) > 1:
            raise ComponentException(
                f"Only 1 image should be produced in {interface.relative_path}, "
                f"we found {len(importer_result.new_images)}")

        try:
            civ = interface.create_instance(
                image=next(iter(importer_result.new_images)))
        except ValidationError:
            raise ComponentException(
                f"The image produced in {interface.relative_path} is not valid"
            )

        return civ
Example #2
0
    def _copy_output_files(self, *, container, base_dir: Path):
        output_files = {
            base_dir / Path(f)
            for f in container.exec_run(f"find {base_dir} -type f")
            .output.decode()
            .splitlines()
        }

        if not output_files:
            raise ValueError("Output directory is empty")

        job = SubmissionToAnnotationSetJob.objects.get(pk=self._job_id)
        annotationset = AnnotationSet.objects.create(
            creator=job.submission.creator,
            base=job.base,
            submission=job.submission,
            kind=AnnotationSet.PREDICTION,
        )

        if self.__was_unzipped:
            with TemporaryDirectory() as tmpdir:
                input_files = set()

                for file in output_files:
                    tmpfile = Path(
                        safe_join(tmpdir, file.relative_to(base_dir))
                    )
                    tmpfile.parent.mkdir(parents=True, exist_ok=True)

                    with open(tmpfile, "wb") as outfile:
                        infile = get_file(container=container, src=file)
                        buffer = True
                        while buffer:
                            buffer = infile.read(1024)
                            outfile.write(buffer)

                    input_files.add(tmpfile)

                importer_result = import_images(files=input_files,)

            annotationset.images.add(*importer_result.new_images)

        else:
            if not len(output_files) == 1:
                raise RuntimeError("This submission has too many files.")

            f = get_file(container=container, src=output_files.pop())
            annotationset.labels = process_csv_file(f)
            annotationset.save()
Example #3
0
    def _copy_output_files(self, *, container, base_dir: Path):
        found_files = container.exec_run(f"find {base_dir} -type f")

        if found_files.exit_code != 0:
            logger.warning(f"Error listing {base_dir}")
            return

        output_files = [
            base_dir / Path(f)
            for f in found_files.output.decode().splitlines()
        ]

        if not output_files:
            logger.warning("Output directory is empty")
            return

        with TemporaryDirectory() as tmpdir:
            input_files = set()

            for file in output_files:
                tmpfile = Path(safe_join(tmpdir, file.relative_to(base_dir)))
                tmpfile.parent.mkdir(parents=True, exist_ok=True)

                with open(tmpfile, "wb") as outfile:
                    infile = get_file(container=container, src=file)
                    buffer = True
                    while buffer:
                        buffer = infile.read(1024)
                        outfile.write(buffer)

                input_files.add(tmpfile)

            importer_result = import_images(
                files=input_files,
                builders=[image_builder_mhd, image_builder_tiff],
            )

        default_output_interface = ComponentInterface.objects.get(
            slug=DEFAULT_OUTPUT_INTERFACE_SLUG
        )
        job = Job.objects.get(pk=self._job_id)

        for image in importer_result.new_images:
            civ = ComponentInterfaceValue.objects.create(
                interface=default_output_interface, image=image
            )
            job.outputs.add(civ)
Example #4
0
    def _create_images_result(self, *, reader, job):
        # TODO JM in the future this will be a file, not a directory
        base_dir = Path(self.output_path)
        found_files = reader.exec_run(f"find {base_dir} -type f")

        if found_files.exit_code != 0:
            logger.warning(f"Error listing {base_dir}")
            return

        output_files = [
            base_dir / Path(f)
            for f in found_files.output.decode().splitlines()
        ]

        if not output_files:
            logger.warning("Output directory is empty")
            return

        with TemporaryDirectory() as tmpdir:
            input_files = set()
            for file in output_files:
                temp_file = Path(safe_join(tmpdir, file.relative_to(base_dir)))
                temp_file.parent.mkdir(parents=True, exist_ok=True)

                with open(temp_file, "wb") as outfile:
                    infile = get_file(container=reader, src=file)

                    buffer = True
                    while buffer:
                        buffer = infile.read(1024)
                        outfile.write(buffer)

                input_files.add(temp_file)

            importer_result = import_images(
                files=input_files,
                builders=[image_builder_mhd, image_builder_tiff],
            )

        for image in importer_result.new_images:
            civ = ComponentInterfaceValue.objects.create(
                interface=self, image=image
            )
            job.outputs.add(civ)
Example #5
0
    def _create_images_result(self, *, interface, reader):
        base_dir = Path(safe_join("/output/", interface.relative_path))
        found_files = reader.exec_run(f"find {base_dir} -type f")

        if found_files.exit_code != 0:
            raise ComponentException(f"Error listing {base_dir}")

        output_files = [
            base_dir / Path(f)
            for f in found_files.output.decode().splitlines()
        ]

        if not output_files:
            raise ComponentException(f"{base_dir} is empty")

        with TemporaryDirectory() as tmpdir:
            for file in output_files:
                temp_file = Path(safe_join(tmpdir, file.relative_to(base_dir)))
                temp_file.parent.mkdir(parents=True, exist_ok=True)
                get_file(container=reader, src=file, dest=temp_file)

            importer_result = import_images(
                input_directory=tmpdir,
                builders=[image_builder_mhd, image_builder_tiff],
            )

        if len(importer_result.new_images) == 0:
            raise ComponentException(f"No images imported from {base_dir}")
        elif len(importer_result.new_images) > 1:
            raise ComponentException(
                f"Only 1 image should be produced in {base_dir}, "
                f"we found {len(importer_result.new_images)}")

        try:
            civ = interface.create_instance(
                image=next(iter(importer_result.new_images)))
        except ValidationError:
            raise ComponentException(
                f"The image produced in {base_dir} is not valid")

        return civ