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
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()
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)
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)
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